插入两个表,一个具有另一个的外键

时间:2017-05-22 14:53:39

标签: php mysql

我在SO中查看了类似的问题,大多数解决方案都是以.NET为中心和/或使用存储过程。那里帮助不大。这是我用来解决我的应用程序中的问题的后端片段。

$executestat=0;
//-------------------------
//PHASE-1
$sql = "INSERT INTO first_table (a_name,a_type,a_location) 
values('".$a_name."','".$a_type."','".$a_location."')";
if($result = $conn->query($sql)){
    $executestat=$executestat+1;
}
//-------------------------

//-------------------------
//PHASE-2
$sql = "SELECT f.a_id
from first_table as f
order by f.f_id desc limit 1";
if($result = $conn->query($sql)){
    $executestat=$executestat+1;
}
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        $max_a_id = $row["a_id"];
    }
}else{$executestat=$executestat-1;}
//-------------------------

//-------------------------
//PHASE-3
$sql = "INSERT INTO second_table (a_id,b_title,b_location) 
values('".$max_a_id."','".$b_title."','".$b_location."')";
if($result = $conn->query($sql)){
    $executestat=$executestat+1;
}
//-------------------------

问题描述:

  • 从单一表单中,我尝试将数据插入 first_table second_table
  • second_table 的字段a_id first_table 的外键。 (a_id first_table 上的自动增加主键

我现在如何处理它:

我被告知通常会通过在第二个查询中查询 first_table 来处理此类问题,以获取最新的id然后再使用它,同时在第三个查询中插入数据,以插入 second_table

出了什么问题

我从那些长期处理数据库的人那里得到了这个建议。我不知道它是否是我正在做的事情,因为偶尔只有第一个查询运行 (或者我认为)* ,完全没有完成其他查询。

  • *(或者我认为):因为成功条件是if($executestat==3)。所以我知道第一个查询运行(因为Db使用 first_table 插入进行更新),但我不确定第二个查询是否正在运行。但是,我知道至少一个但并非所有查询都在运行。 有没有办法在PHP中将错误回显到文件中。这对于
  • 来说非常棒
  • 此外,在任何人指出之前,我将在稍后使用准备好的语句解决SQL注入问题。我现在只需要这方面的建议。

TL;博士

  • 尝试插入两个表,一个使用另一个表的外键a_id
  • 通过在第一个查询中插入first_table来处理此问题,在第二个查询中找出max a_id,使用$max_a_id在第三个查询中插入second_table。
  • 有时这出乎意料地失败了。我知道至少有一个但不是所有的查询都执行,因为first_table在Db中插入了新数据,但是second_table应该有与第一次插入有关的并发数据,但是没有。
  • 如何将错误回送发送到文件,以便我可以准确捕获所有内容失败的位置?
  • 发现$max_a_id是一种糟糕的方法吗?谁能告诉我一个更好的方法?
  

有人可以指出我做错了什么吗?一个小片段(对此进行修改;更好的是完全改造)

1 个答案:

答案 0 :(得分:1)

插入后,使用$mysqli->insert_id;获取插入值。

$sql = "INSERT INTO first_table (a_name,a_type,a_location) 
values('".$a_name."','".$a_type."','".$a_location."')";
if($result = $conn->query($sql)){
    $executestat=$executestat+1;
}
$max_a_id = $conn->insert_id;
//----