【问题标题】:Insert into one table twice in same script?在同一个脚本中两次插入一个表?
【发布时间】:2013-02-05 15:42:56
【问题描述】:

我以前问过这个问题,但后来我改变了我的代码。我在使用这个将表单数据插入表格的脚本时遇到了问题。第一个插入创建一个存储客户联系方式的预订。第二个插入获取在第一个中创建的预订参考,并为客户创建一个“工作”。最后的插入应该创建第二个“工作”,即客户的回程。

前两个插入运行良好, 但它忽略了最后一个,即第二个 JOB 插入。

我已经检查了表结构,并且将数据传递给脚本一切正常,因此问题一定出在脚本中(如下所示),非常感谢任何帮助。

使用一个脚本两次插入同一张表是否正确?

<?php

  $customer_title           =  $_POST['customer_title'];
  $customer_first_name      =  $_POST['customer_first_name'];
  $customer_last_name       =  $_POST['customer_last_name'];
  $billing_address          =  $_POST['billing_address'];
  $customer_tel             =  $_POST['customer_tel'];
  $customer_mobile          =  $_POST['customer_mobile'];
  $customer_email           =  $_POST['customer_email'];
  $passengers               =  $_POST['passengers'];
  $cases                    =  $_POST['cases'];
  $return_flight_number     =  $_POST['return_flight_number'];
  $price                    =  $_POST['price'];
  $pickup_date              =  $_POST['pickup_date'];
  $pickup_time              =  $_POST['pickup_time'];
  $pickup_address           =  $_POST['pickup_address'];
  $destination_address      =  $_POST['pickup_destination'];
  $return_date              =  $_POST['return_date'];
  $return_time              =  $_POST['return_time'];
  $return_pickup            =  $_POST['return_pickup'];
  $return_destination       =  $_POST['return_destination'];
  $booking_notes            =  $_POST['booking_notes'];

  $booking_status           =  "Confirmed";
  $authorised               =  "N";

  $booking_agent            =   "ROOT_TEST";
  $booking_date             =   date("Y/m/d");

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

  include('../assets/db_connection.php');

  $create_booking = $db->prepare("INSERT INTO bookings(customer_name, billing_address, contact_tel, contact_mob, contact_email, party_pax, party_cases, booking_notes, price, booking_agent, booking_date, booking_status, authorised)
                                      VALUES(:customer_name, :billing_address, :contact_tel, :contact_mob, :contact_email, :party_pax, :party_cases, :booking_notes, :price, :booking_agent, :booking_date, :booking_status, :authorised );");
  $create_booking->execute(array(
      ":customer_name"       =>   $customer_title  . ' ' .   $customer_first_name  . ' '  .   $customer_last_name,
      ":billing_address"     =>   $billing_address,
      ":contact_tel"         =>   $customer_tel,
      ":contact_mob"         =>   $customer_mobile,
      ":contact_email"       =>   $customer_email,
      ":party_pax"           =>   $passengers,
      ":party_cases"         =>   $cases,
      ":booking_notes"       =>   $booking_notes,
      ":price"               =>   $price,
      ":booking_agent"       =>   $booking_agent,
      ":booking_date"        =>   $booking_date,
      ":booking_status"      =>   $booking_status,
      ":authorised"          =>   $authorised    
    ));

  $booking_ref = $db->lastInsertId('booking_ref'); // Takes Booking Ref generated in $create_booking

  $scheduled   = "N";

  $create_job =  $db->prepare("INSERT INTO jobs(booking_ref, pickup_date, pickup_time, pickup_address, destination_address, scheduled) 
                              VALUES(:booking_ref, :pickup_date, :pickup_time, :pickup_address, :destination_address, :scheduled)");

  $create_job->execute(array(
      ":booking_ref"          =>  $booking_ref,
      ":pickup_date"          =>  $pickup_date,
      ":pickup_time"          =>  $pickup_time,
      ":pickup_address"       =>  $pickup_address,
      ":destination_address"  =>  $destination_address,
      ":scheduled"            =>  $scheduled  
  ));



  $return = "Y";


  $create_return  = $db->prepare("INSERT INTO jobs(booking_ref, pickup_date, pickup_time, pickup_address, destination_address, scheduled, return)
                                  VALUES(:booking_ref, :pickup_date, :pickup_time, :pickup_address, :destination_address, :scheduled, :return)");

  $create_return->execute(array(
      ":booking_ref"          =>  $booking_ref,
      ":pickup_date"          =>  $return_date,
      ":pickup_time"          =>  $return_time,
      ":pickup_address"       =>  $return_pickup,
      ":destination_address"  =>  $return_destination,
      ":scheduled"            =>  $scheduled,
      ":return"               =>  $return
  ));




}


?>

【问题讨论】:

  • 您能否在执行第三次查询之前对 post 值进行 vardump 并查看它们是否包含正确的数据?
  • 您是否将PDO::ATTR_ERRMODE 设置为PDO::ERRMODE_WARNING(启用E_WARNING)或PDO::ERRMODE_EXCEPTION

标签: php mysql pdo insert


【解决方案1】:

这肯定是不正确的,因为两次插入相同的数据违反了最重要的数据库架构法则之一 - Database Normalization 原则

但是,它没有技术问题。您必须使用来自 mysql 的 错误消息 来捕捉一些错误。要拥有它,请在连接到 PDO 后添加此行。

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

请注意,捕获实际错误是调试 SQL 查询的唯一方法。只看代码没有意义也没有帮助。

return 必须是 mysql 关键字。写成

`return`

顺便说一句,我无法忍受如此庞大的代码。

如果我是你,我会用 10 行而不是 50 行:

$allowed = array('customer_name', 'billing_address', 'contact_tel', 'contact_mob',
                 'contact_email', 'party_pax', 'party_cases', 'booking_notes', 'price'); 
$insert = $db->filterArray($_POST,$allowed);

$insert['booking_status'] =  "Confirmed";
$insert['authorised']     =  "N";
$insert['booking_agent']  =   "ROOT_TEST";
$insert['booking_date']   =   date("Y-m-d");

$db->query("INSERT INTO bookings SET ?u", $insert);

【讨论】:

  • 谢谢,你是对的,这是返回字段名称,它不喜欢没有 `` 任何一方。我还将按照您的建议减少我的代码。再次感谢:)
【解决方案2】:

看起来booking_refjobs 表中的主键,您尝试插入相同的键两次,这就是最终查询失败的原因。

您应该有一个单独的字段,它是 jobs 上的主键,它只是一个自动递增的数字,然后在 booking_ref 上创建一个索引。

【讨论】:

  • jobs 有一个主键 job_ref,我在 phpmyadmin 上检查过,唯一的主键是 job_ref,booking_ref 没有设置为唯一的。
【解决方案3】:

没有法律禁止它。您需要做的是检查最后一个 INSERT 查询的返回值。我最好的猜测是 jobs 表上有一个唯一索引,您违反了双插入。

如果您在这里使用 mySQLi 或 PDO 并不明显,但两者的执行函数都会在失败时返回 false,因此您应该抓住它,然后调用相应对象的错误函数来找出问题所在。

【讨论】:

    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多