【问题标题】:Query not executed Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens查询未执行 Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
【发布时间】:2021-08-28 12:12:38
【问题描述】:

我的 sql 查询出现以下错误。相同的查询在其他服务器上运行良好。 错误: 致命错误:未捕获的 PDOException:SQLSTATE[HY093]:无效的参数号:绑定变量的数量与 C:\xampp\htdocs\sms\send_link.php:59 中的标记数量不匹配堆栈跟踪:#0 C:\xampp\ htdocs\sms\send_link.php(59): PDOStatement->execute() #1 {main} 在第 59 行的 C:\xampp\htdocs\sms\send_link.php 中抛出(第 59 行是 $query->execute() ;)

             $expFormat = mktime(date("H"), date("i"), date("s"), date("m"), date("d") + 1, date("Y"));
             $expDate = date("Y-m-d H:i:s", $expFormat);
             $key = md5(time());
             $addKey = substr(md5(uniqid(rand(), 1)), 3, 10);
             $key = $key . $addKey;
                $sql="INSERT INTO `password_reset_temp` (`email`, `key`, `expDate`) VALUES ('" . $email . "', '" . $key . "', '" . $expDate . "');";
                $query = $dbh->prepare($sql);
                $query->bindParam(':email',$email,PDO::PARAM_STR);
                $query->bindParam(':key',$key,PDO::PARAM_STR);
                $query->bindParam(':expDate',$expDate,PDO::PARAM_STR);
                $query->execute();

【问题讨论】:

  • 不要连接变量的值,而是放置占位符。
  • @stickybit 你能解释一下吗
  • 嗯,我已经解释过了...不要连接变量,如$email 等,而是将占位符如:email 等放入查询中。并在您这样做时删除引号 (')。当变量绑定到查询时,将自动设置正确的引号。 (也许还可以再次查看教程或文档中的示例,并仔细查看他们如何在查询中使用占位符。
  • @stickybit 我的查询现在是 $sql="INSERT INTO password_reset_temp(email,key,expDate) VALUES(:email,:key,:expDate)";
  • @stickybit 它给出了错误 - 致命错误:未捕获的 PDOException:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在 C:\xampp\htdocs\sms 的第 1 行附近的 'key,expDate) VALUES('xxxxxxx@xxxx.org','8f46cc337bb661a650397f613266...' 附近使用正确的语法\send_link.php:60 堆栈跟踪:#0 C:\xampp\htdocs\sms\send_link.php(60): PDOStatement->execute() #1 {main} 在 C:\xampp\htdocs\sms\send_link 中抛出.php 在第 60 行

标签: php sql


【解决方案1】:
  1. 不要连接变量的值,而是放置占位符。
  2. key是mysql中的关键字避免使用这个试试下面的代码。
$expFormat = mktime(date("H"), date("i"), date("s"), date("m"), date("d") + 1, date("Y"));
$expDate = date("Y-m-d H:i:s", $expFormat);
$key = md5(time());
$addKey = substr(md5(uniqid(rand(), 1)), 3, 10);
$key1 = $key . $addKey;
$sql="INSERT INTO password_reset_temp(email,key1,expDate) VALUES(:email,:key1,:expDate)";    
$query = $dbh->prepare($sql);
$query->bindParam(':email',$email,PDO::PARAM_STR);
$query->bindParam(':key1',$key1,PDO::PARAM_STR);
$query->bindParam(':expDate',$expDate,PDO::PARAM_STR);
$query->execute();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2013-03-19
    • 2018-04-22
    • 1970-01-01
    相关资源
    最近更新 更多