Модераторы: 2man

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Библиотека скриптов, Делимся своими, обсуждаем чужие. Учимся. 
:(
    Опции темы
IZ@TOP
Дата 5.3.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 3
Всего: 73



Меня посетила интересная идея, многие наверное пишут небольшие библиотечки для себя, кого-то еще. Предлагаю в данной теме делиться тем что у нас есть и обсуждать какие-то недоделки замеченные в чужих скриптах. Давать советы по оптимизации.
Может быть даже напишем пару библиотек совместно, если конечно идеи будут.

Вот для начала мой скриптик класса для работы с MySQL:

Код

<?php
/* ---------------------------------------------------------------------------------
// Драйвер для работы с базой данных MySQL.
// Версия 1.1.4
--------------------------------------------------------------------------------- */

class db {

    /* ---------------------------------------------------------------------------------
    // Переменные
    --------------------------------------------------------------------------------- */

    var $connInfo      = array();    // private array @connInfo

    var $connSource      = null;  // public resource @connSource
    var $querySource  = null;  // private resource @querySource
    
    var $lastQuery      = '';  // public string @lastQuery
    var $lastAction      = '';  // public string @lastAction
    var $lastResult      = array();    // public array @lastResult
    var $lastRow      = array();    // public array @lastRow
    
    var $numRows      = 0;  // public int @NumRows
    var $numFields      = 0;  // public int @NumFields
    var $affectedRows  = 0;  // public int @AffectedRows

    var $queryParams  = array();    // private array @executeParams
    
    /* ---------------------------------------------------------------------------------
    // private constructor db (
    //  [string connString]
    // )
    --------------------------------------------------------------------------------- */
    function db($connString = '') {
  if(!empty($connString))
      $this->setConnect($connString);
    }

    /* ---------------------------------------------------------------------------------
    // public source setConnect (
    //  string connString
    // )
    --------------------------------------------------------------------------------- */
    function setConnect($connString) {
  
  if(!preg_match("%^([^,]*?)\s?,\s?([^,\s]*?)\s?,\s?([^,]*?)\s?,\s?([^,]*?)\s?,\s?([0-1]*?)$%", $connString, $Params)) {
      $this->setError(false, 'Передан неверный параметр для соеднинения с базой данных.');
  }
  
  $this->connInfo    = array(
      'connHost'  => $Params[1],
      'connUser'  => $Params[2],
      'connPswd'  => $Params[3],
      'connBase'  => $Params[4],
      'Persistent'    => ((empty($Params[5])) ? 0 : $Params[5]),
  );
  
  $this->connSource    = (1 == (int) $this->connInfo['Persistent']) ? 
      @mysql_pconnect($this->connInfo['connHost'], $this->connInfo['connUser'], $this->connInfo['connPswd']) : 
      @mysql_connect($this->connInfo['connHost'], $this->connInfo['connUser'], $this->connInfo['connPswd']);

  if(!is_resource($this->connSource))
      $this->setError(false);

  if($this->connInfo['connBase'] != '') {
      if(!@mysql_select_db($this->connInfo['connBase'], $this->connSource))
    return $this->setError();
  }
  
  return $this->connSource;
    }
    
    /* ---------------------------------------------------------------------------------
    // public selectBase ( string baseName )
    // Фнцкия выполняет соединения с базой данных переданной в аргументе
    --------------------------------------------------------------------------------- */
    function selectBase($baseName) {
  if(!mysql_select_db($baseName, $this->connSource))
      $this->setError();
    }
    
    /* ---------------------------------------------------------------------------------
    // public mixed sendQuery ( string query, mixed var ...)
    // Фунцкия выполняет передачу запроса к базе данных принимая в первом аргументе
    // строку шаблона SQL запроса, и переменные которые необходимо подставить
    // в шаблон в форматированном виде.
    // ----
    // Переменные подставляются в соответствии с указаниями последовательного номера
    // переменной, ее типа (если это тип с плавующей точкой, передается число после
    // точки), ее длинны.
    // ----
    // Формат подстановок:
    //      ${paramNumber type [dopOpt1[.dopOpt2]]}
    --------------------------------------------------------------------------------- */
    function sendQuery() {
  $this->queryParams    = func_get_args();

  if(!$this->lastQuery = array_shift($this->queryParams))
      return false;
      
  if(sizeof($this->queryParams) > 0) {
      $this->queryParams    = array_values($this->queryParams);

      $this->lastQuery    = preg_replace("|\\$\{([0-9]{1,2})\s*([0-9a-zA-Z]*)\s*?([0-9a-zA-Z,\.]*?)\}|ie", 
    "\$this->assemblyQueryParams(\"\\1\", \"\\2\", \"\\3\")", $this->lastQuery);
      $this->queryParams    = array();
  }
  
  $this->lastAction    = strtolower(substr($this->lastQuery, 0, strpos($this->lastQuery, ' ')));
  
  if(!$this->querySource    = @mysql_query($this->lastQuery, $this->connSource))
      return $this->setError();
  
  switch($this->lastAction) {
      case 'insert':
    $this->lastInsertID    = mysql_insert_id($this->connSource);
      case 'update':
      case 'delete': {
    $this->affectedRows    = mysql_affected_rows($this->connSource);
    return $this->affectedRows;
    break;
      }
      case 'select': {
    $this->numFields    = mysql_num_fields($this->querySource);
    $this->numRows  = mysql_num_rows($this->querySource);
    return $this->numRows;
    break;
      }
  }
  return true;
    }
    
    /* ---------------------------------------------------------------------------------
    // public array nextRow ( [int rowMode] )
    // Функция возвращает записи по очереди после запроса на выборку
    --------------------------------------------------------------------------------- */    
    function nextRow($rowMode = null) {
  $this->lastRow    = @mysql_fetch_array($this->querySource, ((isset($rowMode)) ? $rowMode : MYSQL_ASSOC));
  return $this->lastRow;
    }
    
    function getOne($srcRow = false) {
  return @mysql_result($this->querySource, (($srcRow != false) ? $srcRow : 0));
    }
    
    /* ---------------------------------------------------------------------------------
    // public int getInsertID ( [int rowMode] )
    // Функция возвращает все записи после запроса на выборку
    --------------------------------------------------------------------------------- */
    function getResult($rowMode = null) {
  $this->lastResult    = array();
  $rowMode    = (isset($rowMode)) ? $rowMode : MYSQL_ASSOC;
  while($Row = @mysql_fetch_array($this->querySource, $rowMode)) {
      $this->lastRow  = $Row;
      $this->lastResult[]    = $this->lastRow;
  }
  return $this->lastResult;
    }

    /* ---------------------------------------------------------------------------------
    // public int getInsertID ()
    // Функция возвращает автоинкрементный номер последней вставленной записи
    --------------------------------------------------------------------------------- */    
    function getInsertID() {
  return $this->lastInsertID;
    }
    
    /* ---------------------------------------------------------------------------------
    // private void assemblyQueryParams ( int num, string target, string length )
    // Приватная функция используемая при подстановке переменных в шаблоне SQL запроса
    --------------------------------------------------------------------------------- */
    function assemblyQueryParams($num, $target, $length) {
  
  if(!isset($this->queryParams[$num])) return "''";
    
  switch($target) {
      case 'i': {
    if(empty($this->queryParams[$num]))
        return 'NULL';

    if(!empty($length))
        $this->queryParams[$num] = substr($this->queryParams[$num], 0, $length);

    return intval($this->queryParams[$num]);
      }
      case 'f':
      case 'd': {
    if(empty($this->queryParams[$num]))
        return 'NULL';
        
    $options    = explode(',', $length);
    $precision    = (isset($options[1])) ? $options[1] : 30;

    if(!empty($length))
        $this->queryParams[$num] = substr($this->queryParams[$num], 0, $length);

    return (float) round($this->queryParams[$num], $precision);
      }
      case 'implode': {
    $options    = explode(',', $length);
    
    return " {$options[0]} = '".implode("' {$options[1]} {$options[0]} = '", $this->queryParams[$num])."' ";
      }
      case 'md5': {
    if(empty($this->queryParams[$num]))
        return 'NULL';

    return md5($this->queryParams[$num]);
      }
      case 'htmlsc' : {
    if(empty($this->queryParams[$num]))
        return 'NULL';

    if(!empty($length)) 
        $this->queryParams[$num] = substr($this->queryParams[$num], 0, $length);

    return "'".mysql_escape_string(htmlspecialchars($this->queryParams[$num]))."'";
      }
      default: {
    if(empty($this->queryParams[$num]))
        return 'NULL';

    if(!empty($length)) 
        $this->queryParams[$num] = substr($this->queryParams[$num], 0, $length);

    return "'".mysql_escape_string($this->queryParams[$num])."'";
      }
  }
    }

    /* ---------------------------------------------------------------------------------
    // public string viewResult ( )
    // Функция возвращает результат в форматированном виде.
    --------------------------------------------------------------------------------- */    
    function viewResult() {
  $__template  = '<table cellspacing="0" cellpadding="5" style="font-family: Verdana; font-size: 11px; color: #666666;'.
      'border-width:1px; border-style:solid; border-color:#CCCCCC; background-color:#EFEFEF; border-collapse: collapse;">';
  $__template  .= '<tr><th colspan="'.$this->numFields.'" align="left">Result: '
      .$this->numRows.' rows selected<br>Query: '.$this->lastQuery.'</th></tr>';
  $__template  .= '<tr><th>num</th><th>'.implode('</th><th>', array_keys($this->lastResult[0])).'</th></tr>';
  for($i = 0; $i < $this->numRows; $i++) {
      $__template    .= '<tr><td style="border-width:1px; border-style:solid; border-color:#CCCCCC; padding:5px;">'.
      ($i+1).'</td><td style="border-width:1px; border-style:solid; border-color:#CCCCCC; padding:5px;">'.
      implode('</td><td style="border-width:1px; border-style:solid; border-color:#CCCCCC; padding: 5px;">', $this->lastResult[$i]).'</td></tr>';
  }
  $__template  .= '</table>';
  return $__template;
    }
    
    /* ---------------------------------------------------------------------------------
    // private void setError ( [bool is] )
    // Приватная функция для вывода ошибок
    --------------------------------------------------------------------------------- */    
    function setError($is = true, $msg = null) {
  echo '<center><div align="justify" style="width:70%; background-color:#FAFAFA;';
  echo 'border-color:#CCCCCC; border-width:1px; border-style:solid; padding: 10px;';
  echo 'font-family: Verdana; color: 666666; font-size: 11px;">';
  echo '<b>MySQL - сообщение об ошибке:</b><br><br>'.str_repeat('&nbsp;', 4);
  if(isset($msg))
      echo $msg;
  if(is_resource($this->connSource))
      echo mysql_error($this->connSource);
  if($is === false) 
      echo mysql_error();
  if(!empty($this->lastQuery)) {
      echo '<p>&nbsp;<p><div id="sql" style=";background-color:#EFEFEF; border-color:#CCCCCC; border-width:1px; border-style:solid; padding: 5px;" name="sql">';
      echo '<b>Последний SQL запрос:</b><p>';
      echo str_repeat('&nbsp;', 4).'<span style="color:#FF6600;">'.$this->lastQuery.'</span></div>';
  }
  echo '</div></center>';
  exit;
    }
}

?>

И пример использования:

Код
<?php

$db = new db('localhost, user1, , mainbase, 1'); 
// Коннект к localhost, юзер user1 без пароля, выбираем базу mainbase, постоянное соединение.
$db->sendQuery('select s.main, s.root, s.parent, t.name, t.views, t.logs, t.systems'.
    ' from sec_table as s left join tech_table as t on(t.id = ${0 i 11}) where s.prent = ${1 i 11}'.
    ' and s.sct = t.sc', $_GET['t_id'], $_GET['parent']
);

$db->getResult();
print_r($db->lastResult);
?>



--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
skalex
Дата 9.3.2005, 17:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


Профиль
Группа: Участник Клуба
Сообщений: 895
Регистрация: 2.4.2004

Репутация: 2
Всего: 23



Прошу прощения, но на мой взгляд это совсем не абстрактный класс, а как раз драйвер (как и указано в исходном коде). Только почему тогда приведенный класс имеет имя db ? Более логично было бы назвать его например db_mysql.

Пара соображений на этот счет:

1. ИМХО абстрактный "класс" для работы с БД должен иметь 2 статических метода (для соединения/отсоединения) и набор драйверов (mysql.php, oracle.php, postgre.php и т.д.), где соответственно реализуются интерфейсы к каждой БД. Подключение/отключение тоже производится через драйвер. Просто из статического метода абстрактного класса вызывается соответствующий метод указанного драйвера.

2. Параметры подключения передавать не аргументами, а строкой типа "mysql://user:password@host:port/database". ИМХО это удобнее и красивее smile.

Есть еще пара идей... smile
PM   Вверх
IZ@TOP
Дата 9.3.2005, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 3
Всего: 73



Mace, ты прав, я немного ошибся в определении значения слова "абстрактный". Надо будет доработачку внести.
Цитата
"mysql://user:password@host:port/database"

Точно, это мне больше нравится.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Irokez
Дата 9.3.2005, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: нет
Всего: 53



было бы неплохо если бы в классе можно было управлять выводом ошибок, к примеру ввести дополнительную переменную - $showErrors, при откладки и тестировании сайта можно установить ей истинное значение и класс будет выводить ошибки, а когда уже запускаем сайт, то "выключаем" вывод ошибок, посетителям не обязательно знать какие запросы отсылются в базу ..
PM   Вверх
IZ@TOP
Дата 10.3.2005, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 3
Всего: 73



Irokez, в общем на самом деле может и не стоит, просто с данным классом, если его правильно использовать, SQL инъекции исключены. Хотя всегда вариант "дыр" в основном коде остатся.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Opik
Дата 11.3.2005, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 7
Всего: 55



IZ@TOP
Я бы добавил 2 аргумента в getResult - limit 1, 2
думаю ты меня понял...
PM MAIL Skype   Вверх
IZ@TOP
Дата 11.3.2005, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 3
Всего: 73



Opr, да, в общем то я хочу разбивку сделать по страницам встроенную. А в getResult limit по моему не нужен. Если уж куда и ставить, то в запрос.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Opik
Дата 15.3.2005, 16:45 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 7
Всего: 55



IZ@TOP
аха smile тормознул smile
PM MAIL Skype   Вверх
IZ@TOP
Дата 29.4.2005, 08:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 3
Всего: 73



Вот и выкладываю свой шаблонизатор.

Инструкция к шаблонизатору execTemplates


1. Загрузка документа.

Код

<?php
// Подключаем класс шаблонизатора
require '/path/to/classess/class.exec.templates.php';

// Загружать можно как файлы так и, например, выбранный из БД шалон.

// Подгружаем шаблон из файла
$tpl    = new execTemplates('/set/templates/work/path/', 'example.tpl', TPL_INFILE);
// /set/templates/work/path будет каталогом для последующей загрузки файлов шаблонов и т.п.

// Подгружаем шаблон из текста
$tpl    = new execTemplates(0, $rowFromDBOrOtherVariable['template_name'], TPL_INTEXT);
?>

Заметим так же что инициальизировать класс можно без назначения шаблонов:

Код

<?php
$tpl    = new execTemplates();
?>

После чего подгрузку шаблона можно произвести с помощью метода setTemplate,
передавая ей аргументы по аналогии с execTemplates. Назначить рабочий каталог можно
с помощью метода setWorkPath.

Код

<?php
$tpl->setWorkPath('/path/to/templates/');
$tpl->setTemplate('example.tpl', TPL_INFILE);
?>

2. Назначение подстановочных перенменных шаблона

Есть несколько способов назначения переменных шаблона, они делятся на две группы:
глобальные и передаваемые в тело функции.

Глобальное назначение переменных выглядит так:

Код

<?php
$myVariable    = 'Hello World!!! LOL';
$tpl->assign('myVariable');
?>

При таком способе нужно учитывать что переменные назначаются из глобального массива ($GLOBALS).

Назначение переменных путем передачи в тело функции:

Код

<?php
$myVariable    = 'Hello World!!! LOL';
$tpl->assign('HELLO_WORLD', $myVariable);
?>

Передача глобальных переменных из массива:

Код

<?php
$myVariable    = array(
    'HELLO_WORLD'    => 'Hello World!!! LOL',
    'MY_NAME'        => 'My name is Admin',
);

$tpl->assign('myVariable', false, 1);
?>

Передача глобальных переменных из массива с добавлением префикса:

Код

<?php
$myVariable    = array(
    'HELLO_WORLD'    => 'Hello World!!! LOL',
    'MY_NAME'        => 'My name is Admin',
);

$tpl->assign('myVariable', false, 1, 1);
?>


Точно так же можно назначать переменные внутри функции/метода класса, передавая
переменную непосредственно в тело вызова метода assign (вместо false).

И так, как же выглядит шаблон в котором будут заменен текст из примеров?
Синтаксис записи шаблонных перменных очень прост.

Код

<body>
Проверка! Текст на замену - ${myVariable}<br>
И еще ${HELLO_WORLD}<br>
А теперь с префиксом ${myVariableHELLO_WORLD} & ${myVariableMY_NAME}
</body>


3. Работа с циклами

Составляем шаблон и обрабатываем его.

Например у нас есть одномерный массив, который нужно вывести в HTML код:

Код

<?php
$myArray    = array(
    'key1'    => 'A1-TTF8K',
    12        => 'B1-TTF9I',
);
?>

Чтобы зарегестрировать этот массив в шаблоне для обработки в цикле,
можно поступить несколькими способами:

Код

<?php
$tpl->assign('myArray');
// или, например если этот массив будет возращен из некоей функции,
// можно поступить следующим образом
$tpl->assign('myArray', get_array_myArray());
?>

Шаблон для исполнения цикла должен выглядеть следующим образом:

Код

<loop @myArray>
    Номер перебираемого элемента по очереди: %{i}<br>
    Ключ текущего элемента массива: ${key}<br>
    Значение по ключу ${key} текущего массива: ${value}
    <hr>
</loop>

Думаю в дополнительных комментариях данный код не нуждается и всем понятно что
<loop @myArray> это начало перебора массива $myArray в цикле.

Что же если нам, например, понядобится обработать многомерный массив?
Все очень просто:

Код

<?php

$myMultiArray    = array(
    array('annotation' => 'KISS MY!', 'name' => 'IZ@TOP', 'group' => 'Admin =)'),
    array('annotation' => 'I\'m JacaScript GOD!', 'name' => 'Aliance', 'group' => 'KoModer!'),
);
// Соответственно ргистрация данного массива будет выглядеть следующим образом:

$tpl->assign('testMultiArray', $myMultiArray);
?>

Соответсвенно, чтобы наш массив обработался в шаблоне, нам нужно чуток изменить наш шаблон:

Код

<loop @testMultiArray -m>
Анотация: ${annotation}<br>
Имя: ${name}<br>
Группа: ${group}
</loop>

Думаю что с этим делом понятно. Теперь давайте разберемся с дополнительными возможностями
при использовании циклов.

Код

<loop @array_name -m -f func_name %void -i 100 -b #CCCCCC:#ECECEC -d empty_loop>
<tr bgcolor="%{break}"><td>
 
 ... некий HTML код ...
 </td></tr>
</loop>

Интересно, чтоже значат все эти -m -f и т.п. smile???
Разъясняю:
Опция -m дает знать обработчику что массив многомерный.

Опция -f func_name %void означает что в цикле необходимо выполнять функцию, чье имя и стоит после этой опции...
еще один параметр который играет роль при исполнении данной процедуры, это тип выполнения цикла. В данном случае
это %void - что значит что функция будет исполнена и больше ничего. Есть и другие:
%rv - исполняет функцию и заменяет в шаблоне цикла директиву <!--exec.func_name--> на результат выполнения функции.
%ra - исполняет функцию аналогично предыдущему способу, но передает в нее текущий элемент массива.
%ia - исполняется функция с передачей текущего элемента массива но без замены возвращенного ею результата.
%void - обыкновенное исполнение функции (может кому пригодится, хотя я в этой опции необходимости невижу).

Опция -i 100 начинает отсчет %{i} директивы со 100

Оация -b #CCCCCC:#ECECEC подменяет поочередно %{break} #CCCCCC и #ECECEC, таким образом у нас получается разноцветные
строки в таблице.

Опция -d empty_loop записывает на место шаблона цикла значение из $GLOBALS['empty_loop'] в случае если в нем не содержится данных.

Существует так же опция -l filename.tpl, которая загружает тело цикла из отдельного файла.


4. Напоследок об условиях

В данной версии шаблонизатора реализован механизм обработки простых условий без вложенности if/else.

Пример шаблона:

Код

<if @globalCount != %0>
    Чего-то не то ребятки...<br>
<else/>
    <loop @array -m>
    ... какой-то код.
    </loop>
</if>

Данные в if могут быть трех типов:
@example - будет подставлена переменная example из массива $GLOBALS.
$example - будет взята переменная из назначенных данных для условий:

Код

<?php
$tpl->assignCond('example', 'war is not answer');
?>

И наконец %example будет интерпретировна как простая строка.

5. Инклуд файлов

Директивы
Код

<!--file.execute(filename.php)-->
будут заменены на результат работы файла
filename.php, а директива
Код

<!--file.read(filename.txt)-->
будет заменена на текст
который назходится внутри файла filename.txt.

6. Компиляция шаблона

Для компиляции шаблона используется следующая функция которая запускает обработчики:

Код

<?php
$tpl->Execute(1, 1, 1, 1);
$tpl->showContent();
?>


Первый аргумент говорит интерпретатору о необходимости замены переменных шаблона,
второй о необходимости исполнить циклы, третий аргумент обозначает необзходимость
обработки условий и четвертый соответственно дает знать что нужно искать в шаблоне
директивы исполнения файлов.

Примечание.
К сожалению у меня сейчас нету времени описать все возможности шаблонизатора,
думаю если Вы поковыряетесь в коде, то разберетесь в том что там есть еще.

Класс шаблонизатора находится в прикрепленном файле.

Присоединённый файл ( Кол-во скачиваний: 55 )
Присоединённый файл  class.exec.templates.php


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
fara
Дата 24.5.2005, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

Репутация: нет
Всего: 2



Предлагаю здесь разработать универсальный класс управления всеми возможными ошибками
Назовем его ессно как нить ErrorHandler
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
IZ@TOP
Дата 24.5.2005, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 3
Всего: 73



fara, почему бы и нет! Какова будет его структура и функционал?


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
fara
Дата 24.5.2005, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

Репутация: нет
Всего: 2



IZ@TOP
видел я один довольно приятный на чтение код в CMS Seagull...

Предлагаю писать его как класс
class ErrorHandler {
...
}

Что может делать наш класс:
1. записывать в журнал ошибки указывая род (тип) ошибки
2. возможность отправки на мыло серьезных ошибок


Производить debug при отладке скриптов.

Собсно осталось писать код smile

Я над этим немного подумаю и выставлю че получилось.
Добавлено @ 21:32
Код

<?php
/* Reminder: always indent with 4 spaces (no tabs). */
// +---------------------------------------------------------------------------+
// | Copyright (c) 2004, Demian Turner                                         |
// | All rights reserved.                                                      |
// |                                                                           |
// | Redistribution and use in source and binary forms, with or without        |
// | modification, are permitted provided that the following conditions        |
// | are met:                                                                  |
// |                                                                           |
// | o Redistributions of source code must retain the above copyright          |
// |   notice, this list of conditions and the following disclaimer.           |
// | o Redistributions in binary form must reproduce the above copyright       |
// |   notice, this list of conditions and the following disclaimer in the     |
// |   documentation and/or other materials provided with the distribution.    |
// | o The names of the authors may not be used to endorse or promote          |
// |   products derived from this software without specific prior written      |
// |   permission.                                                             |
// |                                                                           |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT         |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR     |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT      |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,     |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT          |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,     |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE     |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      |
// |                                                                           |
// +---------------------------------------------------------------------------+
// | Seagull 0.4                                                               |
// +---------------------------------------------------------------------------+
// | ErrorHandler.php                                                          |
// +---------------------------------------------------------------------------+
// | Authors:   Peter James <[email protected]>                                  |
// |            Demian Turner <[email protected]>                          |
// +---------------------------------------------------------------------------+
// $Id: ErrorHandler.php,v 1.3 2004/11/22 23:07:16 demian Exp $

//  This class is based on Peter James' class of the same name, for more info 
//  see http://php.shaman.ca/

/**
 * Global error handler class, modifies behaviour for PHP errors, not PEAR.
 *
 * @package SGL
 * @author  Demian Turner <[email protected]>
 * @version $Revision: 1.3 $
 * @since   PHP 4.1
 */
class SGL_ErrorHandler
{
    var $errorType = array();
    var $sourceContextOptions = array();

    /**
     * Constructor.
     *
     * @access  public
     * @return  void
     */
    function SGL_ErrorHandler()
    {
        //  first dimension elements are PHP error types
        //  2nd dimension elements are roughly PEAR Log's equivalents

        //  nb: comment out Notice for equivalent of 
        //  error_reporting(E_ALL ^ E_NOTICE);
        $this->errorType = array (
               1   =>  array('Error', 3),
               2   =>  array('Warning', 4),
               4   =>  array('Parsing Error', 3),
               8   =>  array('Notice', 5),
               16  =>  array('Core Error', 3),
               32  =>  array('Core Warning', 4),
               64  =>  array('Compile Error', 3),
               128 =>  array('Compile Warning', 4),
               256 =>  array('User Error', 3),
               512 =>  array('User Warning', 4),
               1024=>  array('User Notice', 5),
               2047=>  array('All', 7)
                );
        $this->sourceContextOptions = array('lines' => 5);
    }

    /**
     * BC hack to assign custom error handler in a method.
     *
     * @access  public
     * @return  void
     */
    function startHandler()
    {
        $GLOBALS['_SGL']['ERROR_HANDLER_OBJECT'] =  & $this;
        $GLOBALS['_SGL']['ERROR_HANDLER_METHOD'] =  'errHandler';

        //  inner function to handle redirection to a class method
        function eh($errNo, $errStr, $file, $line, $context)
        {
            call_user_func(array(
               &$GLOBALS['_SGL']['ERROR_HANDLER_OBJECT'], 
                $GLOBALS['_SGL']['ERROR_HANDLER_METHOD']),
                $errNo, $errStr, $file, $line, $context
            );
        }
        //  start handling errors
        set_error_handler('eh');
    }

    /**
     * Enhances PHP's default error handling.
     *
     *  o overrides notices in certain cases
     *  o obeys @muffled errors, 
     *  o error logged to selected target
     *  o context info presented for developer
     *  o error data emailed to admin if theshold passed
     * 
     * @access  public
     * @param   int     $errNo      PHP's error number
     * @param   string  $errStr     PHP's error message
     * @param   string  $file       filename where error occurred
     * @param   int     $line       line number where error occurred
     * @param   string  $context    contextual info
     * @return  void
     */
    function errHandler($errNo, $errStr, $file, $line, $context)
    {
        //  if an @ error suppression operator has been detected (0) return null
        if (error_reporting() == 0) {
            return null;
        }
        //  or if notices are temporarily being suppressed, return null
        if ($GLOBALS['_SGL']['ERROR_OVERRIDE'] == true) {
            if (error_reporting() == E_ALL ^ E_NOTICE) {
                return null;
            }
        }
        if (in_array($errNo, array_keys($this->errorType))) {
            $conf = & $GLOBALS['_SGL']['CONF'];
            //  final param is 2nd dimension element from errorType array,
            //  representing PEAR error codes mapped to PHP's

            //  also, error obj is stored in $GLOBALS['_SGL']['ERRORS']
            //  in the logMessage method
            SGL::logMessage($errStr, $file, $line, $this->errorType[$errNo][1]);

            //  if a debug sesssion has been started, or the site in in 
            //  development mode, send error info to screen
            if (!$conf['debug']['production'] || SGL_HTTP_Session::get('debug')) {
                $source = $this->_getSourceContext($file, $line);
                //  generate screen debug html
                //  type is 1st dimension element from $errorType array, ie,
                //  PHP error code
                $output = <<<EOF
<hr />
<p class="error">
  <strong>MESSAGE</strong>: $errStr<br />
  <strong>TYPE:</strong> {$this->errorType[$errNo][0]}<br />
  <strong>FILE:</strong> $file<br />
  <strong>LINE:</strong> $line<br />
  <strong>SOURCE CONTEXT:</strong>
  <p>$source</p>
</p>
<hr />
EOF;
                echo $output;
            }
            //  email the error to admin if threshold reached
            if ($this->errorType[$errNo][1] <= SGL_EMAIL_ADMIN_THRESHOLD) {

                //  get extra info
                $dbh = & SGL_DB::singleton();
                $lastQuery = $dbh['last_query'];
                $aExtraInfo['callingURL'] = $_SERVER['SCRIPT_NAME'];
                $aExtraInfo['lastSQL'] = isset($dbh['last_query']) ? 
                    $dbh['last_query'] : null;
                $aExtraInfo['userID'] = SGL_HTTP_Session::get('uid');
                $aExtraInfo['clientData']['HTTP_REFERER'] = $_SERVER['HTTP_REFERER'];
                $aExtraInfo['clientData']['HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'];
                $aExtraInfo['clientData']['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];
                $aExtraInfo['clientData']['SERVER_PORT'] = $_SERVER['SERVER_PORT'];

                //  store formatted output
                ob_start();
                print_r($aExtraInfo);
                $info = ob_get_contents();
                ob_end_clean();

                //  rebuild error output w/out html
                include_once SGL_CORE_DIR . '/Util.php';
                $crlf = SGL_Util::getCrlf();
                $output = $errStr . $crlf . 
                    'type: ' . $this->errorType[$errNo][0] . $crlf .
                    'file: ' . $file . $crlf .
                    'line: ' . $line . $crlf . $crlf;
                $message = $output . $info;
                @mail($conf['email']['admin'], 'ERROR OUTPUT FROM ' . 
                    $conf['site']['name'], $message);
            }
        }
    }

    /**
     * Provides enhanced error info for developer.
     *
     * Gives 10 lines before and after error occurred, hightlight erroroneous
     * line in red.
     *
     * @access  private
     * @param   string  $file       filename where error occurred
     * @param   int     $line       line number where error occurred
     * @param   string  $context    contextual info
     * @return  string  contextual error info
     */
    function _getSourceContext($file, $line)
    {
     $sourceContext = null;
     
        //  check that file exists
        if (!file_exists($file)) {
            $sourceContext = "Context cannot be shown - ($file) does not exist";
        //  check if line number is valid
        } elseif ((!is_int($line)) || ($line <= 0)) {
            $sourceContext = "Context cannot be shown - ($line) is an invalid line number";
        } else {        
            $lines = file($file);
            
            //  get the source ## core dump in windows, scrap colour highlighting :-(
            //  $source = highlight_file($file, true);
            //  $lines = split("<br />", $source);
            //  get line numbers
            $start = $line - $this->sourceContextOptions['lines'] - 1;
            $finish = $line + $this->sourceContextOptions['lines'];
            
            //  get lines
            if ($start < 0) {
                $start = 0;
            }
            
            if ($start >= count($lines)) {
                $start = count($lines) -1;
            }
            
            for ($i = $start; $i < $finish; $i++) {
                //  highlight line in question
                if ($i == ($line - 1)) {
                    $context_lines[] = '<div class="error"><strong>' . ($i + 1) .
                        "\t" . strip_tags($lines[$line -1]) . '</strong></div>';
                } else {
                    $context_lines[] = '<strong>' . ($i + 1) .
                        "</strong>\t" . $lines[$i];
                }
            }
            
            $sourceContext = trim(join("<br />\n", $context_lines)) . "<br />\n";
        }
        
        return $sourceContext;
    }
}
?>

--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
Irokez
Дата 12.6.2005, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: нет
Всего: 53



Работая на локальной машине, часто возникает проблема с функцией mail, т.к. естесственно без почового сервера письмо никуда не идет. Кажется в денвере есть заглушка, которая вместо отсылки письма, просто сохраняет письмо в папку в виде текстового файла. Но т.к. я не сторонник денвера, решил написать свою заглушку, получилось весьма удобно:
Код

function email($to, $subj, $msg, $headers = null, $params = null)
{
    $email_dir = '/path/to/email/dir'; // папка где будут храниться письма
    $done = @mail($to, $subj, $msg, $headers, $params);
    if (!$done) {
        $input =
<<<XML
<?xml version="1.0"?>
<mail>
  <subject>
    $subj
  </subject>
  <headers>
    $headers
  </headers>
  <message>
    $msg
  </message>
  <parameters>
    $params
  </parameters>
</mail>
XML;
        $dir = $email_dir.$to.'/';
        if (!file_exists($dir)) {
            mkdir($dir, '0775');
        }
        if (file_exists($dir))
        {
            $words = preg_split('/\W/', $subj);
            $fname = (strlen($words[0])) ? $words[0] : 'untitled';
            $uname = $fname; //unique file name
            $i = '';
            while (file_exists($dir.$uname)) {
                $i = (int)$i;
                $i ++;
                $uname = $fname . '(' . $i .')';
            }
            $fname = $uname;
            $fh = fopen($dir.$fname, 'w');
            $done = fwrite($fh, $input);
            fclose($fh);
        }
    }
    return $done;
}

т.е. в своем проекте вместо функции mail() можно пользоваться этой email(), которая принимает такие же параметры, как и mail(), функция будет сохранять "отправленные" письма в папке $email_dir, в папке названной именем почтового адреса куда отсылается письмо, с заголовком первого слова темы письма или с таким же названием + (цифра) если такое письмо уже отправлялось ранее
PM   Вверх
Elfet
Дата 4.1.2006, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Мод наград для IPB 2.1.х smile smile Сделал, кому может тоже нужно будет.

Присоединённый файл ( Кол-во скачиваний: 26 )
Присоединённый файл  award.zip 41,58 Kb


--------------------
PM MAIL WWW Skype   Вверх
CyClon
Дата 14.1.2006, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Elfet, а что он может. У юзера будут показыватся награды чтоли?


--------------------
user posted image
PM   Вверх
kshyms
Дата 21.12.2006, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 303
Регистрация: 30.8.2006
Где: Душанбе

Репутация: нет
Всего: 0



skalex 
Цитата

"mysql://user:password@host:port/database". 
Эту строку можно ли использовать в качестве HTTP при отправке данных на сервер из сайта? Если да можно ли ее еще закодировать для безопасности  и каким образом? Если я это пойму многое смогу сделать сам. 
PM MAIL WWW Skype   Вверх
ImamMahdi
Дата 16.8.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 21.6.2007

Репутация: нет
Всего: нет



IZ@TOP, шаблонизатор хорошо описали, а вот в самом коде не единого комментария - плохо
Да и проверсию пхп на которой он будет работать, тоже ни слова.
PM MAIL   Вверх
rosimk
  Дата 6.3.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 6.3.2008

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL WWW   Вверх
Uleeek
Дата 22.12.2008, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 10.12.2008

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
Uleeek
Дата 23.12.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 10.12.2008

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
pussyspb
Дата 10.9.2011, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 10.9.2011

Репутация: нет
Всего: нет



Вроде бы раздел называется библиотека скриптов, а ничего полезного нету (((
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Другие движки / фрейморки | Следующая тема »


 




[ Время генерации скрипта: 0.2196 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.