簡體   English   中英

MySQL中的外鍵失敗

[英]Foreign Key Failure in 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”沒有引用這兩個表的值。 需要幫助謝謝。

  • 從泛洪表插入查詢中獲取剛剛插入的主鍵值。 並將其存儲到變量$ f_id;
  • 從報告者表插入查詢中獲取剛剛插入的主鍵值,並將其存儲到變量$ r_id;中。
  • 現在,使您的最后一個插入語句如下所示:

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

我沒有給您直接復制粘貼解決方案。

如果您需要了解如何通過執行插入查詢來獲取最后插入的ID,請查看此鏈接

沒有正在生成的外鍵

我不確定您的意思。 鍵不是“生成”的。 鍵可以是,您可以這樣做:

reporterid INT NOT NULL AUTO_INCREMENT

(以及其他兩個表)

外鍵“ rid”和“ fid”沒有值

好吧,看看您的查詢:

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

您在哪里插入ridfid值? 實際上,我很驚訝這個查詢在所有工作,因為這些列不允許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注入攻擊很開放 這基本上意味着您可以執行用戶發送給您的所有代碼。 您應該將用戶輸入視為值,而不是可執行代碼。 是開始閱讀關於這個問題的好地方,因為是這樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM