无法让我准备好的声明工作

时间:2013-02-24 21:47:03

标签: php pdo

我有以下功能:

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];
    }
}

但是现在功能不起作用了。为什么不工作?

1 个答案:

答案 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()成为在构造函数中作为数据库句柄接收的类中的方法。