ГлавнаяBTL инфоПрограммированиеDatabase
Статьи

ИСПОЛЬЗОВАНИЕ SQL ДЛЯ ИЗВЛЕЧЕНИЯ ИНФОРМАЦИИ ИЗ ТАБЛИЦ
 

ИСПОЛЬЗОВАНИЕ РЕЛЯЦИОННЫХ И БУЛЕВЫХ ОПЕРАТОРОВ ДЛЯ СОЗДАНИЯ БОЛЕЕ ИЗОЩРЕННЫХ ПРЕДИКАТОВ
 

ИСПОЛЬЗОВАНИЕ СПЕЦИАЛЬНЫХ ОПЕРАТОРОВ В УСЛОВИЯХ
 

ОБОБЩЕНИЕ ДАННЫХ С ПОМОЩЬЮ АГРЕГАТНЫХ ФУНКЦИЙ
 

ФОРМИРОВАНИЕ ВЫВОДОВ ЗАПРОСОВ
 

ЗАПРАШИВАНИЕ МНОГОЧИСЛЕННЫХ ТАБЛИЦ ТАКЖЕ КАК ОДНОЙ
 

ОБЪЕДИНЕНИЕ ТАБЛИЦЫ С СОБОЙ
 

ВСТАВКА ОДНОГО ЗАПРОСА ВНУТРЬ ДРУГОГО
 

СООТНЕСЕННЫЕ ПОДЗАПРОСЫ
 


1 2 
В начало Предыдущая Следующая В конец
 

4. Настройка ADODB для более высокой производительности

ADODB – это очень большая библиотека, которая всеже превосходит все другие библиотеки PHP в производительности. Это происходит потому, что она разработана в виде слоев, подобно луку, самые быстрые функции расположены во внутреннем слое. Придерживайтесь использования следующих функций для большей производительности:
Самый низкоуровневый слой:


 Connect, PConnect, NConnect
Execute, CacheExecute
SelectLimit, CacheSelectLimit
MoveNext, Close
qstr, Affected_Rows, Insert_ID 

Самый быстрый способ получить доступ к данным, это обращаться непосредственно к массиву с данными $recordset->fields. Также установите значения глобальным переменным $ADODB_FETCH_MODE = ADODB_FETCH_NUM, и (для oci8, ibase/firebird и odbc) $ADODB_COUNTRECS = false до того, как подключитесь к базе данных.
Используйте связанные параметры, если ваша база данных поддерживает это, поскольку это улучшает повторное использование запросов. Используйте систему тонкой настройки ADODB для быстрого выявления узких мест. На время написания (Дек. 2003) это справедливо и для oci8 и odbc драйверов.
Наконец, убедитесь, что у вас установлен PHP акселератор кэширования, например, APC, Turck MMCache, Zend Accelerator или ionCube.
Несколько примеров:
Быстрый доступ к данным в PHP:


 $rs =& $rs->Execute($sql);
