【问题标题】:PDO Invalid parameter number: number of bound variables does not match number of tokensPDO 参数号无效:绑定变量的数量与标记的数量不匹配
【发布时间】:2014-05-17 05:48:04
【问题描述】:

我有三个“:”(名字)

$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']
        )
    );

它们是匹配的。那么为什么我会收到错误消息?

【问题讨论】:

  • 可能是因为_POST['mail']为空?如何解决这个问题?
  • 正确转义你的字符串
  • 我已经做到了:if(empty($_POST['mail'])) $_POST['mail'] = "0";,它似乎工作
  • 是否可以将 EMPTY 值添加到数据库?并且仍然没有错误地接受它?
  • 这将取决于您的表结构,例如您的表是否允许插入 NULL 值

标签: php mysql database pdo


【解决方案1】:

我猜应该是

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

【讨论】:

    【解决方案2】:

    您不能像使用 0time() 和其他 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多