Выполнение запросов к базе данных SQL

Задача
Необходимо извлечь некоторую информацию из базы данных.

Решение
Сначала вызовите функцию DB::query() из PEAR DB для посылки SQL-запроса в базу данных, а затем – функцию DB_Result::fetchRow() или функцию DB_Result::fetchInto() для извлечения каждой строки результата:

// использование функции fetchRow()
$sth = $dbh->query("SELECT sign FROM zodiac WHERE element LIKE 'fire'");
if (DB::isError($sth)) { die($sth->getMessage()); }
while($row = $sth->fetchRow()) {
print $row[0]."\n";
}
// использование функции fetchInto()
$sth = $dbh->query("SELECT sign FROM zodiac WHERE element LIKE 'fire'");
if (DB::isError($sth)) { die($sth->getMessage()); }
while($sth->fetchInto($row)) {
print $row[0]."\n";
}

Обсуждение
Метод fetchRow() возвращает данные, тогда как метод fetchInto() помещает данные в переменную, которую ему передают. И метод fetchRow(), и метод fetchInto() возвращают NULL, если больше нет ни одной строки.

Если любой из двух методов сталкивается с ошибкой при извлечении строки, то он возвращает объект DB_Error точно так же, как это делают методы DB::connect() и DB::query().


Можно вставить проверку этой ситуации внутри цикла:

while($row = $sth->fetchRow()) {
if (DB::isError($row)) { die($row->getMessage()); }
print $row[0]."\n";
}

Если параметр magic_quotes_gpc установлен в on, то можно использовать переменную формы непосредственно в запросе:

$sth = $dbh->query(
"SELECT sign FROM zodiac WHERE element LIKE '" . $_REQUEST['element'] . "'");

Если нет, то надо преобразовать значение с помощью функции DB::quote()
или использовать символ-заместитель:

$sth = $dbh->query("SELECT sign FROM zodiac WHERE element LIKE " .
$dbh->quote($_REQUEST['element']));
$sth = $dbh->query('SELECT sign FROM zodiac WHERE element LIKE ?',
array($_REQUEST['element']));

В рецепте 10.9 подробно рассказано, когда следует брать значения в кавычки и как это делать.

По умолчанию методы fetchRow() и fetchInto() размещают информацию в числовых массивах. Но можно сохранять данные в ассоциативных массивах или объектах, передавая методам дополнительные параметры. В случае ассоциативных массивов задается параметр DB_FETCHMODE_ASSOC:

while($row = $sth->fetchRow(DB_FETCHMODE_ASSOC)) {
print $row['sign']."\n";
}
while($sth->fetchInto($row,DB_FETCHMODE_ASSOC)) {
print $row['sign']."\n";
}

Для объектов указывается параметр DB_FETCHMODE_OBJECT:
while($row = $sth->fetchRow(DB_FETCHMODE_OBJECT)) {
print $row->sign."\n";
}
while($sth->fetchInto($row,DB_FETCHMODE_OBJECT)) {
print $row->sign."\n";
}

Независимо от режима выборки методы по-прежнему возвращают NULL, если не осталось возвращаемых данных, и объект DB_Error в случае ошибки.


Режим числового массива по умолчанию может быть установлен с помощью параметра DB_FETCHMODE_ORDERED. Можно установить режим выборки, который будет использоваться во всех последующих вызовах методов fetchRow() или fetchInto(), с помощью метода DB::set-FetchMode():

$dbh->setFetchMode(DB_FETCHMODE_OBJECT);
while($row = $sth->fetchRow()) {
print $row->sign."\n";
}
// последующие запросы и вызовы метода fetchRow() также возвращают объекты

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Автоматическое присваивание уникальных значений идентификаторов
Извлечение строк без цикла
Кэширование запросов и результатов
Модификация данных в базе данных SQL
Определение количества строк, возвращенных запросом

Вернуться в раздел: PHP / 10. Доступ к базам данных