while (!$rs->EOF) {
    var_dump($rs->fields);
    $rs->MoveNext();

Быстрый доступ к данным в ADODB:


 $rs =& $rs->Execute($sql);
$array = adodb_getall($rs);
var_dump($array); 

4.1 Дополнительные подсказки

Если у вас установлено расширение ADODB, написанное на C, вы можете заменить ваши запросы к $rs->MoveNex() на adodb_movenex($rs). Эта команда удваивает скорость операции. Для того, чтобы получить записи целиком, используйте GetArray(), которая использует высокоскоростную функцию расширения adodb_getall($rs).
Execute() - это основной способ запуска запросов. Вы можете использовать функции низкого уровня _Execute() и _query(), чтобы уменьшить цепочку функций. Обе эти функции принимают теже самые параметры, что и Execute().
Если вы не используете связанные параметры, или ваша база данных поддерживает связанные параметры (без эмуляции) вы можете вызывать _Execute() непосредственно. Вызов этих функций обходит эмуляцию связанных параметров. _Execute() поддерживает отладку.
Если вам не требуется отладка, вы не используете связанные данные и вам не нужны возвращаемые значения – используйте функцию _query(). Эта функция хорошо подходит для вставки (INSERT), обновления (UPDATE) и удаления (DELETE). Вызов функции _query() позволит вам обойти отладку, эмуляцию связанных данных и обработку возвращаемых результатов. Функция возвращает TRUE или FALSE.
Для Informix вы можете выключить scrollable курсоры командой $db->cursorType = 0.

5. Модернизация ADODB

Вы вполне можете хотеть изменить ADODB под свои собственные нужды. К счастью, вы легко можете поддерживать обратную совместимость расширяя ADODB и используя переменную $ADODB_NEWCONNECTION. $ADODB_NEWCONNECTION позволяет перекрыть поведение ADONewConnection(). ADONewConnection() проверяет эту переменную и вызывает функцию с именем, сохраненным в этой переменной.
В следующем примере, новые функциональные возможности для объекта соединения помещены в классы hack_mysql и hack_postgres7. Название классов (навязанные соглашения) для обработки данных контролируются при помощи переменной $rsPrefix. Здесь мы устанавливаем ее в \'hacks_rs_\', это заставит ADODB использовать hacks_rs_mysql и hacks_rs_postgres7 как классы для обработки данных.


 class hack_mysql extends adodb_mysql {
var $rsPrefix = \'hack_rs_\';
  /* Ваши изменения здесь */
}

class hack_rs_mysql extends ADORecordSet_mysql {
     /* Ваши изменения здесь */
}

class hack_postgres7 extends adodb_postgres7 {
var $rsPrefix = \'hack_rs_\';
  /* Ваши зменения здесь */
}

class hack_rs_postgres7 extends ADORecordSet_postgres7 {
 /* Ваши изменения здесь */
}

$ADODB_NEWCONNECTION = \'hack_factory\';

function& hack_factory($driver)
{
    if ($driver !== \'mysql\' && $driver !== \'postgres7\') return false;
    
    $driver = \'hack_\'.$driver;
    $obj = new $driver();
    return $obj;
}

include_once(\'adodb.inc.php\'); 

Незабудьте вызывать конструктор родительского класса из вашего конструктора. Если вы хотите использовать драйвер ADODB поумолчанию – верните FALSE из hack_factory().

6. Возможности PHP5

Начиная с версии ADODB 4.02 класс прозрачно определяет, какую версию PHP вы используете. В случае обнаружения PHP5 становятся доступными следующие возможности:

  • Foreach итераторы: это очень естественный способ обработки данных:

 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
    $rs = $db->Execute($sql);
    foreach($rs as $k => $row) {
        echo "r1=".$row[0]." r2=".$row[1]."<br>";
    } 

  • Исключения: Стоит включить adodb-exeptions.inc.php и вы с легкостью сможете перехватывать исключения на ошибках в момент их возникновения:

 include("../adodb-exceptions.inc.php"); 
    include("../adodb.inc.php");     
    try { 
        $db = NewADOConnection("oci8"); 
        $db->Connect(\'\',\'scott\',\'bad-password\'); 
    } catch (exception $e) { 
        var_dump($e); 
        adodb_backtrace($e->gettrace());
    } 

Обратите внимание, что достижение EOF не считается ни ошибкой ни исключением. Если вы хотите использовать драйвер поумолчанию – верните FALSE.

7. Поддерживаемые базы данных

Поддерживаемые базы данных

Параметр \'Имя\' – это то, что вы должны передать в функцию NewADOConnection($name).
Колонка \'Тест\' указывает, насколько хорошо код был проверен и используется:

  • A – хорошо проверенный и используемый многими людьми;
  • B – проверен и годен к употреблению, однако некоторые особенности не могут быть реализованы;
  • C – экспериментальный драйвер, не может поддерживать все возможности ADODB.

Колонка \'RecordCount()\' показывает – возвращает ли эта функция колличество запрошенных строк или возвращает -1, если SELECT выполнен. Если указано \'Y/N\' – происходит эмуляция, если глобальная переменная $ADODB_COUNTRECS=true (это значение по умолчанию). Обратите внимание, что для большого количества результатов лучше эту возможность выключить, потомучто потребуется значительное количество памяти для проведения расчетов. Также, эмуляция снижает скорость работы на 40-50%. Это эмулируется в большинстве баз данных кроме PostgreSQL и MySql. Эта переменная проверяется каждый раз, когда вы запускаете запрос, так что вы можете выбрать, какие данные вам считать.

Имя

Тест

База данных

RecordCount()

Требования

ОС

access

B

Microsoft Access/Jet. You need to create an ODBC DSN.

Y/N

ODBC

Windows only

ado

B

Generic ADO, not tuned for specific databases. Allows DSN-less connections. For best performance, use an OLEDB provider. This is the base class for all ado drivers.
You can set $db->codePage before connecting.

? depends on database

ADO or OLEDB provider

Windows only

ado_access

B

Microsoft Access/Jet using ADO. Allows DSN-less connections. For best performance, use an OLEDB provider.

Y/N

ADO or OLEDB provider

Windows only

ado_mssql

B

Microsoft SQL Server using ADO. Allows DSN-less connections. For best performance, use an OLEDB provider.

Y/N

ADO or OLEDB provider

Windows only

db2

A

DB2. Should work reliably as based on ODBC driver.

Y/N

DB2 CLI/ODBC interface

Unix and Windows. Unix install hints . I have had reports that the $host and $database params have to be reversed in Connect() when using the CLI interface.

vfp

A

Microsoft Visual FoxPro. You need to create an ODBC DSN.

Y/N

ODBC

Windows only

fbsql

C

FrontBase.

Y

?

Unix and Windows

ibase

B

Interbase 6 or earlier. Some users report you might need to use this
$db->PConnect(\'localhost:c:/ibase/employee.gdb\', "sysdba", "masterkey") to connect. Lacks Affected_Rows currently.

You can set $db->role, $db->dialect, $db->buffers and $db->charSet before connecting.

Y/N

Interbase client

Unix and Windows

firebird

C

Firebird version of interbase.

Y/N

Interbase client

Unix and Windows

borland_ibase

C

Borland version of Interbase 6.5 or later. Very sad that the forks differ.

Y/N

Interbase client

Unix and Windows

informix

C

Generic informix driver. Use this if you are using Informix 7.3 or later.

Y/N

Informix client

Unix and Windows

informix72

C

Informix databases before Informix 7.3 that do no support SELECT FIRST.

Y/N

Informix client

Unix and Windows

ldap

C

LDAP driver. See this example for usage information.

 

LDAP extension

?

mssql

A

Microsoft SQL Server 7 and later. Works with Microsoft SQL Server 2000 also. Note that date formating is problematic with this driver. For example, the PHP mssql extension does not return the seconds for datetime!

Y/N

Mssql client

Unix and Windows.
Unix install howto and another one .

mssqlpo

A

Portable mssql driver. Identical to above mssql driver, except that \'||\', the concatenation operator, is converted to \'+\'. Useful for porting scripts from most other sql variants that use ||.

Y/N

Mssql client

Unix and Windows.
Unix install howto
.

mysql

A

MySQL without transaction support. You can also set $db->clientFlags before connecting.

Y

MySQL client

Unix and Windows

mysqlt or maxsql

A

MySQL with transaction support. We recommend using || as the concat operator for best portability. This can be done by running MySQL using:
mysqld --ansi or mysqld --sql-mode=PIPES_AS_CONCAT

Y/N

MySQL client

Unix and Windows

oci8

A

Oracle 8/9. Has more functionality than oracle driver (eg. Affected_Rows). You might have to putenv(\'ORACLE_HOME=...\') before Connect/PConnect.
There are 2 ways of connecting - with server IP and service name:
PConnect(\'serverip:1521\',\'scott\',\'tiger\',\'service\')
or using an entry in TNSNAMES.ORA or ONAMES or HOSTNAMES:
PConnect(false, \'scott\', \'tiger\', $oraname).
Since 2.31, we support Oracle REF cursor variables directly (see ExecuteCursor ).

Y/N

Oracle client

Unix and Windows

oci805

C

Supports reduced Oracle functionality for Oracle 8.0.5. SelectLimit is not as efficient as in the oci8 or oci8po drivers.

Y/N

Oracle client

Unix and Windows

oci8po

A

Oracle 8/9 portable driver. This is nearly identical with the oci8 driver except (a) bind variables in Prepare() use the ? convention, instead of :bindvar, (b) field names use the more common PHP convention of lowercase names.
Use this driver if porting from other databases is important. Otherwise the oci8 driver offers better performance.

Y/N

Oracle client

Unix and Windows

odbc

A

Generic ODBC, not tuned for specific databases. To connect, use
PConnect(\'DSN\',\'user\',\'pwd\'). This is the base class for all odbc derived drivers.

? depends on database

ODBC

Unix and Windows. Unix hints.

odbc_mssql

C

Uses ODBC to connect to MSSQL

Y/N

ODBC

Unix and Windows.

odbc_oracle

C

Uses ODBC to connect to Oracle

Y/N

ODBC

Unix and Windows.

odbtp

C

Generic odbtp driver. Odbtp is a software for accessing Windows ODBC data sources from other operating systems.

Y/N

odbtp

Unix and Windows

odbtp_unicode

C

Odtbp with unicode support

Y/N

odbtp

Unix and Windows

oracle

C

Implements old Oracle 7 client API. Use oci8 driver if possible for better performance.

Y/N

Oracle client

Unix and Windows

netezza

C

Netezza driver. Netezza is based on postgres code-base.

Y

?

?

pdo

C

Generic PDO driver for PHP5.

Y

PDO extension and database specific drivers

Unix and Windows.

postgres

A

Generic PostgreSQL driver. Currently identical to postgres7 driver.

Y

PostgreSQL client

Unix and Windows.

postgres64

A

For PostgreSQL 6.4 and earlier which does not support LIMIT internally.

Y

PostgreSQL client

Unix and Windows.

postgres7

A

PostgreSQL which supports LIMIT and other version 7 functionality.

Y

PostgreSQL client

Unix and Windows.

postgres8

A

PostgreSQL which supports version 8 functionality.

Y

PostgreSQL client

Unix and Windows.

sapdb

C

SAP DB. Should work reliably as based on ODBC driver.

Y/N

SAP ODBC client

?

sqlanywhere

C

Sybase SQL Anywhere. Should work reliably as based on ODBC driver.

Y/N

SQL Anywhere ODBC client

?

sqlite

B

SQLite.

Y

-

Unix and Windows.

sqlitepo

B

Portable SQLite driver. This is because assoc mode does not work like other drivers in sqlite. Namely, when selecting (joining) multiple tables, the table names are included in the assoc keys in the "sqlite" driver.
In "sqlitepo" driver, the table names are stripped from the returned column names. When this results in a conflict, the first field get preference.

Y

-

Unix and Windows.

sybase

C

Sybase.

Y/N

Sybase client

Unix and Windows.

sybase_ase

C

Sybase ASE.

Y/N

Sybase client

Unix and Windows.

1 2 3 4 
В начало Предыдущая Следующая В конец
 
Услуги
Портфолио
BTL инфо
Администрирование
 
Дизайн
 
Программирование
 
htlm/dhtml
javascript
ajax
aps
flash action script
php
xhtml/wap
database
Поисковая оптимизация и раскрутка
 
Шаблоны
 
Программы
 
Контакты

УКР РУС ENG

  © 2005-2008 дизайн-студия myua.com.ua