Php SQLSTATE[HY093]:所有参数都填写正确,语法正确吗?

Php SQLSTATE[HY093]:所有参数都填写正确,语法正确吗?,php,mysql,Php,Mysql,我得到以下错误: SQLSTATE[HY093]:无效参数编号:绑定变量的数量与中的令牌数量不匹配 代码如下: $transactions_sql = "INSERT INTO transactions (usr, service, txn_id, orig_amount, currency, date, description, fee_amt, fee_currency, fee_descr, fee_type, net_amt, status) VALUES "; $transact

我得到以下错误:

SQLSTATE[HY093]:无效参数编号:绑定变量的数量与中的令牌数量不匹配

代码如下:

$transactions_sql = "INSERT INTO transactions (usr, service, txn_id, orig_amount, currency, date, description, fee_amt, 
  fee_currency, fee_descr, fee_type, net_amt, status) VALUES ";
$transactions_sql_data = array_fill(0, count($transactions), "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
$transactions_sql .= implode(",", $transactions_sql_data);
$stmt = $conn->prepare($transactions_sql);
$i = 1;
foreach ($transactions["data"] as $tr) {
  $stmt->bindValue($i++, $id, PDO::PARAM_INT);
  $stmt->bindValue($i++, $tr["service"], PDO::PARAM_STR);
  $stmt->bindValue($i++, $tr["id"], PDO::PARAM_INT);
  $stmt->bindValue($i++, $tr["amount"], PDO::PARAM_INT);
  $stmt->bindValue($i++, $tr["currency"], PDO::PARAM_STR);
  $stmt->bindValue($i++, $tr["created"], PDO::PARAM_STR);
  $stmt->bindValue($i++, $tr["description"], PDO::PARAM_STR);
  $stmt->bindValue($i++, $tr["fee_details"][0]["amount"], PDO::PARAM_INT);
  $stmt->bindValue($i++, $tr["fee_details"][0]["currency"], PDO::PARAM_STR);
  $stmt->bindValue($i++, $tr["fee_details"][0]["description"], PDO::PARAM_STR);
  $stmt->bindValue($i++, $tr["fee_details"][0]["type"], PDO::PARAM_STR);
  $stmt->bindValue($i++, $tr["net"], PDO::PARAM_INT);
  $stmt->bindValue($i++, $tr["status"], PDO::PARAM_STR);
}
$stmt->execute();

执行
var\u dump($transactions\u sql)
打印
“插入余额交易(usr、服务、txn\u id、原始金额、货币、日期、说明、费用金额、费用货币、费用描述、费用类型、净金额、状态)值(
,这是正确的(根据问号的数量-在
$tr
数组中只有三个数组)。

结果是,我必须在
计数($transactions)
中添加一个
-1
,它才能工作。看起来它添加了太多的一组参数

以下是有效的方法:
$transactions\u sql\u data=array\u fill(0,count($transactions),“(?,?,,,,,,,,,,,,,,?)”


谢谢大家的帮助

bindValue
的第一个参数在循环迭代中是常量,因此看起来下一组值将替换上一组值,而不是作为新参数添加。这很奇怪,因为我用于引用。当他使用常量参数名称时,他会为每个循环迭代执行一次语句,所以参数不会发生碰撞。在单查询示例中,他使用
$i++
而不是常量整数,这样相同的索引就不会被重用。您能检查一下吗<代码>$stmt->bindValue(2,tr[“服务”],PDO::PARAM_STR)。这不是一个
$tr[“服务”]
计数($transactions)-1
<为什么
-1