它不是将数据插入数据库

use*_*090 6 html php jquery mysqli

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

我收到两个错误:

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

这是您可以使用的应用程序:应用程序

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

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

  2. 现在一次上传一个文件但是这样做.在第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();
}

?>
Run Code Online (Sandbox Code Playgroud)

下面是设置演示的代码:

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>
Run Code Online (Sandbox Code Playgroud)

通过执行以下var_dumps:

   var_dump($question_ids);
    var_dump($imgresults);
Run Code Online (Sandbox Code Playgroud)

我得到这些结果:

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

奇怪的是数字从0开始然后是imgresult而且我不知道它为什么说明字符串,它应该是一个int.但是,如果它来自输入,我是否调用bind_param i或者s在db中调用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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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" } } 
Run Code Online (Sandbox Code Playgroud)

You*_*nse 17

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

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

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

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

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

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


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

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

  • +1.这可能是这里有很多问题的首选答案(当你想到它时会非常难过). (2认同)
  • +1运行代码并检查实际结果比仅用眼睛看代码更有效. (2认同)

use*_*374 3

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

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

 var imagecounter = 0;

      var result = '';
      imagecounter++;

....


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

现在你之前做了类似的事情gQuestion++,这证明了我的观点,你需要开始学习代码。如果您有几个小时的空闲时间,请阅读您的代码并尝试了解发生了什么。它只会对你有利:)