0

以下に、質問と回答を正常に挿入する php/mysqli コードがあります。

$i = 0;
$c = count($_POST['numQuestion']);

$questionsql = "INSERT INTO Question (SessionId, QuestionId, QuestionContent) 
                    VALUES (?, ?, ?)";



        $sessid =  $_SESSION['id'] . ($_SESSION['initial_count'] > 1 ? $_SESSION['sessionCount'] : '');

            if (!$insert = $mysqli->prepare($questionsql)) {
      // Handle errors with prepare operation here
    } else{

for($i = 0;  $i < $c; $i++ ){      


$results = $_POST['value'];
foreach($results as $id => $value) {
$answer = $value;


        $insert->bind_param("sis", $sessid, $id, $_POST['questionText'][$i]);

        $insert->execute();

        if ($insert->errno) {
          // Handle query error here
        }

       $lastID = $insert->insert_id;

       $insert->close();

        foreach($value as $answer) {

         $answersql = "INSERT INTO Answer (SessionId, QuestionId, Answer) 
    VALUES (?, ?, ?)";

      if (!$insertanswer = $mysqli->prepare($answersql)) {
      // Handle errors with prepare operation here
    }  

    $insertanswer->bind_param("sis", $sessid, $lastID, $answer);

        $insertanswer->execute();

        if ($insertanswer->errno) {
          // Handle query error here
        }

        $insertanswer->close();

}
}

}

}

しかし、上記のコードを機能させる前から私が抱えていた問題は、上記のコードに含める必要がある 2 つの追加の SELECT クエリがあることです。クエリは および として知られ$replystmtてい$optionstmtます。問題は、上記の php/mysqli コードにこれらのクエリを含めると、次のエラーが発生し続けることです。

警告: mysqli_stmt::execute(): (HY000/2014): コマンドが同期していません。現在、/insertQuestion.php の 236 241 行目でこのコマンドを実行することはできません。

コマンドが同期していません。このコマンドは現在実行できません致命的なエラー: 行 242 の /insertQuestion.php で 2 つのレベルを中断/継続できません

コード全体を以下に示します。私の質問は、エラーを削除してコードを機能させるには、コードで何を変更する必要があるかということです。

以下は、完全な php/mysqli コードです。

$replyquery = "SELECT ReplyId FROM Reply WHERE (ReplyType = ?)";

if (!$replystmt = $mysqli->prepare($replyquery)) {
// Handle errors with prepare operation here
echo __LINE__.': '.$mysqli->error;
}

$optionquery = "SELECT OptionId FROM Option_Table WHERE (OptionType = ?)";

if (!$optionstmt = $mysqli->prepare($optionquery)) {
// Handle errors with prepare operation here
echo __LINE__.': '.$mysqli->error;
}

// Prepare your statements ahead of time
$questionsql = "INSERT INTO Question (SessionId, QuestionId, QuestionContent, NoofAnswers, ReplyId, QuestionMarks, OptionId) 
VALUES (?, ?, ?, ?, ?, ?, ?)";
if (!$insert = $mysqli->prepare($questionsql)) {
// Handle errors with prepare operation here
echo __LINE__.': '.$mysqli->error;
}

$answersql = "INSERT INTO Answer (SessionId, QuestionId, Answer) 
VALUES (?, ?, ?)";
if (!$insertanswer = $mysqli->prepare($answersql)) {
// Handle errors with prepare operation here
echo __LINE__.': '.$mysqli->error;
}



//make sure both prepared statements succeeded before proceeding
if( $insert && $insertanswer)
{
$sessid =  $_SESSION['id'] . ($_SESSION['initial_count'] > 1 ? $_SESSION['sessionCount'] : '');
$c = count($_POST['numQuestion']);

for($i = 0;  $i < $c; $i++ )
{

$selected_option = "A-C"; 
$selected_reply = "Single"; 


// Bind parameter for statement
$optionstmt->bind_param("s", $selected_option);

// Execute the statement
$optionstmt->execute();

if ($optionstmt->errno) 
{
// Handle query error here
echo __LINE__.': '.$optionstmt->error;
break 1;
}

// This is what matters. With MySQLi you have to bind result fields to
// variables before calling fetch()
$optionstmt->bind_result($optionid);

// This populates $optionid
$optionstmt->fetch();




// Bind parameter for statement
$replystmt->bind_param("s", $selected_reply);

// Execute the statement
$replystmt->execute(); //Line 236

if ($replystmt->errno) 
{
// Handle query error here
echo __LINE__.': '.$replystmt->error; //Line 241
break 2;
}

// This is what matters. With MySQLi you have to bind result fields to
// variables before calling fetch()
$replystmt->bind_result($replyid);

// This populates $optionid
$replystmt->fetch(); 

$insert->bind_param("sisiiii", $sessid, $_POST['numQuestion'][$i], $_POST['questionText'][$i],
$_POST['numberAnswer'][$i], $replyid, $_POST['textWeight'][$i],
$optionid);

$insert->execute();

if ($insert->errno) 
{
// Handle query error here
echo __LINE__.': '.$insert->error;
break 3;
}
}

$results = $_POST['value'];
foreach($results as $id => $value) 
{
$answer = $value;

$lastID = $id;



foreach($value as $answer) 
{
$insertanswer->bind_param("sis", $sessid, $lastID, $answer);

$insertanswer->execute();

if ($insertanswer->errno) {
// Handle query error here
echo __LINE__.': '.$insertanswer->error;
break 4;
}
}
}


//close your statements at the end


$insertanswer->close();
$insert->close();
$replystmt->close(); 
$optionstmt->close();
}
4

1 に答える 1

0

ここでは、2 つの異なる問題が発生しています。まず、Commands out of sync以前のクエリを実際に終了する前に新しいクエリを開始しようとしているため、警告が発生しています。詳細については、この回答を参照してください。基本的に、次のクエリを準備する前に、準備中の各クエリを閉じる必要があります。

エラーに関しては、1 レベルの深さしかないときにCannot break/continue呼び出しているために発生しています。(または) のbreak 2後のオプションの数字は、抜け出す「レベル」の数です。breakcontinue

<?php
for($i = 0; $i < 10; $i++){
    // 1 level
    for($j = 0; $j < 10; $j++){
        // 2 levels

        break;      // Break of the $j loop
        break 1;    // Equivalent to above

        break 2;    // Break out of both the $j and $i loops

        break 3;    // Causes an error - there is no third level
    }
}

もちろん、その例ではbreak、最初の s をヒットした後、他の s に到達することはありませんが、概念を説明する必要があります。のドキュメントbreakも参照してください。

于 2012-10-15T02:12:42.103 に答える