-3

我有以下功能:

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

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

4

1 回答 1

3

从(现已删除)副本中迁移我的答案。

您正在使用: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()每个数组条目中只有第一列。应用current()它返回第一个(也是唯一的)数组条目,或者false如果数组为空。

警告

$GLOBALS不推荐使用来自的数据库句柄;最好将实例传入get_config()get_config()作为类中的方法,在其构造函数中作为数据库句柄接收。

于 2013-02-24T22:36:11.530 回答