创建了一个登录页面,但是执行后,出现以下错误:
number of bound variables does not match number of tokens in ..\login1.php line 39
下面是login1.php中的代码,我做错了什么?
// query
$result = $handle->prepare("SELECT * FROM user WHERE username= ? AND password = ?");
$result->bindParam('?', $user, PDO::PARAM_STR);
$result->bindParam('?', $password, PDO::PARAM_STR);
$result->execute(); //line 39
$rows = $result->fetch(PDO::FETCH_NUM);
答案 0 :(得分:1)
您正在混淆绑定值的两种不同方式。如果您要使用通用占位符(即?),则需要以正确的顺序传递execute()值数组,例如$result->execute([$user,$password])
。
如果您要绑定值,则占位符必须是唯一的,例如"... WHERE username = :user AND password = :pass
$result->bindParam(':user', $user, PDO::PARAM_STR);
$result->bindParam(':pass', $password, PDO::PARAM_STR);
后者的优点(您正在尝试使用)是您可以绑定一次,但可以在多个地方使用它,例如
"...SELECT * FROM TABLE t, INNER JOIN TABLE_B b ON (t.col = b.col) WHERE b.id = :id AND t.id = :id ....
$result->bindParam(':id', $id, PDO::PARAM_INT);
即使您不打算单独绑定,而是使用execute([array]),您仍然可以命名绑定,例如
$result->execute([':bind1' => $val1,':bind2'=>$val2 etc....])
始终最好指定绑定,以最大程度地减少错误的绑定值
答案 1 :(得分:0)
在bindParam中,不要使用问号'?'使用像
这样的参数索引位置$result->bindParam(1, $user, PDO::PARAM_STR);
$result->bindParam(2, $password, PDO::PARAM_STR);
答案 2 :(得分:0)
尝试通过这种方式完成
$result = $handle->prepare("SELECT * FROM user WHERE username= ? AND password = ?");
$result->bindParam(1, $user, PDO::PARAM_STR);
$result->bindParam(2, $password, PDO::PARAM_STR);
$result->execute(); //line 39
$rows = $result->fetch(PDO::FETCH_NUM);