我不明白我的功能有什么问题?
我正在尝试此页面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
答案 0 :(得分:1)
准备好的语句使用?
和:something
作为真实数据的占位符,无论其类型是。换句话说,这里没有必要引用字符串:
SELECT challenge FROM im_accounts_challenges WHERE sessionid = ?
...因为这将在提供数据时自动完成。
你在这做什么......
SELECT challenge FROM im_accounts_challenges WHERE sessionid = '?'
...告诉SQL找到sessionid
等于 literal '?'
的所有行。这是允许的,因为有时你做需要使用固定字符串标准 - 即使在使用预准备语句时也是如此。
现在,'?'
被视为文字,因此声明中没有更多的占位符 - 任何绑定它们的尝试都会给出您所看到的警告。