[英]Foreign Key contraints MySQL
我試圖在這里插入兩個表中,一個正在創建一個文檔,該文檔進入我的doc_list表,另一個正在從復選框獲取ID,並將其發布到聯接表中。
問題是聯接表需要我正在創建的帖子的ID形式,但是我根本無法提供它,所以我得到了錯誤。
問題出在這里: $docId = $dbh->lastInsertId();
SQLSTATE [23000]:違反完整性約束:1452無法添加或更新子行:外鍵約束失敗(
dashboardr
cat_doc_link_table
,CONSTRAINTcat_doc_link_table_ibfk_2
FOREIGN KEY(link_doc_id
)參考doc_list
(doc_id
)在刪除doc_id
更新
如果我將其更改為: $docId = $_POST["doc_id"];
SQLSTATE [23000]:違反完整性約束:1048列“ link_doc_id”不能為空
這是我要發布的表格:
<?php include 'header.php'; ?>
<?php
require_once '../../db_con.php';
try{
// Selecting entire row from cat_list table
$results = $dbh->query("SELECT * FROM cat_list");
}catch(Exception $e) {
echo $e->getMessage();
die();
}
$category = $results->fetchAll(PDO::FETCH_ASSOC);
?>
<h3 class="subTitle">
<i class="fa fa-pencil"></i></span> Create New Document
</h3>
<form action="actions/newDocAdd.php" method="post" id="rtf" name="">
<input type="text" name="doc_title" id="doc_title" required="required" placeholder="Document Title"/><br />
<input type="hidden" name="action" value="doc_id"/>
<label><input type="checkbox" name="" class="selectall"/> Select all</label>
<div id="checkboxlist">
<?php
foreach($category as $cat){
?>
<input type="checkbox" value="<?php echo $cat["cat_id"]; ?>" name="cat_no[]"><?php echo $cat["cat_title"]; ?></a>
<br>
<?php
}
?>
</div>
<textarea name="doc_content" id="doc_content" placeholder="Document Content" style="display: none;"></textarea>
<iframe name="editor" id="editor" style="width:100%; height: 600px;"></iframe>
<br><br>
<input onclick="formsubmit()" type="submit" value="Create Document" name="submit"/>
</form>
這是操作表單的腳本:
/*******************************************************************
** ACTION SCRIPT TO POST A NEW CATEGORY INTO THE DOC_LIST TABLE **
*******************************************************************/
if(isset($_POST["action"])){
if(isset($_POST["submit"])){
include_once'../../config.php';
try {
$dbh = new PDO("mysql:host=$hostname;dbname=dashboardr",$username,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO doc_list (doc_title, doc_content, doc_created, user_id)
VALUES ('".$_POST["doc_title"]."','".$_POST["doc_content"]."',NOW(), '".$_SESSION['user']."')";
$SQL = "INSERT INTO `cat_doc_link_table`(`link_cat_id`, `link_doc_id`) VALUES";
$values = "";
$params = [];
$docId = $dbh->lastInsertId();
foreach($_POST["cat_no"] as $cat)
{
$values.= "(?, ?), ";
$params[] = $cat["cat_id"];
$params[] = $docId;
}
$values = substr($values, 0, -2);
$SQL.= $values;
$query = $dbh->prepare($SQL);
$query->execute($params);
if ($dbh->query($sql)) {
header ('Location: ../docList.php?success=1');
}else{
}
$dbh = null;
}catch(PDOException $e)
{
echo $e->getMessage();
}
}
}
?>
我對關系表還不是很陌生,所以請謹慎對待,因為我真的很想了解故障以及如何糾正此問題,因為我非常想解決問題。
試試看:
$dbh = new PDO("mysql:host=$hostname;dbname=dashboardr",$username,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$insertDocList = $dbh->prepare("INSERT INTO doc_list (doc_title, doc_content, doc_created, user_id)
VALUES (:docTitle, :docContent, NOW(), :user)");
if( $insertDocList === false ) {
die("statement couldn't be prepared");
}
$insertResult = $insertDocList->execute(array(
'docTitle' => $_POST['doc_title'],
'docContent' => $_POST['doc_content'],
'user' => $_SESSION['user']
));
if( $insertResult === false ) {
die("Insert Failed");
}
$docId = $dbh->lastInsertId();
$SQL = "INSERT INTO `cat_doc_link_table`(`link_cat_id`, `link_doc_id`) VALUES";
$values = "";
$params = [];
//...
在嘗試使用$dbh->lastInsertId
之前,需要執行第一個INSERT
。
$sql = "INSERT INTO doc_list (doc_title, doc_content, doc_created, user_id)
VALUES (:doc_title, :doc_content, NOW(), :user_id)";
$stmt = $dbh->prepare($sql);
$stmt->execute(array(':doc_title' => $_POST["doc_title"],
':doc_content' => $_POST["doc_content"],
':user_id' => $_SESSION["user"]));
$docId = $dbh->lastInsertId;
此代碼應在代碼中的foreach
循環之前。 而且您應該擺脫對$dbh->query($sql)
的調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.