現在、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>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。