Я пытаюсь вставить некоторые данные в реляционную базу данных (MySQL, используя движок InnoDB) с таблицами и столбцами ниже через PHP.
- Викторина (идентификатор, имя)
- Вопросы (quiz_id, id, name)
- Ответы (question_id, id, name)
Все идентификаторы первичного ключа имеют автоинкремент.
Это будетпозвольте мне найти конкретный тест, затем получить вопросы, относящиеся к этому тесту, и (в свою очередь) варианты ответов с множественным выбором, относящиеся к этим вопросам.На каждый вопрос будет как минимум два возможных ответа.
Я создаю интерфейс, который позволит пользователям создавать новые тесты.Я видел примеры того, как вы можете использовать транзакции и LAST_INSERT_ID (), чтобы убедиться, что первичные ключи совпадают, но не может заставить это работать, когда есть несколько вставок, которые зависят от предыдущего «родителя» (возможные ответы должны быть связаны с правильным вопросом).
т.е. процесс будет:
Вставить новый тест
Используйте идентификатор теста, чтобы вставить вопрос
Используйте идентификатор вопроса, чтобы вставить все возможные ответы на этот вопрос
Повторите шаги 2 и3, пока не будут введены все вопросы и ответы, затем совершите транзакцию
Я попытался обрисовать это в PHP.Вопросы и ответы предоставляются через POST в виде строк, разделенных запятыми.Я использую explode () для преобразования их в массивы, а затем присваиваю переменные каждому значению в массиве.Я начал использовать циклы for, которые, я думаю, будут работать в принципе для вопросов, но не для ответов.
$dbc = @mysqli_connect($host, $user, $password, $db) or die ('Could not connect to MySQL: ' . mysqli_connect_error());
$qN= ($_POST['quizName']);
$quizName = mysqli_real_escape_string($qN);
$qu = ($_POST['question']);
$question = mysqli_real_escape_string($qu);
$questionArray = explode(',', $question);
$numberQuestions = count($questionArray);
$i = 1;
foreach ($questionArray as $variable)
{
${'q_'.$i} = $variable;
++$i;
}
$an = ($_POST['answer']);
$answer = mysqli_real_escape_string($an);
$answerArray = explode(',', $answer);
$numberAnswers = count($answerArray);
$j = 1;
foreach ($answerArray as $variable)
{
${'a_'.$j} = $variable;
++$j;
}
//turn off AUTOCOMMIT, then run the required queries
$dbc->autocommit(FALSE);
$dbc->query("INSERT INTO Quiz(name)
VALUES
(".$quizName.")");
$quizID = $dbc->insert_id;
$n = 1;
for ($x=0; $x<$numberQuestions; $x++)
{
$dbc->query("INSERT INTO Question (quiz_id, question_name)
VALUES
(".$quizID.",".${'q_'.$n}.")");
$questionID = $dbc->insert_id;
echo $questionID;
++$n;
$m = 1;
for ($y=0; $y<$numberAnswers; $y++)
{
$dbc->query("INSERT INTO Answer(question_id, name)
VALUES
(".$questionID.",".${'a_'.$m}.")");
++$m;
}
}
// commit transaction
$dbc->commit();
// close connection
$dbc->close();
Я был бы очень признателен за любую помощь, которую вы можете оказать - пожалуйста, дайте мне знать, если вынужна дополнительная информация или уточнения.