0

我不明白我的功能做错了什么?

我正在此页面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
4

1 回答 1

1

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

SELECT challenge FROM im_accounts_challenges WHERE sessionid = ?

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

你在这里做什么...

SELECT challenge FROM im_accounts_challenges WHERE sessionid = '?'

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

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

于 2013-09-30T07:04:37.303 回答