PHP PDO 获取 returns FALSE 当没有找到记录并且失败时
PHP PDO fetch returns FALSE when no records found AND on failure
PDO 方法 fetch() returns 值 FALSE
在没有找到记录时 和 失败时(例如,当出现问题时关于数据库访问)。
我需要能够区分这两种情况,并以相应的方式处理每一种情况:
- 在找不到记录时向用户显示一条消息,并且
- 失败时抛出异常。
所以,我的问题是:有没有办法以适当的方式处理结果?
感谢您的宝贵时间。
P.S.: 当没有找到记录时,我本以为会收到一个空数组,而当出现问题时,结果是 FALSE
。就像 fetchAll() 方法的情况一样。
更新:
方法 PdoStatement::fetch
在失败时抛出异常,而不是 FALSE
。这种情况在我的回答中得到了证明:
总之,正如@pucky124 已经说过的,差异化很容易实现:
PDOStatement::fetch
returns FALSE
如果没有找到记录。
PDOStatement::fetch
失败时抛出异常。
这就是 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
的用途。像这样使用它:
$pdo = new PDO(
'mysql:host=localhost;port=3306;dbname=mydb;charset=utf8'
, 'user'
, 'pass'
, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]
);
当以这种方式使用时,错误实际上会作为异常抛出。这意味着如果 fetch(或使用此 pdo 对象的其他方法)发生错误,将抛出异常并且该方法根本不会 return。这是处理 PDO 中错误的一种非常有效的方法。现在您知道如果获取 return 一个值没有发生错误,因此如果它为 false 那么查询 return 没有记录。
<?php
class Connect extends PDO
{
public function __construct()
{
parent::__construct("mysql:host=localhost;dbname=vicode", 'root', '',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$this->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
}
?>
PDO 方法 fetch() returns 值 FALSE
在没有找到记录时 和 失败时(例如,当出现问题时关于数据库访问)。
我需要能够区分这两种情况,并以相应的方式处理每一种情况:
- 在找不到记录时向用户显示一条消息,并且
- 失败时抛出异常。
所以,我的问题是:有没有办法以适当的方式处理结果?
感谢您的宝贵时间。
P.S.: 当没有找到记录时,我本以为会收到一个空数组,而当出现问题时,结果是 FALSE
。就像 fetchAll() 方法的情况一样。
更新:
方法 PdoStatement::fetch
在失败时抛出异常,而不是 FALSE
。这种情况在我的回答中得到了证明:
总之,正如@pucky124 已经说过的,差异化很容易实现:
PDOStatement::fetch
returnsFALSE
如果没有找到记录。PDOStatement::fetch
失败时抛出异常。
这就是 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
的用途。像这样使用它:
$pdo = new PDO(
'mysql:host=localhost;port=3306;dbname=mydb;charset=utf8'
, 'user'
, 'pass'
, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]
);
当以这种方式使用时,错误实际上会作为异常抛出。这意味着如果 fetch(或使用此 pdo 对象的其他方法)发生错误,将抛出异常并且该方法根本不会 return。这是处理 PDO 中错误的一种非常有效的方法。现在您知道如果获取 return 一个值没有发生错误,因此如果它为 false 那么查询 return 没有记录。
<?php
class Connect extends PDO
{
public function __construct()
{
parent::__construct("mysql:host=localhost;dbname=vicode", 'root', '',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$this->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
}
?>