我有以下功能:
function get_config($name = '')
{
$config = array();
$row = array();
$sql = "SELECT * FROM ".$GLOBALS['prefix']."config ";
if ('' != $name) {$sql .= " WHERE name = '". $name ."'";}
$result = $GLOBALS['conn']->query($sql);
while ($row = $result->fetch()) {$config[$row['name']] = $row['value'];}
if ('' != $name){return $config[$name];}
}
我用它来调用我的所有网站设置。我想为此使用预备语句。
这是我在添加准备声明时所做的事情:
function get_config($name = '')
{
$config = array();
$row = array();
$sql = "SELECT * FROM config";
if ('' != $name) {
$sql .= " WHERE name = 'home'";
}
$result = $GLOBALS['conn']->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$result->execute(array(':name' => $name));
while ($row = $result->fetch()) {
$config[$row['name']] = $row['value'];
}
if ('' != $name) {
return $config[$name];
}
}
但是现在功能不起作用了。为什么不工作?
答案 0 :(得分:3)
从(现已删除)duplicate迁移我的答案。
您正在使用:name
占位符执行该语句,但查询本身并不存在:
function get_config($name = 'home')
{
$config = array();
$row = array();
$sql = "SELECT value FROM config WHERE name = :name";
$result = $GLOBALS['conn']->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$result->execute(array(
':name' => $name
));
return array(
$name => current($result->fetchALL(PDO::FETCH_COLUMN, 0))
);
}
改变了什么
两个主要变化:
function get_config($name = 'home')
在没有参数的情况下调用函数时,$name
默认为'home'
。
return current($result->fetchAll(PDO::FETCH_COLUMN, 0));
fetchAll()
返回一个数组,每个数组条目中只有第一列。在{16}上应用current()
将返回第一个(也是唯一的)数组条目,如果数组为空,则返回false
。
<强>注意强>
建议不要使用$GLOBALS
中的数据库句柄;最好是在get_config()
中传递实例,或者让get_config()
成为在构造函数中作为数据库句柄接收的类中的方法。