6

Image_Questionテーブルにデータを挿入したい。Image_Questionただし、テーブルへの挿入は実行されません。

2つのエラーが発生します:

  • 注意:未定義のオフセット:305行目の...で0
  • 注意:未定義のオフセット:305行目の3インチ...

使用できるアプリケーションは次のとおりです。アプリケーション

アプリを使用して何が起こっているかを確認するには、次の手順を実行します。

  1. ボタンを2回クリックAdd Questionして、2つのファイル入力を追加します

  2. 次に、ファイルを1つずつアップロードしますが、このようにします。行1のファイル入力にファイルをアップロードし、次に行2のファイルをアップロードし、次に行1のファイルを再度アップロードし、最後に行2のファイルをアップロードします。

以下はmysqliコードです:

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

$imagequestionsql = "INSERT INTO Image_Question (ImageId, QuestionId)  
VALUES (?, ?)"; 

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

//make sure both prepared statements succeeded before proceeding
if( $insert && $insertimagequestion) {
  $c = count($_POST['numQuestion']);
  $question_ids = array();

  for($i = 0;  $i < $c; $i++ ) {
    $questionNo = $_POST['numQuestion'][$i];

    $insert->bind_param("i", $questionNo);

    $insert->execute();

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

    $questionId = $mysqli->insert_id;

    $question_ids[$questionNo] = $questionId;
  }

  $imgresults = $_POST['imgid'];
  foreach($imgresults as $imgid => $imgvalue) { 
    $image = $imgvalue;
    $imgquesid = $question_ids[$imgid];  //LINE 305 where error is

    foreach($imgvalue as $image) {
      $insertimagequestion->bind_param("ii",$image, $imgquesid); 
      $insertimagequestion->execute();

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

?>

以下は、デモを設定するコードです。

function GetFormImageCount(){ 
  return $('.imageuploadform').length + 1;
}

var qnum = 1;
var qremain = 5;

function insertQuestion(form) {   

  if (qnum > 5)
    return;

  var $tbody = $('#qandatbl_onthefly > tbody');
  var $tr = $("<tr class='optionAndAnswer' align='center'>");
  var $qid = $("<td width='5%' class='qid'></td>").text(qnum);
  var $image = $("<td width='17%' class='image'></td>"); 

  $('.num_questions').each( function() {

    var $this = $(this);

    var $questionNumber = $("<input type='hidden' class='num_questionsRow'>").attr('name',$this.attr('name')+"[]").attr('value',$this.val());

    $qid.append($questionNumber);                             

    ++qnum;    
    $(".questionNum").text(qnum);
    $(".num_questions").val(qnum);

    --qremain;
    $(".questionRemain").text(qremain);
  });

  var $fileImage = $("<form action='imageupload.php' method='post' enctype='multipart/form-data' target='upload_target_image' onsubmit='return imageClickHandler(this);' class='imageuploadform' >" + 
    "<p class='imagef1_upload_form'><label>" + 
    "Image File: <input name='fileImage' type='file' class='fileImage' /></label><br/><br/><label class='imagelbl'>" + 
    "<input type='submit' name='submitImageBtn' class='sbtnimage' value='Upload' /></label>" + 
    "<p class='imagef1_upload_process'>Loading...<br/><img src='Images/loader.gif' /></p>" +
    "<input type='hidden' class='numimage' name='numimage' value='" + GetFormImageCount() + "' />" +
    "</p><p class='imagemsg'></p><p class='listImage'></p>" +
    "<iframe class='upload_target_image' name='upload_target_image' src='/' style='width:0px;height:0px;border:0px;solid;#fff;'></iframe></form>");   

  $image.append($fileImage);

  $tr.append($qid);
  $tr.append($image);  
  $tbody.append($tr);
}

function imageValidation(imageuploadform) {
  var val = $(imageuploadform).find(".fileImage").val();
  switch(val.substring(val.lastIndexOf('.') + 1).toLowerCase()){
    case 'gif':
    case 'jpg': 
    case 'jpeg':
    case 'pjpeg':
    case 'png':
      return true;

    case '':
      $(imageuploadform).find(".fileImage").val();
      alert("To upload an image, please select an Image File");
      return false;

    default:
      alert("To upload an image, please select an Image File");
      return false;
  }
  return false;
}

function htmlEncode(value) { return $('<div/>').text(value).html(); }

function startImageUpload(imageuploadform){
  $(imageuploadform).find('.imagef1_upload_process').show()
  $(imageuploadform).find('.imagef1_upload_form').hide();
  $(imageuploadform).find('.imagemsg').hide();
  sourceImageForm = imageuploadform;

  return true;
}

var imagecounter = 0;

function stopImageUpload(success, imageID, imagefilename) {
  var result = '';
  imagecounter++;

  if (success == 1){
    result = '<span class="imagemsg'+imagecounter+'">The file was uploaded successfully</span>';   
    $('.hiddenimg').eq(window.lastUploadImageIndex).append('<input type="text" name="imgid[]" id="'+imageID+'" value="' + imageID + '" />');
    $('.listImage').eq(window.lastUploadImageIndex).append('<div>' + htmlEncode(imagefilename) + '<button type="button" class="deletefileimage" data-imageID="'+imageID+'"  data-image_file_name="' + imagefilename + '" value="'+imageID+'">Remove</button><br/><hr/></div>');
  }

  $(sourceImageForm).find('.imagef1_upload_process').hide();
  $(sourceImageForm).find('.imagemsg').html(result);
  $(sourceImageForm).find('.imagemsg').show();
  $(sourceImageForm).find(".fileImage").replaceWith("<input type='file' class='fileImage' name='fileImage' />");
  $(sourceImageForm).find('.imagef1_upload_form').show();


  var _imagecounter = imagecounter;

  $('.listImage').eq(window.lastUploadImageIndex).find(".deletefileimage").on("click", function(event) {
    jQuery.ajax("deleteimage.php?imagefilename=" + $(this).attr('data-image_file_name')).done(function(data) {
      $(".imagemsg" + _imagecounter).html(data);
    });

    var buttonid = $(this).attr('value');
    $(this).parent().remove();
    $("#"+ buttonid  +"").remove();
  });

  return true;   
}

function imageClickHandler(imageuploadform){ 
  if(imageValidation(imageuploadform)){ 
    window.lastUploadImageIndex = $('.imageuploadform').index(imageuploadform); 
    return startImageUpload(imageuploadform); 
  }
  return false;
}
</script>
</head>
<body>
  <form id="QandA" action="insertQuestion.php" method="post">
    <table id="question">
      <tr>
        <th colspan="2">
          Question Number <span class="questionNum">1</span>
          <input type="hidden" class="num_questions" name="numQuestion" value="1">
        </th>
      </tr>
    </table>

    <table id="questionBtn" align="center">
      <tr>
        <th>
          <input id="addQuestionBtn" name="addQuestion" type="button" value="Add Question" onClick="insertQuestion(this.form)" />
        </th>
      </tr>
    </table>

  </div><hr/><!-- This Divide close tag has no open tag!-->

  <table id="qandatbl" align="center" cellpadding="0" cellspacing="0" border="0">
    <thead>
      <tr>
        <th width="5%" class="qid">Question Number</th>
        <th width="17%" class="image">Image</th>
      </tr>
    </thead>
  </table>
  <div id="qandatbl_onthefly_container">
    <table id="qandatbl_onthefly" align="center" cellpadding="0" cellspacing="0" border="0">
      <tbody>
      </tbody>
    </table>
  </div>
  <div class="hiddenimg"><!-- All uploaded image file ids go here --></div>
</form>
</body>

次のvar_dumpsを実行します。

   var_dump($question_ids);
    var_dump($imgresults);

私はこれらの結果を得る:

     array(2) { 
        [1]=> int(159)
        [2]=> int(160) 
        } 
array(2) { 
[0]=> string(3) "129"
[1]=> string(3) "130" 
}

奇妙なのは、imgresultの数字が0から1で始まることです。また、なぜ文字列を示しているのかわかりません。intである必要があります。しかし、それが入力からのものである場合、bind_paramを呼び出すのですiか、それともsdbのようにそのintを呼び出すのですか?

追加の詳細:

私が得られないのはこのmysqliの下にあり、答えのために同様のmysqliを生成します。奇妙なことに、上記のimage_question挿入のように0で始まっていても、正しく挿入されます。

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

    $quesid = $question_ids[$id];   

    foreach($value as $answer) 
    {
        $insertanswer->bind_param("is", $quesid, $answer);

        $insertanswer->execute();

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

var_dump($ result)は、1つの質問に対する以前のvarダンプを示しています。

array(1) { //var_dump($question_ids);
[1]=> int(171) 
} array(1) { //var_dump($imgresults);
[0]=> string(3) "130" 
} array(1) { 
[1]=> array(1) { //var_dump($results);
[0]=> string(1) "B" } } 
4

2 に答える 2

17

私の答えは、特定の質問ではなく、やや広いトピックに関するものです。

それはあなたが一般的にあなたの仕事をしている方法についてです。
変更する必要があります。
ほら、あなたの質問はすべて答えるには大きすぎます。そしてさらに大きくなります。それでも、得られる答えは少なくなります。
それはあなたに絶望的なことをさせます-質問、賞金、アカウントをだます-しかしすべて無駄です. それはどこにも通じない道です。

物事を学ぶ方法と、この素晴らしいサイトの使用方法を変える必要があります。
誰にとっても、使用しているツールを知ることは非常に重要です。自分でコードを作成する必要があり、実際に修正する場合にのみ助けを求める必要があります。
その結果、コードを理解できるようになります。それは不可欠です - あなたのコードが何をするかを理解するために。それのすべての行。したがって、物事を整理してコードを自分で修正することができます。
そうしないと、この場合のように、タイプミスごとに助けを求めることになります。

さらに、問題の根本を掘り下げることができないため、質問とともに大量のコードを投稿する必要があり、回答が複雑になります。あなたの質問には、JavaScript、PHP、Mysql の3 つの領域
があります。そして、問題はそのうちの 1 つだけに属します。少なくともこれらの領域の限界まで問題を分離することを学ばなければなりません。 JS がクライアントから間違った (予期しない) データを送信していますか? では、PHP と Mysql のコードをすべて片付けて、JS だけを残します。問題を調査する際に、Stackoverflowers と自分自身の両方に役立ちます。 このデータ大丈夫?本気ですか?印刷して、期待どおりであることを確認してください。 問題がなければ、PHP の部分に移動します (ただし、質問からすべての JS を削除することを忘れないでください)。



等々。

「挿入していません」などの一般的な用語ではなく、特定のデータ フローに関して質問してください。
それを開始するとすぐに、回答する Stackoverflow は必要ありません。データが予想外に間違っている場所まで問題を追跡できます。だから - あなたは間違った場所を見つけました。

問題のコードを実行することも非常に重要です。そして、問題が発生したまさにその環境で実行します。
コードを実行して実際の結果を確認することは、コードを目で見るよりもはるかに効率的です。 あなたのサーバーのみに属し、他の人には知られていない状況もあり、あなたの質問にまったく答えることができません. また、人間が頭の中で PHP コードを実行することは想定されていません。数行で機能することもありますが、ある時点からすべてのコードを精神的に実行してエラーを見つけることは不可能です。


そのため、コードを実行して、すべての値、関数の結果を出力し、変数の状態などをチェックして、それらの矛盾を探すことが非常に重要です。

確かに、そのような手法を使用するには、どのデータが正しく、どのデータが正しくないかを理解する必要があります。
そのため、コードをゼロから作成し、自分で計画することが非常に重要です。JS からどのデータを取得するかを決定したの
あなたである場合、それが良いか悪いかを判断できます。それが他の誰かだった場合、あなたは行き​​詰まり、もう一度尋ねる運命にあり、事態を悪化させます.
この悪循環を断ち切る必要があります。
だからこそ、自分でコードを書くことが非常に重要なのです。他の人にコードを書かせるのではありません。

それが役に立ち、学習に幸運をもたらすことを願っています。

于 2013-01-30T06:32:51.160 に答える
3

Firebug を使用して HTML にアクセスし、多くの掘り下げ (つまり、多くの掘り下げを意味します) を行った後、問題が何であるかがわかりました。しかし、最初に言っておきますが、あなたの常識は正しいです。コードを理解するには、自分で書く必要があります。

とにかく解決策は、多次元配列を追加し、0 から始まる各行をカウントする必要があることです。必要なのは次のようなものです。

 var imagecounter = 0;

      var result = '';
      imagecounter++;

....


     $('.hiddenimg').append('<input type="hidden" name="imgid[' + imagecounter + '][]" id="'+imageID+'" value="' + imageID + '" />');

これはgQuestion++、コードの学習を開始する必要があるという私の主張を証明しています。数時間の余裕がある場合は、コードを読んで、何が起こっているのかを理解してください。それはあなたにだけ利益をもたらすでしょう:)

于 2013-01-30T23:54:02.340 に答える