它不是将数据插入数据库

时间:2013-01-28 02:59:33

标签: php jquery html mysqli

我想将数据插入Image_Question表。但它不会在Image_Question表中执行插入。

我遇到两个错误:

  • 注意:未定义的偏移量:在第305行的<...
  • 中为0
  • 注意:未定义的偏移量:在第305行的第3行

以下是您可以使用的应用程序:Application

要使用app查看发生的情况,请执行以下操作:

  1. 点击Add Question按钮两次以附加两个文件输入

  2. 现在一次上传一个文件,但是这样做。在第1行的文件输入中上传文件,然后在第2行上传文件,然后再次在第1行上传文件,最后在第2行上传文件。

  3. 下面是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。但是如果它来自一个输入,我是否在db中将bind_param is称为int?

    额外详细信息:

    我没有得到的是在这个mysqli之下,我为答案产生了类似的mysqli,奇怪的是它正确地插入,即使它以0开头,如上面的image_question插入:

    $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" } } 
    

2 个答案:

答案 0 :(得分:17)

我的答案不是针对特定问题,而是针对更广泛的话题。

这是关于你一般工作的方式 你需要改变它。
看,你所有的问题都是大到的答案。并且变得更大。然而得到的答案却少了 它让你做绝望的事情 - 骗取问题,赏金,账户 - 但都是徒劳的。 这是无处可去的道路。

您需要改变学习方式和使用这个伟大网站的方式 任何人都知道他们正在使用的工具是非常重要的。你必须自己编写代码,只有在你真正解决问题时才寻求帮助 因此,您将了解您的代码。这是必不可少的 - 了解您的代码的作用。它的每一行。因此,您将能够自行解决问题并自行修复代码 否则你注定要为每一个错字寻求帮助,比如在这种情况下。

此外,由于你无法深入研究问题的根源,你必须发布大量代码和问题,这使得回答变得复杂。
你的问题中有三个独立的领域 - JavaScript,PHP和Mysql。问题只属于其中一个。你必须学会​​将你的问题至少分开到这些领域的极限 它是JS从客户端发送错误(意外)数据吗?好的,收起所有的PHP和Mysql代码,只留下JS。这将有助于Stackoverflowers,甚至自己调查问题 这个数据还可以吗?你确定吗?打印出来并确保它完全符合您的预期。
如果没问题 - 转到PHP部分(但不要忘记从问题中删除所有JS )。
等等。

请问您的问题不是一般性的术语,例如“它不是插入”,而是根据特定的数据流程:“我希望这些数据进入程序,但我还有另一个。”
一旦开始使用它,您将不需要Stackoverflow来回答:您将能够将问题跟踪到数据意外错误的位置。所以 - 你找到了错误的地方。

运行问题代码也非常重要。并在你遇到问题的环境中运行它 运行代码并检查实际结果方式更有效,而不仅仅是用眼睛看的代码。
甚至某些情况可能只属于您的服务器而其他人不知道,这使得他们根本无法回答您的问题 此外,不应该在他们的头脑中运行PHP代码。它可以工作几行,但从某些方面来说,只是不可能运行所有代码精神上并找到错误。
这就是为什么运行代码并打印出所有值,函数结果,检查变量状态等非常重要的原因 - 并查找它们中的不一致性。

当然,要使用这种技术,您必须了解哪些数据是正确的,哪些数据不正确 这就是为什么从头开始编写代码并自行规划是如此重要的原因 如果是谁决定了,应该从JS获得什么数据 - 你可以判断它是好还是坏。如果是其他人 - 你已陷入死胡同,注定要再次提出要求,让事情变得更糟 你需要打破这种恶性循环 这就是为什么它是如此重要的事情 - 自己编写代码,而不是让其他人为你做。

希望它有助于学习并带来好运。

答案 1 :(得分:3)

使用Firebug我进入了HTML并经过大量挖掘(我的意思是大量挖掘),我知道你的问题是什么。但是,首先让我说你的常识是正确的,让你理解你自己编写代码所需的代码。

无论如何,解决方案是你需要添加一个多维数组并从0开始计算每一行。你需要的是这样的:

 var imagecounter = 0;

      var result = '';
      imagecounter++;

....


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

现在你使用gQuestion++做了类似的事情,这证明了我需要开始学习代码的观点。如果您有几个小时的时间,请阅读您的代码并尝试了解正在发生的事情。它只会让你受益:)