【发布时间】:2018-03-02 18:18:27
【问题描述】:
根据 php 文档,PDO 方法 fetch() 在没有找到记录时返回值 FALSE,在失败时和(例如,当数据库访问出现问题时)。
假设,我将 PHP 错误报告系统设置为在失败时抛出异常:
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
我需要一个案例,fetch() 方法会抛出异常的情况。为什么?因为我要检查,所以要 100% 确定 fetch() 在失败时抛出异常,而不仅仅是在失败时返回 FALSE。
如果是这样的话,我确实会认为fetch()返回的FALSE是在db表中没有找到任何记录的结果。
所以,我的问题是:你知道模拟fetch() 方法失败情况的方法吗?
谢谢。
P.S.:我的问题的答案将帮助我找到其他问题的答案:PHP PDO fetch returns FALSE when no records found AND on failure
编辑 1:
我还准备了一个示例,展示我如何处理异常。这是一个简单的 sql 查询,从 users 表中获取用户:
<?php
// Activate error reporting.
error_reporting(E_ALL);
ini_set('display_errors', 1);
try {
// Create a PDO instance as db connection to a MySQL db.
$connection = new PDO(
'mysql:host=localhost;port=3306;dbname=mydb;charset=utf8'
, 'myuser'
, 'mypass'
, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => FALSE,
PDO::ATTR_PERSISTENT => TRUE
)
);
// Define the sql statement.
$sql = 'SELECT * FROM users WHERE name = :name';
/*
* Prepare and validate the sql statement.
*
* --------------------------------------------------------------------------------
* If the database server cannot successfully prepare the statement, PDO::prepare()
* returns FALSE or emits PDOException (depending on error handling settings).
* --------------------------------------------------------------------------------
*/
$statement = $connection->prepare($sql);
if (!$statement) {
throw new UnexpectedValueException('The sql statement could not be prepared!');
}
// Bind the input parameter to the prepared statement.
$bound = $statement->bindValue(':name', 'Sarah', PDO::PARAM_STR);
// Validate the binding of the input parameter.
if (!$bound) {
throw new UnexpectedValueException('An input parameter can not be bound!');
}
/*
* Execute the prepared statement.
*
* ------------------------------------------------------------------
* PDOStatement::execute returns TRUE on success or FALSE on failure.
* ------------------------------------------------------------------
*/
$executed = $statement->execute();
if (!$executed) {
throw new UnexpectedValueException('The prepared statement can not be executed!');
}
/*
* Fetch and validate the result set.
*
* =========================================================
* Note:
* =========================================================
* PDOStatement::fetch returns FALSE not only on failure,
* but ALSO when no record is found!
*
* Instead, PDOStatement::fetchAll returns FALSE on failure,
* but an empty array if no record is found. This is the
* natural, desired behaviour.
* =========================================================
*/
$resultset = $statement->fetch(PDO::FETCH_ASSOC);
if ($resultset === FALSE) {
throw new UnexpectedValueException('Fetching data failed!');
}
// Display the result set.
var_dump($resultset);
echo '<pre>' . print_r($resultset, TRUE) . '</pre>';
// Close connection.
$connection = NULL;
} catch (PDOException $exc) {
echo '<pre>' . print_r($exc, TRUE) . '</pre>';
exit();
} catch (Exception $exc) {
echo '<pre>' . print_r($exc, TRUE) . '</pre>';
exit();
}
我使用了以下创建表语法:
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=124 DEFAULT CHARSET=utf8;
以及下表中的值:
INSERT INTO `users` (`id`, `name`)
VALUES
(1,'Sarah'),
(2,'John');
所以,表格如下所示:
id name
--------
1 Sarah
2 John
【问题讨论】:
-
启用基于异常的错误报告
-
手册说:“这个函数在成功时的返回值取决于获取类型。在所有情况下,失败时返回 FALSE。”。我希望它在没有结果时返回
NULL。因此可以进行两种不同的测试:if ($result === FALSE) ...测试失败,if (!isset($result)) ....或if (is_null($result))测试没有记录。 -
谢谢,@teresko。我已经有了。但是,由于 php.net 说,失败时返回 FALSE,我真的不知道,如果失败时抛出异常,而不是 FALSE。
-
好吧,在这种情况下处理异常是要走的路。试试吧。它会起作用的。
-
@MasivuyeCokile 终于找到了一个案例,让我模拟了
PDOStatement::fetch()的失败情况。我发布了一个答案。再次感谢您的 cmets!
标签: php mysql pdo exception-handling fetch