【问题标题】:How to insert data in multiple tables using a prepared statement in PHP?如何在 PHP 中使用准备好的语句在多个表中插入数据?
【发布时间】:2018-04-16 21:47:29
【问题描述】:

我有两张表是billing_info, shipping_info。 billing_id 是主键,billing_id 是 shipping_info 中的外键。

我有 billing_info 地址表格。用户将填写账单信息,填写信息后有一个复选框,称为shipping address is different。如果任何用户选中该复选框,那么它将询问运输信息。根据数据填写运输信息后,billing info 将存储在 billing_info 表中,shipping_info 将存储在 shipping info 表中。

如果用户未选中该复选框,则只有帐单信息将存储在帐单信息表中。

<input type="checkbox" name="shipping_status" value="1">

如果用户未选中复选框但在选中复选框后无法插入数据,我只能将数据插入到 billing_info 的数据库中。 查询可能存在一些问题。我试过查询是

1)  START TRANSACTION;
    INSERT INTO table1 (column name)VALUES (values);
    INSERT INTO table2 (column name) VALUES (values);
    COMMIT;

 2) BEGIN;
    INSERT INTO table1 (column name)VALUES (values);
    INSERT INTO table2 (column name) VALUES (values);
    COMMIT; 

但仍然无法插入数据。 你愿意帮忙吗?

这是存储 int 用户信息的正确方法吗?

if (isset($_POST['submit'])){
  $b_firstname=$conn->real_escape_string(trim($_POST['b_firstname']));
  $b_lastname=$conn->real_escape_string(trim($_POST['b_lastname']));
  $b_address =$conn->real_escape_string(trim($_POST['b_address']));
  $b_country=$conn->real_escape_string(trim($_POST['b_country']));
  $b_state=$conn->real_escape_string(trim($_POST['b_state']));
  $b_city=$conn->real_escape_string(trim($_POST['b_city']));
  $b_pincode=$conn->real_escape_string(trim($_POST['b_pincode']));
  $b_mobileno=$conn->real_escape_string(trim($_POST['b_mobileno']));
  //$login_user_id=$conn->real_escape_string(trim($_POST['login_user_id']));
  //echo $shipping_status=$conn->real_escape_string(trim($_POST['shipping_status']));

  /*Shipping address*/
  $s_firstname=$conn->real_escape_string(trim($_POST['s_firstname']));
  $s_lastname=$conn->real_escape_string(trim($_POST['s_lastname']));
  $s_address =$conn->real_escape_string(trim($_POST['s_address']));
  $s_country=$conn->real_escape_string(trim($_POST['s_country']));
  $s_state=$conn->real_escape_string(trim($_POST['s_state']));
  $s_city=$conn->real_escape_string(trim($_POST['s_city']));
  $s_pincode=$conn->real_escape_string(trim($_POST['s_pincode']));
  $s_mobileno=$conn->real_escape_string(trim($_POST['s_mobileno']));

if (empty($conn->real_escape_string(trim($_POST['shipping_status'])))) {
  $shipping_status=0;
}
else{
$shipping_status=1;
}

if ($shipping_status==0) {

echo $sql="INSERT INTO billing_info (b_firstname, b_lastname, b_address, b_country, b_state, b_city, b_pincode, b_mobileno,login_user_id,shipping_status, b_date_of_added) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)";
//  print_r($sql);
  $stmt = $conn->prepare($sql);
  $stmt->bind_param("ssssssiiiis", $b_firstname, $b_lastname, $b_address, $b_country, $b_state, $b_city, $b_pincode, $b_mobileno,$login_user_id=1,$shipping_status, $date_of_added);

}
else{
  // prepare and bind
  echo $sql="INSERT INTO billing_info (b_firstname, b_lastname, b_address, b_country, b_state, b_city, b_pincode, b_mobileno,login_user_id,shipping_status, b_date_of_added) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?);INSERT INTO shipping_info (s_firstname, s_lastname, s_address, s_country, s_state, s_city, s_pincode, s_mobileno,b_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);";

  $stmt = $conn->prepare($sql);
  $stmt->bind_param("ssssssiiiisssssssiii", $b_firstname, $b_lastname, $b_address, $b_country, $b_state, $b_city, $b_pincode, $b_mobileno,$login_user_id=1,$shipping_status, $date_of_added,$s_firstname, $s_lastname, $s_address, $s_country, $s_state, $s_city, $s_pincode, $s_mobileno,LAST_INSERT_ID());

}


  $stmt->execute();
  $stmt->close();

  }

