我得到PDO无效参数错误的原因未知

时间:2013-09-30 06:54:54

标签: php pdo

我不明白我的功能有什么问题?

我正在尝试此页面http://php.net/manual/en/pdostatement.execute.php上的示例#2,但告诉我参数号无效。但我不明白为什么它有效?

if (!isset($_SESSION)) session_start();
$sql = "SELECT challenge FROM challenges WHERE sessionid=':sessionid' AND timestamp > :timestamp LIMIT 1;";
$params = array(':sessionid'=>session_id(), ':timestamp'=>time());

function pdoRS($sql, $params) {
    try {
        // Prepare Query
        $stmt = $dbConn->prepare($sql);
        $stmt->execute(($params!=""?$params:NULL));
        $result = $stmt->fetchAll();
        return $result;
    }
    catch (PDOException $e) {
        // Output error
        echo 'Execution Exception: '.$e->getMessage());
        return;
    }
}

print_r(pdoRS($sql,params));

即使我将其更改为:

    $sql = "SELECT challenge FROM im_accounts_challenges WHERE sessionid='?' AND timestamp > ? AND isauthenticated=1 LIMIT 1;";
    $params = array(session_id(), time());

我仍然得到同样的信息:

Execution Exception: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

1 个答案:

答案 0 :(得分:1)

准备好的语句使用?:something作为真实数据的占位符,无论其类型是。换句话说,这里没有必要引用字符串:

SELECT challenge FROM im_accounts_challenges WHERE sessionid = ?

...因为这将在提供数据时自动完成。

你在这做什么......

SELECT challenge FROM im_accounts_challenges WHERE sessionid = '?'

...告诉SQL找到sessionid等于 literal '?'的所有行。这是允许的,因为有时你需要使用固定字符串标准 - 即使在使用预准备语句时也是如此。

现在,'?'被视为文字,因此声明中没有更多的占位符 - 任何绑定它们的尝试都会给出您所看到的警告。