SQL insert的PHP PDO语句有什么问题?

SQL insert的PHP PDO语句有什么问题?,php,sql,pdo,Php,Sql,Pdo,我已经存储了用户名、密码和其他变量,但我一直收到一个错误无效参数编号:绑定变量的数量与此行中的令牌数量不匹配: $database->query( 'INSERT INTO users_inactive(verCode, username, password, email, date, type) VALUES (:vercode, :username, :password, :email, :date, :type)', array( ':ve

我已经存储了用户名、密码和其他变量,但我一直收到一个错误无效参数编号:绑定变量的数量与此行中的令牌数量不匹配:

$database->query(
    'INSERT INTO users_inactive(verCode, username, password, email, date, type) 
    VALUES (:vercode, :username, :password, :email, :date, :type)', 
    array(
        ':vercode' => $verCode, 
        ':username' => $username, 
        ':password' => $password, 
        ':email' => $email, 
        ':date' => $date, 
        ':type'=>'customer')
);
有什么问题吗?我已确保这些列中的每一列都在我的user\u inactive表中可用

这是$database包装函数:

    public function query($query, $bind = null, $fetch = 'FETCH_ASSOC') {
    /* Prepare the query statement */
    $this->statement = $this->pdo->prepare($query);
    /* Bind each value supplied from $bind */
    if($bind != null) {
        foreach($bind as $select => $value) {
            /* For each type of value give the appropriate param */
            if(is_int($value)) {
                $param = PDO::PARAM_INT; 
            } elseif(is_bool($value)) {
                $param = PDO::PARAM_BOOL;
            } elseif(is_null($value)) {
                $param = PDO::PARAM_NULL;
            } elseif(is_string($value)) {
                $param = PDO::PARAM_STR;
            } else {
                $param = FALSE;
            }
            /* Bid value */
            if($param) {
                $this->statement->bindValue($select, $value, $param);
            }
        }
    }
    /* Execute Query & check for any errors */
    if(!$this->statement->execute()){
        $result = array(
            1 => 'false',
            2 => '<b>[DATABASE] Error - Query:</b> There was an error in sql syntax',
        );
        return $result;
    }
    /* Return all content */
    if($fetch == 'FETCH_ASSOC') {
        $result = $this->statement->fetch(PDO::FETCH_ASSOC);
    } elseif($fetch == 'FETCH_BOTH') {
        $result = $this->statement->fetch(PDO::FETCH_BOTH);
    } elseif($fetch == 'FETCH_LAZY') {
        $result = $this->statement->fetch(PDO::FETCH_LAZY);
    } elseif($fetch == 'FETCH_OBJ') {
        $result = $this->statement->fetch(PDO::FETCH_OBJ);
    } elseif($fetch == 'fetchAll') {
        $result = $this->statement->fetchAll();
    }
    return $result;
}
  }

摘自Tutis登录。

只是一些线索,您可能缺少一些冒号。在这里结账

或者您的冒号上可能存在一些区分大小写的问题

试一试:

<?php
$sql = $database->prepare(
'INSERT INTO users_inactive(verCode, username, password, email, date, type) 
VALUES (:vercode, :username, :password, :email, :date, :type)');
$sql->execute(array(
    'vercode' => $verCode, 
    'username' => $username, 
    'password' => $password, 
    'email' => $email, 
    'date' => $date, 
    'type'=>'customer')
);

错误似乎在包装器函数中。PDO::PARAM_NULL==0,因此此值不通过

if($param) {
    ...
}
因此,您不会为空值调用bindValue。相反,请使用:

if ($param !== FALSE) {
    ...
}
编辑-再次阅读您的代码,这将是foreach块的更好的代码,在将来生成更少的神秘错误消息:

    foreach($bind as $select => $value) {
        /* For each type of value give the appropriate param */
        if(is_int($value)) {
            $param = PDO::PARAM_INT; 
        } elseif(is_bool($value)) {
            $param = PDO::PARAM_BOOL;
        } elseif(is_null($value)) {
            $param = PDO::PARAM_NULL;
        } elseif(is_string($value)) {
            $param = PDO::PARAM_STR;
        } else {
            // Report error about invalid type and return from the function
            ...
        }
        // we should bind every value from $bind array, unconditionally!
        $this->statement->bindValue($select, $value, $param);
    }

这是一个PDO语句包装类,它执行带有参数的查询方法,而不是PDO::query?是的,它是一个包装类。就在几天前,它还运行得很好,我不知道出了什么问题。在没有看到方法定义的情况下,我们无法提供真正的帮助。看起来您的包装器类与查询或参数列表混在一起了。另一方面,我想-如果。。如果。。。如果。。。还有我知道的。。。我检查了冒号。。。不知道怎么了。什么时候需要冒号?是否将日期解析为字符串?否,$date=dateY-m-d H:i:s,time;verCode C必须是大写的,对吗?因为你在阵列中有小写字母谢谢!这就是问题所在$数据库不是PDO对象。这是一个自定义对象,我没看到。我也遇到过类似的问题,唯一能解决的方法就是使用?而不是:xxx。