【问题标题】:mysqli prepare and insert statements using variables to insert values and variables syntax errorsmysqli prepare and insert statements using variables to insert values and variables语法错误
【发布时间】:2014-09-02 17:17:27
【问题描述】:

您好,我正在尝试向我的数据库中插入一条记录。字段的数量是可变的,取决于用户表单提交。使用以下代码插入核心数据可以完美地工作

 if (!($stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)"))) {


    if ($insert_stmt = $mysqli->prepare("INSERT INTO submitted_orders (order_date,customer_id,customer_email,customer_name,customer_company,customer_message,country_name,city_name,site) VALUES (?, ?, ?, ?, ?, ?, ?,?, ?)")) {
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;

   //   
};
       if ( $insert_stmt->bind_param('sisssssss', $today,$_SESSION['customer_id'],$_SESSION['email'],$_SESSION['name'],$_SESSION['company_name'],$_SESSION['message'],$_SESSION['country_name'],$_SESSION['city_name'],$_SESSION['site'])) {    echo "Binding parameters failed: (" . $insert_stmt->errno . ") " . $insert_stmt->error;};
        // Execute the prepared query.
         if (!$insert_stmt->execute()) {
echo "Execute failed: (" . $insert_stmt->errno . ") " . $insert_stmt->error;
 }

所以我的问题是我定义了四个变量

$scounter(这包含我的额外字段的字符串整数值,回显测试将其值作为 sisisi

$qcounter(这包含要输入的字段数,回显显示值是?,?,?,?,?,?,

$input1(这包含所需的数据库字段列表 ech 显示测试值为 order_item1,order_item1_price,order_item2,order_item2_price,order_item3,order_item3_price,

$sinput2(这包含要输入其值的变量 echo 将测试值显示为 $order_item1,$order_item1_price,$order_item2,$order_item2_price,$order_item3,$order_item3_price,

我需要将变量内容输入到准备和绑定参数语句中,但努力使语法正确并不断收到“致命错误:在 /hsphere/ 中的非对象上调用成员函数 bind_param() local/home/mailman2/afbincludes/order_form_handler.php 第 141 行"消息

我真的很感谢一些帮助以使语法正确,另一种方法是添加 60 个字段,其中大部分将有空数据

这是我尝试插入变量的代码

if (!($stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)"))) {
//

// post data // Insert the new user into the database 
if ($insert_stmt = $mysqli->prepare("INSERT INTO submitted_orders ('".$input1.  "',order_date,customer_id,customer_email,customer_name,customer_company,customer_message,country_name,city_name,site) VALUES ('".$qcounter."'?, ?, ?, ?, ?, ?, ?,?, ?)")) {
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
//

//  
}; 
if ( $insert_stmt->bind_param($scounter.'sisssssss',$input2, $today,$_SESSION['customer_id'],$_SESSION['email'],$_SESSION['name'],$_SESSION['company_name'],$_SESSION['message'],$_SESSION['country_name'],$_SESSION['city_name'],$_SESSION['site'])) {    echo "Binding parameters failed: (" . $insert_stmt->errno . ") " . $insert_stmt->error;};
        // Execute the prepared query.
         if (!$insert_stmt->execute()) {
echo "Execute failed: (" . $insert_stmt->errno . ") " . $insert_stmt->error;
 }

【问题讨论】:

  • 如果条件失败,您的调试代码 (echo $mysqli->error) 将不会运行。此外,在您的 SQL 中添加一些空格。这是允许的。
  • 使用导致语法错误的变量发布您尝试过的代码。可能是$qcounter$input1$sinput2 都有尾随逗号,,这将导致->prepare() 失败。您可能需要在使用前使用rtrim(',', $qcounter)
  • 这是我尝试插入变量的代码

标签: php mysql mysqli


【解决方案1】:

如果您回显查询,您会看到语法错误。

if ($insert_stmt = $mysqli->prepare("INSERT INTO submitted_orders ('".$input1.  "',order_date,customer_id,customer_email,customer_name,customer_company,customer_message,country_name,city_name,site) VALUES ('".$qcounter."'?, ?, ?, ?, ?, ?, ?,?, ?)"))

应该是

if ($insert_stmt = $mysqli->prepare("INSERT INTO submitted_orders (".$input1.  " order_date,customer_id,customer_email,customer_name,customer_company,customer_message,country_name,city_name,site) VALUES (".$qcounter." ?, ?, ?, ?, ?, ?, ?,?, ?)"))

您在'$input1$qcounter 周围/之后删除单引号' 和逗号,。因为您的列名和占位符不应包含在引号中,并且它们的值中都有一个尾随逗号。

还有,

if ( $insert_stmt->bind_param($scounter.'sisssssss',$input2, $today,$_SESSION['customer_id'],$_SESSION['email'],$_SESSION['name'],$_SESSION['company_name'],$_SESSION['message'],$_SESSION['country_name'],$_SESSION['city_name'],$_SESSION['site']))

应该是

if ( $insert_stmt->bind_param($scounter.'sisssssss',rtrim($input2, ','),  $today,$_SESSION['customer_id'],$_SESSION['email'],$_SESSION['name'],$_SESSION['company_name'],$_SESSION['message'],$_SESSION['country_name'],$_SESSION['city_name'],$_SESSION['site']))

$input2 中删除尾随逗号 , 的位置

【讨论】:

  • 感谢 Sean 我已更改但得到 Parse error: syntax error, unexpected T_VARIABLE in /hsphere/local/home/mailman2/afbincludes/order_form_handler.php 在第 146 行可能是因为 var input2 和今天?
  • 是的,意识到这可能是个问题。我已将其更新为rtrim($input2, ','),。尽管您之前可能需要这样做,即。 $input2 = rtrim($input2, ','); 然后在查询中使用更新后的$input2
  • 使用修剪来纠正看不到另一个错误,但需要查看 var,因为没有选择添加的字段所有 4 个 var 都变为 null 并获取错误也仍然有相同的消息 - 将添加回显以尝试找到
  • ok progressing new error not seen before as below will need to translate - Prepare failed: (0) Warning: mysqli_stmt::bind_param(): Number of elements in type definition string does not match number of在第 147 行的 /hsphere/local/home/mailman2/afbincludes/order_form_handler.php 中绑定变量执行失败:(2031) 没有为第 85 行准备好的语句中的参数提供数据,
猜你喜欢
  • 1970-01-01
  • 2016-07-02
  • 2013-09-19
  • 2013-08-25
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多