前提・実現したいこと
まだプログラミング学習を始めて2週間程度になります。質問に過不足があればコメントいただきたいです。
現在PHPのみでブログ記事投稿サイトを作っています。(練習用)
SQLはMySQLを使用しています。
実現したいことは、ユーザがフォームで複数選択した値をarticle_tagテーブルに登録することです。
それがarticlesテーブルにうまく紐づいて表示されて欲しいです。
テーブルは以下3つを使用しています。
- articles
- article_tag(中間テーブル)
- tags
articlesテーブルにデータを追加するタイミングでarticle_tagテーブルのarticle_idが必要になるかと思うのですが、まだデータを追加していないため、そのidが受け取れずどうしたらいいのかさっぱりわからなくなったため質問させていただきます。
発生している問題・エラーメッセージ
ユーザの入力値をarticlesテーブルにinsertすると以下のエラーが出てしまいます。
ちなみにsessionで値の受け渡しは行っています。
疑問符プレースホルダーにした場合
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`blog`.`articles`, CONSTRAINT `articles_ibfk_3` FOREIGN KEY (`tag_id`) REFERENCES `tag_article` (`article_id`))
名前付きプレースホルダーにした場合
SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
該当のソースコード
名前付きプレースホルダーのコードは以下になります。
php
1$sql = 'INSERT INTO articles (name, content, category_id, user_id, tag_id) 2 VALUES (:name, :content, :category_id, :user_id, :tag_id)'; 3$sth = $pdo -> prepare($sql); 4$sth -> bindValue(':name', $_SESSION['title'],PDO::PARAM_STR); 5$sth -> bindValue(':content', $_SESSION['contents'],PDO::PARAM_STR); 6$sth -> bindValue(':category_id', $_SESSION['category_id'], PDO::PARAM_INT); 7$sth -> bindValue(':user_id', $_SESSION['user_id'], PDO::PARAM_INT); 8$sth -> bindValue(':tag_id', $_SESSION['tag_id'], PDO::PARAM_INT); 9$sth -> execute(); 10$row = $sth -> fetchAll();
試したこと
PDOでSQLを実行すると型がstringになると知ったのでPDO::PARAM_INTとし実行しましたが変わりませんでした。
エラーメッセージも調べましたがパラメータの数は合っているので問題なさそうだと判断しました。
2つのテーブルに同時にinsertできれば解決できるのかと考え調べましたが、oracleはinsery allでできるようですがmysqlではそのような機能がないとわかったため断念しました。
他にどのように調べれば解決できるのか、何が足りないのか、そもそも考え方が合っているかなどを教えていただいたいです。
すみませんがアドバイスよろしくお願いします。
追記
現在のSQLコードになります。
$sql = 'INSERT INTO articles (name, content, category_id, user_id, tag_id) VALUES (:name, :content, :category_id, :user_id, :tag_id)'; $sth = $pdo -> prepare($sql); $sth -> bindValue(':name', $_SESSION['title'],PDO::PARAM_STR); $sth -> bindValue(':content', $_SESSION['contents'],PDO::PARAM_STR); $sth -> bindValue(':category_id', $_SESSION['category_id'], PDO::PARAM_INT); $sth -> bindValue(':user_id', $_SESSION['user_id'], PDO::PARAM_INT); $sth -> bindValue(':tag_id', $_SESSION['tag_id'], PDO::PARAM_INT); $sth -> execute();
テーブル中身は以下になります。
- articles
id, name, content, category_id, user_id, tag_id
- article_tag
article_id, tag_id
- tags
id, name
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/04 10:49
2020/04/04 10:52
2020/04/04 11:05
2020/04/04 11:27
2020/04/04 11:36