Разработчику. Сборник рецептов PHP
Задавайте вопросы

Выполнение запросов к базе данных 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']));

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

По умолчанию методы 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::setFetchMode():

$dbh->setFetchMode(DB_FETCHMODE_OBJECT);

while($row = $sth->fetchRow()) {
     print $row->sign."\n";

}

// последующие запросы и вызовы метода fetchRow() также возвращают объекты

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