0

、を初めて使用しsql、既存のアカウントのプロジェクト テーブルに挿入ステートメントを実行しようとしていますが、何度も失敗します。どこが間違っているのかわかりません。phppdo

ここに構造があります

アカウント テーブル
ID = pk

プロジェクト テーブル
id = pk
account_id = fk
project_name = varchar(100)
pm = varchar(100)
apm = varchar(100)
est_start = date
est_end = date
contact = varchar(100)
project_status = varchar(100)
comments= text

関連するすべてのフィールドは utf8_unicode_ciです。 XAMPP サーバー上の
innodb db では、照合制限がカスケードに設定されています。mySQL

php/pdo

<?php

include "$_SERVER[DOCUMENT_ROOT]/core/init.php";

if (empty($_POST) === false) {
    $fk = '';

    $title = $_POST['title'];

    try {
        $query_get_id = $db->prepare("
            SELECT accounts.id
            FROM accounts 
            WHERE accounts.account_name = ?         
        ");

        $query_get_id->bindValue(1, $title, PDO::PARAM_STR);
        $query_get_id->execute();
        $count = $query_get_id->rowCount();

        if ($count > 0) {
            while ($row = $query_get_id->fetch(PDO::FETCH_ASSOC)) {             
                $fk = $row['id'];
            }           
        } 

    } catch(PDOException $e) {
        die($e->getMessage());
    }

    $pn = $_POST['project_name'];
    $ppm = $_POST['project_pm'];
    $papm = $_POST['project_apm'];  
    $pc = $_POST['project_contact'];
    $pes = $_POST['project_est_start'];
    $pee = $_POST['project_est_end'];
    $ps = $_POST['project_status']; 
    $pcom = $_POST['project_comments']; 

    try {
        $query_ip = $db->prepare('INSERT INTO projects (account_id, project_name, pm, apm, est_start, est_end, contact, project_status, comments) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)');
        $query_ip->bindValue(1, $fk, PDO::PARAM_STR);       
        $query_ip->bindValue(2, $pn, PDO::PARAM_STR);
        $query_ip->bindValue(3, $ppm, PDO::PARAM_STR);
        $query_ip->bindValue(4, $papm, PDO::PARAM_STR);
        $query_ip->bindValue(5, $pes, PDO::PARAM_STR);
        $query_ip->bindValue(6, $pee, PDO::PARAM_STR);
        $query_ip->bindValue(7, $pc, PDO::PARAM_STR);
        $query_ip->bindValue(8, $ps, PDO::PARAM_STR);
        $query_ip->bindValue(9, $pcom, PDO::PARAM_STR);         

        $query_ip->execute();

        echo 'Project Created';     

    } catch(PDOException $e) {
        die($e->getMessage());
    }

} else {
    echo 'project creation failed';
}
?>

これはエラーを吐き出しているわけではありませんが、fk を適切に設定していないと感じているため、db の挿入が失敗しています。

さらに情報が必要な場合は、質問してください。すべてのコード/情報があっても、簡潔でわかりやすいものにしようとしました。どんな助けでも大歓迎です。

編集

コードを更新した後、このエラーが見つかりました

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`fsi`.`projects`, CONSTRAINT `projects_ibfk_1` FOREIGN KEY (`id`) REFERENCES `accounts` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)' in C:\xampp\htdocs\include\fill_project.php:50 Stack trace: #0 C:\xampp\htdocs\include\fill_project.php(50): PDOStatement->execute() #1 {main} thrown in C:\xampp\htdocs\include\fill_project.php on line 50

50行目は、このコードでステートメントが実行される場所です

$query_ip->execute();

私はこのエラーを完全に理解するには新人すぎます。私の最初の疑いは正しかったと思います.fkを適切に設定していません. 私は正しいですか?

また、参考までに、変数を挿入する前にエコーアウトしました。変数はすべて設定されており、誰も不思議に思っていれば、どれもnullではありません。

4

2 に答える 2

1

これは実際には、インデックスが作成されていない列の場合であることが判明しました。phpmyadmin を使用していて、「アカウント ID」列にインデックスを作成していないことがわかります。これは何を意味するのでしょうか?これは、リレーションシップを「account_id」に設定すると、アカウント テーブルの「id」フィールドの fk になることを意味します。それが唯一のインデックス付きの列だったので、実際には「projects」テーブルの「id」にデフォルト設定されました。迷子になった場合の簡単な視覚化を次に示します。

「phpmyadmin」を初めて使用する場合は、表示したいテーブルの「構造」をクリックしてから、テーブルの下部にある「リレーショナル ビュー」をクリックしてください。

このようなものが表示されるはずです

Column______Internal relation_______Foreign key constraint (INNODB)
id          <blank dropdown>        <blank drop down>
account_id  <blank dropdown>        no index found!
name        <blank dropdown>        no index found!   

fk を別のテーブルに設定したい場合は、内部関係という名前の中央の列をドロップダウンするだけで、他のテーブルからの pk のリストが表示されます..またはそう思いました! 3 番目の列は、すべての違いを生むものです。列にインデックスがない場合、別のテーブルの fk として定義することはできません。

したがって、これを行うと機能しません

Column______Internal relation_______Foreign key constraint (INNODB)
id          <blank dropdown>        <blank drop down>
account_id  <db.accounts.id>        no index found!
name        <blank dropdown>        no index found!

最初にテーブルの構造ビューに移動し、必要な列の「インデックス」をクリックする必要があります。画面は次のようになります

Column______Internal relation_______Foreign key constraint (INNODB)
id          <blank dropdown>        <blank drop down>
account_id  <blank dropdown>        <blank drop down>
name        <blank dropdown>        no index found!

fkを選択すると、次のようになります

Column______Internal relation_______Foreign key constraint (INNODB)
id          <blank dropdown>        <blank drop down>    
account_id  <db.accounts.id>         <`db`.`accounts`.`id`> ON DELETE <CASCADE> ON UPDATE <CASCADE>
name        <blank dropdown>        no index found!

次に、fk が実際に正しい値に設定されます。私はこれを知りませんでした。とにかく、それが私の問題を解決した方法です。これが将来誰かに役立つことを願っています

于 2013-07-27T15:51:41.480 に答える