Вставка значений в реляционную базу данных - PullRequest
1 голос
/ 07 февраля 2012

Я пытаюсь вставить некоторые данные в реляционную базу данных (MySQL, используя движок InnoDB) с таблицами и столбцами ниже через PHP.

  • Викторина (идентификатор, имя)
  • Вопросы (quiz_id, id, name)
  • Ответы (question_id, id, name)

Все идентификаторы первичного ключа имеют автоинкремент.

Это будетпозвольте мне найти конкретный тест, затем получить вопросы, относящиеся к этому тесту, и (в свою очередь) варианты ответов с множественным выбором, относящиеся к этим вопросам.На каждый вопрос будет как минимум два возможных ответа.

Я создаю интерфейс, который позволит пользователям создавать новые тесты.Я видел примеры того, как вы можете использовать транзакции и LAST_INSERT_ID (), чтобы убедиться, что первичные ключи совпадают, но не может заставить это работать, когда есть несколько вставок, которые зависят от предыдущего «родителя» (возможные ответы должны быть связаны с правильным вопросом).

т.е. процесс будет:

  1. Вставить новый тест

  2. Используйте идентификатор теста, чтобы вставить вопрос

  3. Используйте идентификатор вопроса, чтобы вставить все возможные ответы на этот вопрос

  4. Повторите шаги 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();

Я был бы очень признателен за любую помощь, которую вы можете оказать - пожалуйста, дайте мне знать, если вынужна дополнительная информация или уточнения.

1 Ответ

3 голосов
/ 07 февраля 2012
$dbc->query("INSERT INTO Question (quiz_id, question_name) 
  VALUES
  (".$surveyID.",".${'q_'.$n}.")");

Должен быть изменен на:

$dbc->query("INSERT INTO Question (quiz_id, question_name) 
  VALUES
  (".$quizID.",".${'q_'.$n}.")");

как ранее в коде, вы делаете:

$quizID = $dbc->insert_id;

фактически, $surveyID, больше нигде в вашем коде не найдено.

...