Я пытаюсь вставить некоторые данные в реляционную базу данных (MySQL с помощью механизма InnoDB) с таблицами и столбцами ниже через PHP.Вставка значений в реляционную базу данных
- Quiz (номер, имя)
- Вопросов (quiz_id, идентификатор, имя)
- Ответов (question_id, идентификатор, имя)
первичные ключ идентификаторы все автоинкрементные.
Это позволит мне найти конкретную викторину, затем получить вопросы, относящиеся к этой викторине, и (в свою очередь) множественный выбор возможных ответов, относящихся к этим вопросам. Каждый вопрос будет иметь как минимум два возможных ответа.
Я создаю интерфейс, который позволит пользователям создавать новую викторину. Я видел примеры использования транзакций и LAST_INSERT_ID(), чтобы гарантировать, что первичные ключи совпадают, но не может заставить это работать, когда есть несколько вложений, которые зависят от предыдущего «родителя» (возможные ответы должны быть связаны с правильным вопросом).
т.е. процесс будет:
Вставьте новую викторину
Используйте викторины идентификатор для вставки на вопрос
Используйте вопрос идентификатор, чтобы вставить все возможные ответы на этот вопрос
Повторите шаги 2 & 3 до тех пор, пока все вопросы и ответы не были указаны затем совершить транзакцию
Я попытался описать это на PHP. Вопросы и ответы предоставляются через POST как строки, разделенные запятыми. Я использую explode(), чтобы преобразовать их в массивы, а затем назначил переменные каждому значению в массиве. Я начал использовать для циклов, которые, я думаю, будут работать в принципе для вопросов, но не ответов.
$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();
Я бы очень признателен за любую помощь, которую вы можете дать - сообщите мне, если вам нужна дополнительная информация или какие-либо разъяснения.
** ВНИМАНИЕ! ** ваш код подвержен атакам с использованием SQL-инъекций! –
относится к обзору кода. –
Спасибо, Даниэль. Я использовал mysqli_real_escape_string() в строках POST. (Я знаю, что подготовленные заявления лучше, но считаю, что этот вопрос достаточно длинный, как есть!) Спасибо за ваш совет. –