【问题标题】:Having PDO::fetch(PDO::FETCH_CLASS) return a null-valued instance of the object instead of a bool(false)让 PDO::fetch(PDO::FETCH_CLASS) 返回对象的空值实例而不是 bool(false)
【发布时间】:2014-09-30 13:38:55
【问题描述】:

我的用户通过网络界面管理公司的客户。他们可以使用(除其他外)输入直接选择客户端 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
  • 这样即使结果为假,该类仍将存在,并具有该类中所述的默认值。听起来不错

标签: php oop pdo


【解决方案1】:

先实例化类,然后用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();

【讨论】:

    猜你喜欢
    • 2016-08-31
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2017-12-07
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多