6

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

我收到两个错误:

  • 注意:未定义的偏移量:0 in ... 在第 305 行
  • 注意:未定义的偏移量:3 in ... 在第 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();
}

?>

下面是设置演示的代码:

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_parami还是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;
        }
    }
}

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。而问题只属于其中之一。你必须学会​​将你的问题至少分离到这些领域的限制。
是 JS 从客户端发送错误(意外)数据吗?好了,收起所有PHP和Mysql代码,只留下JS。它将帮助 Stackoverflowers 甚至您自己调查问题。
这个数据好吗?你确定吗?打印出来并确保它完全符合您的期望。
如果没问题 - 转到 PHP 部分(但不要忘记从问题中删除所有 JS)。
等等。

问你的问题不是像“它没有插入”这样的一般术语,而是特定的数据流:“我期待这样的数据进入程序,但我还有另一个。”
一旦您开始使用它,您将不需要 Stackoverflow 来回答:您将能够将问题追溯到数据意外错误的地方。所以 - 你找到了错误的地方。

运行问题代码也很重要。并在您遇到问题的环境中运行它。
运行代码并检查实际结果比仅仅用眼睛看代码更有效率。 甚至可能有一些情况只属于你的服务器而其他人不知道,使他们根本无法回答你的问题。 此外,人类不应该在他们的头脑中运行 PHP 代码。它可以运行几行代码,但从某种意义上说,在精神上运行所有代码并找到错误是不可能的。


这就是为什么运行代码并打印出所有值、函数结果、检查变量状态等如此重要的原因——并寻找其中的不一致之处。

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

希望对您有所帮助,祝您学习顺利。

于 2013-01-30T06:32:51.160 回答
3

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

无论如何,解决方案是您需要添加一个多维数组并从 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 回答