2012-02-07 4 views
1

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

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

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

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

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

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

  1. Вставьте новую викторину

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

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

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

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

+3

** ВНИМАНИЕ! ** ваш код подвержен атакам с использованием SQL-инъекций! –

+1

относится к обзору кода. –

+0

Спасибо, Даниэль. Я использовал mysqli_real_escape_string() в строках POST. (Я знаю, что подготовленные заявления лучше, но считаю, что этот вопрос достаточно длинный, как есть!) Спасибо за ваш совет. –

ответ

3
$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, не встретишь больше нигде в коде.

+0

Спасибо - я обновил свой оригинальный пост. –

Смежные вопросы