MySQL中的外键失败

时间:2016-02-26 13:25:29

标签: php mysql

我创建了一个由三个表组成的数据库。这是我用外键创建表的查询。

CREATE TABLE reporter
(
  reporterid INT NOT NULL AUTO_INCREMENT,
  firstname VARCHAR(1000) NOT NULL,
  lastname VARCHAR(100) NOT NULL,
  PRIMARY KEY (reporterid)
);

CREATE TABLE flood
(
  floodid INT NOT NULL AUTO_INCREMENT,
  address VARCHAR(500) NOT NULL,
  description VARCHAR(1000) NOT NULL,
  dateofflood DATE NOT NULL,
  timeofflood INT NOT NULL,
  PRIMARY KEY (floodid)
);

CREATE TABLE reports
(
  reportid INT NOT NULL AUTO_INCREMENT,
  timereport NODATATYPE NOT NULL,
  datereport DATE NOT NULL,
  rid INT NOT NULL,
  fid INT NOT NULL,
  PRIMARY KEY (reportid),
  FOREIGN KEY (rid) REFERENCES reporter(reporterid),
  FOREIGN KEY (fid) REFERENCES flood(floodid)
);

我创建了一个系统,以便我通过PHP在我的数据库中添加记录/行。这是我的代码:

<?php

mysql_connect("localhost", "root", "") or die("Connection Failed");
mysql_select_db("flooddatabase")or die("Connection Failed"); 


$description = $_POST['description'];
$address = $_POST['address']; // Make sure to clean the
$dateofflood=$_POST['dateofflood'];
$timeofflood=$_POST['timeofflood'];
$firstname=$_POST['firstname'];
$lastname=$_POST['lastname'];
$dateofreport=$_POST['dateofreport'];

$ timeofreport = $ _ POST [ 'timeofreport'];

$query = "INSERT into flood(address,description,dateofflood,timeofflood) values ('$address','$description','$dateofflood','$timeofflood')";
$query2 = "INSERT into reporter(firstname,lastname) values ('$firstname','$lastname')";
$query3 = "INSERT into reports(dateofreport,timeofreport) values ('$dateofreport','$timeofreport')";



if(mysql_query($query))
  if(mysql_query($query2))
   if(mysql_query($query3))
        {
          echo "";
        } else
        {
          echo "fail";
        }

?>

我得到的结果很好。就是这样,在我的REPORTS表中,没有生成的外键。例如,我在记者表和泛洪表上输入了一些内容,外键'rid'和'fid'没有引用这两个表的值。需要帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

  • 从泛洪表插入中获取刚刚插入的主键值 查询。并将其存储到变量中,例如$ f_id;
  • 从记者表插入中获取刚刚插入的主键值 查询并将其存储到变量中,如$ r_id;
  • 现在制作如下所示的最后一个插入语句:

    "INSERT into reports(dateofreport,timeofreport,rid,fid) values ('$dateofreport','$timeofreport',$r_id,$f_id)";

我没有给你直接复制粘贴解决方案。

如果您需要知道如何通过执行插入查询来获取最后插入的ID,请查看此link

答案 1 :(得分:0)

  

没有正在生成的外键

我不完全确定你的意思是什么。 外来键不会生成&#34;。您可以使用主要键:

reporterid INT NOT NULL AUTO_INCREMENT

(以及其他两张表)

  

外键&#39; rid&#39;和&#39; fid&#39;没有价值

好吧,看看你的问题:

INSERT into reports(dateofreport,timeofreport) values ...

您在哪里插入ridfid的值?我真的很惊讶这个查询 at ,因为这些列不允许NULL值:

rid INT NOT NULL,
fid INT NOT NULL,

(虽然您的专栏名称也不排成一列,但我发现您显示的代码可能并非实际上您所使用的代码然而,除了这一点之外,事实仍然是,如果你想在这些字段中输入一个值,那么你必须在这些字段中输入值:

INSERT into reports(dateofreport,timeofreport,rid,fid) values ...

每次查询后,您都可以从mysql_insert_id()获取最后生成的标识符:

$last_id = mysql_insert_id();

使用它来填充在后续查询中作为外键插入的值。

另外值得注意的是,mysql_*库早已弃用,已被mysqli_和其他库(如PDO)取代。我强烈建议您升级到当前的技术,因为任何供应商都不支持您使用的技术。

此外,非常重要,您的代码 SQL注入攻击 开放。这基本上意味着您执行用户发送给您的任何代码。您应该将用户输入视为值,而不是可执行代码。 This是开始阅读此主题的好地方,this也是如此。