【发布时间】: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。 -
这样即使结果为假,该类仍将存在,并具有该类中所述的默认值。听起来不错