2012-02-07 4 views
1

私はリレーショナルデータベース(InnoDBエンジンを使用するMySQL)に、以下の表と列をPHPで挿入しようとしています。リレーショナルデータベースに値を挿入する

  • クイズ(ID、名前)
  • 質問(quiz_id、ID、名前)
  • 回答(question_id、ID、名前)

主キーIDはすべて自動インクリメントされています。

これにより、特定のクイズを検索し、そのクイズに属する質問を得ることができます。また、それらの質問に属する複数の選択肢を選択することもできます。各質問には、少なくとも2つの可能な回答があります。

私はユーザーが新しいクイズを作成できるようにするインターフェイスを作成しています。私はトランザクションとLAST_INSERT_ID()を使用してプライマリキーが一致するようにする方法の例を見てきましたが、は、前の '親'に依存する複数の挿入がある場合には動作しません正しい質問にリンクされている必要があります)。プロセスすなわち

は次のようになります。

  1. 挿入し、新たなクイズ

  2. その質問へのすべての可能な答えを挿入するために、質問のIDを使用し、質問に

  3. を挿入するためにクイズのIDを使用します

  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(); 

本当にありがとうございます - 詳細情報や説明が必要な場合は教えてください。以前のコードのように

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

、あなたは:

+3

**警告**あなたのコードはSQLインジェクション攻撃の影響を受けやすいです! –

+1

はコードレビューに帰属します。 –

+0

Daniel - POST文字列にmysqli_real_escape_string()を使用しました。 (準備された陳述が良かったのは分かっていますが、この質問はそれだけで十分だと思います!)あなたの助言に感謝します。 –

答えて

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

をするように変更する必要があり、実際には

$quizID = $dbc->insert_id; 

$surveyIDを、あなたのコードのどこにも見つかりませんでした。

+0

ありがとうございます - 元の投稿を更新しました。 –