//redirect code
//header('Location: contactus.php');
  $conn->close();
}

【问题讨论】:

    标签: php mysql html checkbox


    【解决方案1】:

    默认情况下,每次您要插入计费信息时,都不应在 if 语句中插入计费信息查询。

      $sql="INSERT INTO billing_info (b_firstname, b_lastname, b_address, b_country, b_state, b_city, b_pincode, b_mobileno,login_user_id,shipping_status, b_date_of_added) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)";
            //  print_r($sql);
              $stmt = $conn->prepare($sql);
              $stmt->bind_param("ssssssiiiis", $b_firstname, $b_lastname, $b_address, $b_country, $b_state, $b_city, $b_pincode, $b_mobileno,$login_user_id=1,$shipping_status, $date_of_added);
             $stmt->execute();
      $stmt->close();
    

    选择配送状态

    if ($shipping_status==1) {
            $sql="INSERT INTO shipping_info (b_firstname, b_lastname, b_address, b_country, b_state, b_city, b_pincode, b_mobileno,login_user_id,shipping_status, b_date_of_added) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)";
            //  print_r($sql);
              $stmt = $conn->prepare($sql);
              $stmt->bind_param("ssssssiiiis", $b_firstname, $b_lastname, $b_address, $b_country, $b_state, $b_city, $b_pincode, $b_mobileno,$login_user_id=1,$shipping_status, $date_of_added);
     $stmt->execute();
      $stmt->close();
            }
    

    【讨论】:

    • 你的逻辑解决了我 80% 的问题。现在我必须添加订单详细信息,那么我应该在查询中的哪里添加它们?
    • 如果它在另一个表中,您可以将其插入到 if 查询之外。
    【解决方案2】:
         if (empty($conn->real_escape_string(trim($_POST['shipping_status'])))) {
          $shipping_status=0;
    $sql="INSERT INTO billing_info (b_firstname, b_lastname, b_address, b_country, b_state, b_city, b_pincode, b_mobileno,login_user_id,shipping_status, b_date_of_added) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)";
    //  print_r($sql);
      $stmt = $conn->prepare($sql);
      $stmt->bind_param("ssssssiiiis", $b_firstname, $b_lastname, $b_address, $b_country, $b_state, $b_city, $b_pincode, $b_mobileno,$login_user_id=1,$shipping_status, $date_of_added);
    
        }
        else{
        $shipping_status=1;
    $sql="INSERT INTO billing_info (b_firstname, b_lastname, b_address, b_country, b_state, b_city, b_pincode, b_mobileno,login_user_id,shipping_status, b_date_of_added) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?);INSERT INTO shipping_info (s_firstname, s_lastname, s_address, s_country, s_state, s_city, s_pincode, s_mobileno,b_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);";
    
      $stmt = $conn->prepare($sql);
      $stmt->bind_param("ssssssiiiisssssssiii", $b_firstname, $b_lastname, $b_address, $b_country, $b_state, $b_city, $b_pincode, $b_mobileno,$login_user_id=1,$shipping_status, $date_of_added,$s_firstname, $s_lastname, $s_address, $s_country, $s_state, $s_city, $s_pincode, $s_mobileno,LAST_INSERT_ID());
        }
    

    【讨论】:

      【解决方案3】:

      bind_params 之后你必须插入这个

      $firstname = "John";
      $lastname = "Doe";
      $email = "john@example.com";
      $stmt->execute();
      

      【讨论】:

      • 你的意思是说我必须使用 $stmt->execute();在 if-else 条件内?
      • 我已经在我的代码中添加了。但仍然是同样的问题。仅当该部分正在工作但无法插入其他部分时
      猜你喜欢
      • 2010-12-17
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 2012-01-11
      • 2019-09-24
      • 2016-03-07
      • 2017-11-29
      • 2016-06-01
      相关资源
      最近更新 更多