Необходимо извлечь некоторую информацию из базы данных.
Сначала вызовите функцию 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() также возвращают объекты