kastaneda: (Default)
[personal profile] kastaneda
Недавно я писал про то, что терпеть не могу Smarty. Так вот, в продолжение темы: я весьма прохладно отношусь к PEAR::DB и ADOdb. Они монстрообразны. Для простых веб-приложений я пользуюсь очень простой «обёрткой» к штатным функциям вида foosql_query(), которая заметно сокращает объём кода.

Примерно вот так:

<?php

define
('SQL_CELL',  2);
define('SQL_ROW',   1);
define('SQL_COL',  -1);
define('SQL_HASH', -2);

function 
sql($query,$pack_level=0) {
    
$res=mysql_query($query);
    if( 
is_resource($res) ) {
        
$data=array();
        if( 
$pack_level==SQL_HASH )
            while( list(
$key,$val)=mysql_fetch_row($res) ) $data[$key]=$val;
        elseif( 
$pack_level==SQL_COL )
            while( 
$row=mysql_fetch_row($res) ) $data[]=end($row);
        else {
            while( 
$row=mysql_fetch_assoc($res) ) $data[]=$row;
            while( 
$pack_level-- && count($data) ) $data=end($data);
        }
        return 
$data;
    }
}

?>

Этого вполне достаточно, чтобы писать простые веб-приложения. Для сложных веб-приложений потребуется высокоуровневая абстракция. А для новостных лент, гостевых книг и прочей мелочёвки вполне достаточно одной функции. Не верите?
$result = sql('SELECT * FROM table');
возвращает массив массивов (массив строк результата):
array(
    array('id'=>1, 'name'=>'Foo'),
    array('id'=>2, 'name'=>'Bar') )


$result = sql('SELECT * FROM table WHERE id=1', SQL_ROW);
возвращает ассоциативный массив (одна строчка результата):
array( 'id'=>1, 'name'=>'Foo' )

$result = sql('SELECT name FROM table WHERE id=1', SQL_CELL);
возвращает скалярное значение: 'Foo'

$result = sql('SELECT name FROM table', SQL_COL);
возвращает массив (столбец результатов):
array( 'Foo', 'Bar' )

$result = sql('SELECT id, name FROM table', SQL_HASH);
возвращает ассоциативный массив с ключами из id и значениями table:
array( 1=>'Foo', 2=>'Bar' )
(порядок переменных в SELECT'е важен)

sql('DELETE FROM table WHERE id=10');
sql('UPDATE table SET enabled=0 WHERE publication_date<NOW()');
просто выполняет запрос
Вот так. А морали сегодня не будет, мне её надоело рассказывать.
(will be screened)
(will be screened if not validated)
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

September 2025

M T W T F S S
12345 67
891011121314
15161718192021
22232425262728
2930