外键约束 MySQL

Foreign Key contraints MySQL

我想在这里插入两个 tables,一个正在创建一个文档进入我的 doc_list table,另一个从复选框和 post将它们加入一个连接 table.

问题是加入 table 需要我正在创建的 post 的 ID,但我无法提供它,所以我收到了错误。

问题在这里:$docId = $dbh->lastInsertId();

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (dashboardr.cat_doc_link_table, CONSTRAINT cat_doc_link_table_ibfk_2 FOREIGN KEY (link_doc_id) REFERENCES doc_list (doc_id) ON DELETE CASCADE ON UPDATE CASCADE)

如果我把它改成:$docId = $_POST["doc_id"];

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'link_doc_id' cannot be null

这是我post从以下表格中提取的表格:

<?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();
    }

    }

    }


    ?>

我对关系 tables 还很陌生,所以请保持温和,因为我真的很想了解错误以及如何纠正这个问题,因为我非常接近解决问题。

试试这个:

$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 = [];
//...

您需要先执行第一个 INSERT,然后再尝试使用 $dbh->lastInsertId

$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).

的调用