第39行似乎有错误,我无法弄清楚是什么,请指出我的错误?

时间:2019-02-28 16:05:15

标签: php

创建了一个登录页面,但是执行后,出现以下错误:

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);

3 个答案:

答案 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);