PDO无效参数数:绑定变量数与令牌数不匹配


PDO Invalid parameter number: number of bound variables does not match number of tokens

我有三个":"(名字)

$q = $db->prepare('INSERT INTO '.PRFX.'u 
    (phone,mail,lvl,regdate,act_lnk,joined,name,first_time) 
    VALUE(:phone,:mail,0,"'.time().'","'.md5(uniqid(mt_rand(),1)).'","'.DATETIME.'",:name,1)');
$q->execute(
    array(
        'phone'=>$_POST['phone'],
        'mail'=>$_POST['mail'],
        'name'=>$_POST['name']
        )
    );

它们是匹配的。为什么会出现错误呢?

我猜应该是

array(
        ':phone'=>$_POST['phone'],
        ':mail'=>$_POST['mail'],
        ':name'=>$_POST['name']
        )

不能像使用0, time()和其他PHP函数那样在prepare()方法中混合使用命名参数和实际值。

prepare()方法需要从实际值中解放出来,因为DBMS不期望任何值,也不会解析查询。它只创建查询的执行计划。你的代码应该像这样:

$q = $db->prepare('INSERT INTO ' . PRFX . 'u 
    (phone,mail,lvl,regdate,act_lnk,joined,name,first_time) 
    VALUE(:phone,:mail,:lvl,:regDate,:actLink,:joined,:name,:firstTime)');
$q->execute(
    array(
        ':phone'    => $_POST['phone'],
        ':mail'     => $_POST['mail'],
        ':name'     => $_POST['name'],
        ':lvl'      => 0,
        ':regDate'  => time(),
        ':actLink'  => md5(uniqid(mt_rand(),1)),
        'joined'    => DATETIME,
        'firstTime' => 1
        )
    );

您还应该检查您将要使用的$_POST变量是否已设置,非空并且具有预期的值类型。

此外,我建议使用bindValue()将值绑定到查询。然后你还可以定义变量类型:

$q->bindValue(':phone', $_POST['phone'], PDO::PARAM_STR);
$q->bindValue(':regDate', time(), PDO::PARAM_INT);
...
$q->execute();