Вопрос
Я обновляю некоторый код из старых функций mysql_* в PDO.Он подключается без проблем, выполняет запрос без проблем, но результирующий набор пуст.PDO::query() должен возвращать объект PDOStatement, но взамен я получаю true.Сообщений о каких-либо ошибках не поступало.
Вот мой код:
try
{
$DB = new PDO("mysql:host=localhost;dbname=dbname", "user", "pass");
$stmt = $DB->prepare("SELECT * FROM report_clientinfo");
$stmt->execute();
}catch(PDOException $e)
{
echo $e->getMessage() . "\n";
}
echo gettype($stmt) . "\n";
if ($stmt) echo "true\n";
else echo "false\n";
$resultset = $stmt->fetchAll();
if(empty($resultset))
{
exit("ERROR: getClientInfo query failed.");
}
$DB = null;
print_r($resultset);
Результат, который я вижу, таков:
объект верно ОШИБКА:Сбой запроса getClientInfo.
Есть какие-нибудь идеи, почему он не возвращает никаких результатов?
Решение
object
true
ERROR: getClientInfo query failed.
Мне кажется, это похоже на твой PDOStatement $stmt
на самом деле сообщается, что переменная является объектом, а не "true
".Затем код печатается "true
" когда он увидит , что $stmt
не равен нулю, каковым он и является, потому что это объект.
Я рекомендую вам проверить возвращаемое значение из $stmt->execute()
.Возможно, у вас ошибка SQL.Например, если вы неправильно написали имя таблицы или таблица не существует в базе данных "dbname
" тот, к кому вы подключились, или пользователь, от имени которого вы входите в систему, не имеет права запрашивать эту таблицу.
Также проверьте $stmt->errorInfo()
чтобы получить более подробную информацию о любой возникшей ошибке.
Другие советы
Мне немного неловко сообщать, что я указывал не на тот DSN.Наверное, это то, что я получаю за попытку узнать что-то новое всего за несколько часов сна после выхода куда-нибудь в канун Нового года.Спасибо за совет по методу PDOStatement:: errorInfo(), я раньше этого не замечал.