Php mysqli error-bind_param:变量数量不';不匹配

Php mysqli error-bind_param:变量数量不';不匹配,php,mysqli,bindparam,Php,Mysqli,Bindparam,我得到以下错误,但我已经数了一遍又一遍,一切似乎都很好。有人对此有什么想法吗 错误: 警告:mysqli_stmt::bind_param()[mysqli stmt.bind param]:数量 变量与中已准备语句中的参数数不匹配 /home/ambnews/public_html/invoice/response.php在线 204 代码: //发票客户信息 //账单 $customer\u name=$mysqli->real\u escape\u字符串($\u POST['custome

我得到以下错误,但我已经数了一遍又一遍,一切似乎都很好。有人对此有什么想法吗

错误:

警告:mysqli_stmt::bind_param()[mysqli stmt.bind param]:数量 变量与中已准备语句中的参数数不匹配 /home/ambnews/public_html/invoice/response.php在线 204

代码:

//发票客户信息
//账单
$customer\u name=$mysqli->real\u escape\u字符串($\u POST['customer\u name']);//客户名称
$customer\u email=$mysqli->real\u escape\u字符串($\u POST['customer\u email']);//客户电子邮件
$customer\u address\u 1=$mysqli->real\u escape\u字符串($\u POST['customer\u address\u 1']);//客户地址
$customer\u address\u 2=$mysqli->real\u escape\u字符串($\u POST['customer\u address\u 2']);//客户地址
$customer\u town=$mysqli->real\u escape\u字符串($\u POST['customer\u town']);//客户镇
$customer\u county=$mysqli->real\u escape\u字符串($\u POST['customer\u county']);//客户县
$customer\u postcode=$mysqli->real\u escape\u字符串($\u POST['customer\u postcode']);//客户邮政编码
$customer\u phone=$mysqli->real\u escape\u字符串($\u POST['customer\u phone']);//客户电话号码
//船运
$customer\u name\u ship=$mysqli->real\u escape\u字符串($\u POST['customer\u name\u ship']);//客户名称(装运)
$customer_address_1_ship=$mysqli->real_escape_字符串($_POST['customer_address_1_ship']);//客户地址(发货)
$customer_address_2_ship=$mysqli->real_escape_字符串($_POST['customer_address_2_ship']);//客户地址(发货)
$customer\u town\u ship=$mysqli->real\u escape\u字符串($\u POST['customer\u town\u ship']);//客户镇(航运)
$customer\u country\u ship=$mysqli->real\u escape\u字符串($\u POST['customer\u country\u ship']);//客户县(航运)
$customer_postcode_ship=$mysqli->real_escape_字符串($_POST['customer_postcode_ship']);//客户邮政编码(发货)
$query=“插入门店\u客户(
名称
电子邮件
地址(一),
地址(二),
镇
县
邮政编码
电话
船名,
地址:1号船,
地址:2号船,
城市之舟,
县船,
邮政编码
)价值观(
“$customer_name.”,
“$customer_电子邮件。”,
“$customer\u address\u 1。”,
“$customer\u address\u 2.”,
“$customer_town.”,
“$customer_county。”,
“$customer_邮政编码。”,
“$customer_phone.”,
“$customer\u name\u ship.”,
“$customer\u address\u 1\u ship.”,
“$customer\u address\u 2\u ship.”,
“$customer\u town\u ship.”,
“$customer\u county\u ship.”,
“$customer\u postcode\u ship.”
);
";
/*准备报表*/
$stmt=$mysqli->prepare($query);
如果($stmt==false){
触发器_错误('error SQL:'.$query.'error:'.$mysqli->error,E_USER_error);
}
打印($stmt->绑定参数)(
“SSSSS ISSSSS”,
$customer\u name、$customer\u email、$customer\u address\u 1、$customer\u address\u 2、$customer\u town、$customer\u county、$customer\u postcode、,
$customer_phone、$customer_name_ship、$customer_address_1_ship、$customer_address_2_ship、$customer_town_ship、$customer_country_ship、$customer_postcode_ship));
/*绑定参数。类型:s=string,i=integer,d=double,b=blob*/
$stmt->bind_参数(
“SSSSS ISSSSS”,
$customer\u name、$customer\u email、$customer\u address\u 1、$customer\u address\u 2、$customer\u town、$customer\u county、$customer\u postcode、,
$customer\u phone、$customer\u name\u ship、$customer\u address\u 1\u ship、$customer\u address\u 2\u ship、$customer\u town\u ship、$customer\u country\u ship、$customer\u postcode\u ship);
/*执行语句*/
$stmt->execute();
如果($stmt->execute()){
//如果拯救成功
echo json_编码(数组(
“状态”=>“成功”,
'消息'=>'已成功创建客户!'
));
}否则{
//如果无法创建发票
echo json_编码(数组(
'状态'=>'错误',
'消息'=>'出现错误,请重试。'
$query = "INSERT INTO store_customers (
                name,
                email,
                // etc.
            ) VALUES (
                ?,
                ?,
                // etc.
            );
        ";
//调试 //'消息'=>'出现错误,请重试。'.$mysqli->错误。'.$query'。'
$query = "INSERT INTO store_customers (
                name,
                email,
                // etc.
            ) VALUES (
                ?,
                ?,
                // etc.
            );
        ";
)); } //关闭数据库连接 $mysqli->close();
您需要看看:

  • 当您使用准备好的语句时,不应该转义您的值,因为您将在数据中添加文字反斜杠
  • 您不应该在查询中插入变量,而应该使用占位符(mysqli中的问号)。这些都与你的价值观有关
  • 所以你的问题是:

    你要约束你的价值观:


    请注意,我使用的是
    bind_value()
    而不是
    bind_param()
    ,因为这似乎只使用了一次,所以不需要绑定参数,您可以直接绑定这些值。不过这不会有什么区别。

    您已经在查询中输入了值。然后再次使用bind_param。那是不对的。我对这件事很陌生,所以不确定我是否诚实。我应该如何最好地做到这一点?谢谢你的时间。@James我添加了一个例子。啊,是的,我刚刚完成了?,?,?,?分手了,工作很好,所以我不需要逃避岗位?它们在bind中是否会像您那样安全并防止sql注入?谢谢你的帮助。@James不,你不应该这样做,反斜杠会污染你的数据。准备好的查询和绑定参数将阻止sql
    $stmt->bind_value(
        'sssssssissssss',
        $_POST['customer_name'],
        $_POST['customer_email'],
        // etc.
    );