質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

1081閲覧

phpmyadminのテーブルにデータが勝手に入ってしまい keyの重複エラーが起こる

KazKit

総合スコア8

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/10/31 17:49

現在、phpを使って簡単なクイズを製作しています。

データベースはphpmyadminを使って問題と回答をストールさせている形です。

クイズ自体は大方しっかり動くのですが、
add.phpというのを作ってユーザー側で問題と選択肢を追加してそれらがクイズに追加される仕組みを今作っています。

そこで、追加した質問と答えがphpmyadminに追加されるようになっているのですが、
add.phpをウェブ上で更新すると
Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '4' for key 'PRIMARY' in /var/www/html/add.php:27 Stack trace: #0 /var/www/html/add.php(27): PDO->query('INSERT INTO que...') #1 {main} thrown in /var/www/html/add.php on line 27

のようなエラーが発生してしまいます。keyが被っているのが問題なのはわかって、phpmyadminで確認してみると、なんの問題や答えを追加してもいないのに、add.phpを更新するたびに勝手に追加されてしまっていました。
そのためkeyの重複のメセージがでているようです。

phpmyadminのテーブルのデータが勝手に更新されてしまうのはなぜなのか教えていただけると嬉しいです。

add.php <?php require_once 'database.php'; ?> <?php if (isset($_POST['submit'])) { //get post variable $question_number = $_POST['question_number']; $question_text = $_POST['question_text']; $correct_choice = $_POST['correct_choice']; //choices array $choices = array(); $choices[1] = $_POST['choice1']; $choices[2] = $_POST['choice2']; $choices[3] = $_POST['choice3']; $choices[4] = $_POST['choice4']; $choices[5] = $_POST['choice5']; //question query $query = "INSERT INTO question (question_id, question) VALUES ('$question_number', '$question_text')"; //run query // $insert_row = $db->query($query) or die($db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION). __LINE__); $stmt = $db->query($query); $stmt->closeCursor(); //validate insert if ($stmt) { foreach ($choices as $choice => $value) { //13〜18行目のかっこの中の数字(キー)を取り出したい if ($value != '') { if ($correct_choice == $choice) { $is_correct = 1; } else { $is_correct == 0; } //choice query $query = "INSERT INTO choices (question_id, is_correct, choice) VALUES ('$question_number', '$is_correct', '$value')"; //run query // $insert_row = $db->query($query) or die($db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION). __LINE__); $stmt = $db->query($query); $stmt->closeCursor(); //validate insert if ($stmt) { continue; } else { die ("Error: ('.$db->errno . ') '. $db->error"); } } } $msg = 'question was added!'; } } // get total question $query = "SELECT * FROM question"; //get result $questions = $db->query($query) or die($db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION). __LINE__); $total = $questions->rowCount(); $next = $total+1; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charaset="utf-8"> <title>Quiz</title> <link rel="stylesheet" href="styles.css"> </head> <body> <header> <div class="container"> <h1>Welcome to the Vocab quiz</h1> </div> </header> <main> <div class="container"> <h1>Add a question<h1> <?php if(isset($msg)){ echo $msg; } ?> <form method="POST" action="add.php"> <p> <label>Question number</label> <input type="number" value="<?php echo $next; ?>" name="question_number"> </p> <p> <label>Question Text</label> <input type="text" name="question_text"> </p> <p> <label>Choice #1</label> <input type="text" name="choice1"> </p> <p> <label>Choice #2</label> <input type="text" name="choice2"> </p> <p> <label>Choice #3</label> <input type="text" name="choice3"> </p> <p> <label>Choice #4</label> <input type="text" name="choice4"> </p> <p> <label>Choice #5</label> <input type="text" name="choice5"> </p> <p> <label>Correct Choice number</label> <input type="number" name="correct_choice"> </p> <p> <input type="submit" name="submit" value="submit"> </p> </form> </div> </main> <div class="container"> <footer>Copyright 2019</footer> </div> </body> </html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

えーと、色々無茶苦茶ですが(とりあえずインデントはまともにして欲しい……)
まず、phpmyadminはデータベースじゃありません。データベースはMySQLだと思います。
あと、プログラムが「勝手に」何かすることはありません。
貴方がプログラムした通りにおかしな挙動をしているだけです。

choicesテーブルに3レコードあって、question_id=4のレコードがあるはずです。
$next = $total+1;
で$nextに4が入って、それをもとにquestion_id=4のレコードを挿入しようとしてエラーになっています。

投稿2019/10/31 19:28

takepan1973

総合スコア821

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問