【问题标题】:PDO error: bound variables do not matchPDO 错误:绑定变量不匹配
【发布时间】:2026-01-04 04:30:01
【问题描述】:

在第 33 行和第 54 行出现这些错误(我的语句执行两个查询的行),但不知道为什么。看起来我的绑定变量都排成一行。有什么想法吗?

Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens... on line 33

Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens... on line 54

另外,我担心这是否会起作用并且绑定将接受具有正确值的 $SID2 变量,但在解决上述错误之前无法判断: $SID = $dbh->lastInsertId(); $SID2 = $SID;

以下是相关代码:

$dbh = new pdo('mysql:host='.$hostName.';dbname='.$dataBaseName, $user, $pass);

if(isset($_POST ['submit'])){

$user_ID = get_current_user_id();

$sql = "INSERT INTO stories(ID,
category,
genre,
rating,
story_name,
active) VALUES (
:ID, 
:genre, 
:rating, 
:story_name, 
:active)";

$stmt = $dbh->prepare($sql);
$stmt->bindParam(':ID', $user_ID, PDO::PARAM_STR);       
$stmt->bindParam(':category', $_POST['category'], PDO::PARAM_STR); 
$stmt->bindParam(':genre', $_POST['genre'], PDO::PARAM_STR); 
$stmt->bindParam(':rating', $_POST['rating'], PDO::PARAM_STR); 
$stmt->bindParam(':story_name', $_POST['story_name'], PDO::PARAM_STR);   
$stmt->bindParam(':active', $a = 0, PDO::PARAM_STR);                                        
$stmt->execute();    //line 33---error line
$SID = $dbh->lastInsertId();
$SID2 = $SID;


$sql2 = "INSERT INTO writing(ID,
SID,
text,
position,
approved) VALUES (
:ID,
:SID,
:text,
:position,
:approved)";
$stmt2 = $dbh->prepare($sql2);   
$stmt->bindParam(':ID', $user_ID, PDO::PARAM_STR);       
$stmt->bindParam(':SID', $SID2, PDO::PARAM_STR); 
$stmt->bindParam(':text', $_POST['text'], PDO::PARAM_STR); 
$stmt->bindParam(':position', $b = 0, PDO::PARAM_STR); 
$stmt->bindParam(':approved', $c = 0, PDO::PARAM_STR); 
$stmt->execute();  //line 54--error line

【问题讨论】:

  • 嗨,Jaw,你还需要这方面的帮助吗

标签: mysql pdo


【解决方案1】:

在第一个 sql 中缺少一个值

VALUES (
:ID, 
:category,  ---> inserted
:genre, 
:rating, 
:story_name, 
:active)";

我认为第二个应该是 stmt2 而不是 stmt(也是 bind`s)

【讨论】:

  • 很好,这是其中的一部分。第一个查询工作正常并插入所有。但是第二个 stmt2 查询没有任何反应。不创建记录。我认为这可能是因为它没有从 $SID = $dbh->lastInsertId(); $SID2 = $SID;但不确定...
  • @jaw 有任何错误信息吗? “警告”消失了吗?而你在第二部分将所有stmt 更改为stmt2
  • 是的,我将 stmt 更改为 stmt2 并且根本没有错误消息。这几乎就像第二个查询不存在:(
  • 有没有加echo $arr = $sth->errorInfo(); print_r($arr); ?> 查看db语句执行时有没有报错信息?
  • 我现在做到了。没有告诉我太多。返回: PDO::errorInfo(): Array ( [0] => 00000 [1] => [2] => )
【解决方案2】:

在您的 sql2 中,您绑定到错误的 PDO 对象。您使用 $stmt->bindParam() 而不是 $stmt2->bindParam();

只需在 $sql2 查询中将 $stmt 替换为 $stmt2。

【讨论】:

  • 没错。但是没有任何东西被插入到写字台中。故事表的插入效果很好......
最近更新 更多