我编写了以下函数来构造和执行带有键值绑定的SQL语句。我正在使用bindValue()将键值对数组绑定到SQL字符串中的相应标识符。 (echo语句用于调试)。
public function executeSelect($sql, $bindings = FALSE)
{
$stmt = $this->dbPDO->prepare($sql);
if ($bindings)
{
foreach($bindings as $key => $value)
{
$success = $stmt->bindValue($key, $value);
echo "success = $success, key = $key, value = $value<br />";
if (!$success)
{
throw new Exception("Binding failed for (key = $key) & (value = $value)");
}
}
}
echo "Beginning execution<br />";
if ($stmt->execute())
{
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
else
{
return FALSE;
}
}
此功能的输入如下:
$stmt = "SELECT * FROM test WHERE id = :id";
$bindings = array(":id" => "3", ":Foo" => "Bar");
在通过$ bindings数组的第二个循环中,我希望$ success成功评估为false,因此抛出自定义Exception,因为“Bar”不能绑定到“:Foo
”,因为“{{1输入SQL中不存在。
相反,对于$ bindings数组中的两个键值对,$ success评估为true(1),并且 - &gt; execute():Foo
为什么bindValue不返回false?
答案 0 :(得分:1)
因为它以这种方式工作 它抛出错误不是在绑定而是在执行时。就这样。
因此,没有必要循环,你可以缩短你的方法。
public function executeSelect($sql, $bindings = FALSE)
{
$stmt = $this->dbPDO->prepare($sql);
$stmt->execute($bindings);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
我相信也没有必要检查执行结果 如果出现错误,它将引发异常。
顺便说一句,我会根据这个函数创建几个辅助函数,返回标量值和单行。他们非常有帮助。虽然我发现命名占位符有点沉闷。比较以下代码:
$name = $db->getOne("SELECT name FROM users WHERE group=?i AND id=?i",$group,$id);
vs.
$sql = "SELECT name FROM users WHERE group=:group AND id=:id";
$name = $db->getOne($sql,array('group' => $group, 'id' => $id));
命名需要比匿名代码多2倍的代码
WET
首字母缩略词的完美示例 - “写一切两次”