Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL中的外键失败_Php_Mysql - Fatal编程技术网

Php MySQL中的外键失败

Php MySQL中的外键失败,php,mysql,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_I

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

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'];
我得到的结果很好。只是,在我的REPORTS表中,没有生成外键。例如,我在reporter表和flood表中输入了一些内容,外键“rid”和“fid”没有引用这两个表的值。需要帮助,谢谢。

  • 从flood表insert中获取刚插入的主键值 查询并将其存储到一个变量,比如$f_id
  • 从reporter表insert中获取刚刚插入的主键值 查询并存储到一个变量,比如$r\u id
  • 现在,按如下所示进行最后一次insert语句:

    “在报告中插入(dateofreport、timeofreport、rid、fid)值(“$dateofreport’、$timeofreport’、$r_id、$f_id)”

我不是给你一个直接复制粘贴解决方案

如果您需要知道如何通过执行insert查询来获取最后一个插入的id,请查看以下内容

没有正在生成的外键

我甚至不完全确定你说的是什么意思。外键不是“生成的”。主键可以是,您可以执行以下操作:

reporterid INT NOT NULL AUTO_INCREMENT
(以及其他两张桌子)

外键“rid”和“fid”没有值

那么,看看您的查询:

INSERT into reports(dateofreport,timeofreport) values ...
在哪里插入
rid
fid
的值?事实上,我很惊讶这个查询能够工作,因为这些列不允许
NULL
值:

rid INT NOT NULL,
fid INT NOT NULL,
(虽然您的列名也没有对齐,因此我发现您显示的代码很可能不是您实际使用的代码…)但是,撇开这一点不谈,事实仍然是,如果您希望在这些字段中输入值,则必须在这些字段中输入值:

INSERT into reports(dateofreport,timeofreport,rid,fid) values ...
每次查询后,您都可以从
mysql\u insert\u id()
获取最后生成的标识符:

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


同样值得注意的是,
mysql.*
库早已被弃用,并被
mysqli.
和其他库(如
PDO
)所取代。我强烈建议您升级到当前的技术,因为您使用的技术不受任何供应商的支持


此外,这一点非常重要,您的代码非常容易受到SQL注入攻击。这基本上意味着您可以执行用户发送给您的任何代码。您应该将用户输入视为值,而不是可执行代码。是开始阅读主题的好地方,就像这样。

最后一个insert语句需要
rid
fid
字段的值。最后一个insert,您说要插入两列,但只定义一列,将
flood
reporter
表的主键更改为
AUTO\u INCREMENT
。这是你的任务之一。顺便说一句,mysql_*函数在以后的PHP5版本中被弃用,在7中被删除。此外,您还面临SQL注入攻击。看看PDO/mysqli和准备好的声明。@JonStirling哦,是的,对此很抱歉。我更新了它。query1和query2有效,但query3无效。没有添加行。(关于你所说的,“我真的很惊讶这个查询居然有效”@user3767918:这在问题中值得一提。按照措辞,您暗示添加了一行,但这些值不存在。如果根本没有添加任何行,则查询肯定会失败。请注意,此代码不会检查查询中的错误消息,它只是假设成功。我打赌数据库会告诉您在
NULL
中,这些列中不允许有值。我会尝试这样做。但我有一个问题,在我以前的经验中,我有两个表,一个是带有FK的表,然后在我的查询中,我没有将任何值放入FK,但在我的数据库中,实际上在我的FK中有一个记录或值来自我的PK。@user3767918:我不能对你没有显示的代码进行评论。但底线是,如果你想让一个字段有一个值,那么你需要在该字段中输入一个值。对不起,我可以再问一次,你所说的“使用它来填充在后续查询中作为外键插入的值”是什么意思我会试试这个。但我有一个问题,在我以前的经验中,我有两个表,一个是FK,然后在我的查询中,我没有给我的FK添加任何值,但在我的数据库中,实际上在我的PK中的FK中有一个记录或值。
INSERT into reports(dateofreport,timeofreport,rid,fid) values ...
$last_id = mysql_insert_id();