让PDO::fetch(PDO::fetch_CLASS)返回对象的null值实例,而不是bool(false)


Having PDO::fetch(PDO::FETCH_CLASS) return a null-valued instance of the object instead of a bool(false)

我的用户通过web界面管理公司的客户。他们可以使用输入(以及其他方式)导航到客户端,直接选择客户端id,这将向他们显示客户端条目。

为此,我使用PDO::FETCH_CLASS映射php对象中的数据库值。然后使用这些对象生成html;所述html将作为客户端id显示在屏幕上。

$oSTMT = $oDB->prepare("SELECT id,name FROM clients WHERE id=?");
$oSTMT->setFetchMode(PDO::FETCH_CLASS,'client');
$oSTMT->execute(array(12673));
$oClient = $oSTMT->fetch(); // returns false when no row is selected
$oClient->makeHTML(); // which resultd in Fatal error: Call to a member function on a non-object

在重新设计让一个对象包裹提取的对象,这样如果它是布尔值,它就不会中断之前,我无论如何都会尝试让PDO生成一个实例化对象。

我的问题有两个:在输入中输入一个不存在的客户端id,然后创建一个新的客户端。在这两种情况下,客户端id都不指向数据库中的任何行;execute(array([values])将返回bool(true)(成功执行的语句),但->fetch(PDO::FETCH_CLASS,'client')将返回一个bool(false)

我的解决方案是创建一个id=0的客户端行,这样当它不存在时,我用id=0查询以获得我的"默认"客户端行,但我想知道:

当语句未选择行时,是否有命令指示PDO::FETCH_CLASS生成所选对象的实例

这也将使我不必首先验证id是否存在(我承认这并没有那么昂贵,但我不想这样做)

首先实例化类,然后使用FETCH_INTO而不是FETCH_CLASS

$client = new client();
$oSTMT = $oDB->prepare("SELECT id,name FROM clients WHERE id=?");
$oSTMT->setFetchMode(PDO::FETCH_INTO,$client);
$oSTMT->execute(array(12673));
$client = $oSTMT->fetch();
$client->makeHTML();