簡體   English   中英

MySQL的外鍵約束

[英]Foreign Key contraints MySQL

我試圖在這里插入兩個表中,一個正在創建一個文檔,該文檔進入我的doc_list表,另一個正在從復選框獲取ID,並將其發布到聯接表中。

問題是聯接表需要我正在創建的帖子的ID形式,但是我根本無法提供它,所以我得到了錯誤。

問題出在這里: $docId = $dbh->lastInsertId();

SQLSTATE [23000]:違反完整性約束:1452無法添加或更新子行:外鍵約束失敗( dashboardr cat_doc_link_table ,CONSTRAINT cat_doc_link_table_ibfk_2 FOREIGN KEY( link_doc_id )參考doc_listdoc_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.

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