数据未插入数据库表

时间:2013-01-24 04:44:16

标签: php jquery html mysqli

我有一个你可以在这里查看的应用程序:APPLICATION

请按照以下步骤正确使用该应用程序:

  1. 点击Add Question按钮两次,在下方的表格中附加2个表格行。

  2. 两个表行都有自己的文件输入。在两个文件输入中上传一个视频文件(我建议一个非常小的视频,以便快速上传)。您必须一次上传一个视频文件

  3. 您将看到每次上传文件时,在表格下方会显示文本输入,文本输入中的值是与上传的每个视频文件关联的数据库中的视频ID。

  4. 例如,如果我的视频表目前看起来像这样:

    视频表:

    VideoId (auto PK)  VideoFiles
    4                  Files/video1.mp4
    

    如果我上传了2个视频文件(video5.mp4video6.mp4)并且文本分别输入了状态56,则表示Video表现在看起来像上传文件后:

    视频表:

    VideoId (auto PK)  VideoFiles
    4                  Files/video1.mp4
    5                  Files/video5.mp4
    6                  Files/video6.mp4
    

    现在显示文本输入的代码如下:

    上传完成并生成文字输入后的Jquery:

    function stopVideoUpload(success, videoID, videofilename){
    
          var result = '';
    
          if (success == 1){
             result = '<span class="videomsg'+videocounter+'">The file was uploaded successfully</span>';
                $('.hiddenvid').append('<input type="text" name="vidid[]" id="'+videoID+'" value="' + videoID + '" />');
              }
    
          $(sourceVideoForm).find('.videof1_upload_process').hide();
          $(sourceVideoForm).find('.videomsg').html(result);
          $(sourceVideoForm).find('.videof1_upload_form').show();   
    
    
          return true;   
    }
    

    存储文字输入的Div标记:

    <div class="hiddenvid"><!-- All uploaded video file ids go here --></div>
    

    现在问题如下,我想在数据库中存储哪个问题包含哪些视频。为此,我会将问题编号存储在Question表中,并为其提供QuestionId,并希望从VideoId表中检索视频的Video。以下是在将视频文件提交并插入db时数据库表的外观:

    问题表:

    QuestionId (auto PK) QuestionNo
    25                    1
    26                    2
    

    Video_Question表:

    VideoQuestionId (PK auto)  VideoId  QuestionId
    7                          5         25
    8                          6         26
    

    我遇到的问题是我正在努力为Video_Question表插入数据。插入Question表格很好,但我要做的是检索提交的最后一个QuestionId,并为每个QuestionId检索属于该VideoId的任何QuestionId {1}}并将其插入Video_Question表格?

    以下是我的尝试,但没有任何内容插入Video Question表,它给了我一个:

    Notice: Undefined offset: 0 in .... on line 305 error

    如何修复错误并使Video_Question的INSERT生效?

    下面是插入的代码(我已经注释了出现消息的行号):

    // 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;
    }
    
         $videoquestionsql = "INSERT INTO Video_Question (VideoId, QuestionId)  
            VALUES (?, ?)"; 
    
             if (!$insertvideoquestion = $mysqli->prepare($videoquestionsql)) { 
              // Handle errors with prepare operation here 
               echo __LINE__.': '.$mysqli->error; 
            } 
    
        $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 3;
                }
    
                $questionId = $mysqli->insert_id;
    
                $question_ids[$questionNo] = $questionId;
    
    
    }
    
                    $vidresults = $_POST['vidid'];
                foreach($vidresults as $vidid => $vidvalue) 
                {
    
                    $video = $vidvalue;
    
                    $vidquesid = $question_ids[$vidid];  
    
                    foreach($vidvalue as $video) 
                    {
    
        $insertvideoquestion->bind_param("ii",$video, $vidquesid); 
    
            $insertvideoquestion->execute(); 
    
                        if ($insertvideoquestion->errno) { 
                  // Handle query error here 
                  echo __LINE__.': '.$insertvideoquestion->error;
                  break 4;
                } 
    
            }
        }
    

    通过执行以下var_dumps:

    var_dump($question_ids);
    var_dump($vidid);
    

    我得到了这些结果:

    array(2) { 
    [1]=> int(159)
    [2]=> int(160) 
    } int(1)
    

    更新

    我不明白的是,下面的代码是非常相似的,但是为什么它的工作方式以及我用于视频的mysqli代码不起作用:

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

    Jquery的:

       var $this, i = 0,
           $row, $cell;
       $('#optionAndAnswer .answers').each(function () {
           $this = $(this);
           if (i % 6 == 0) {
               $row = $("<tr/>").appendTo($answer);
               $cell = $("<td/>").appendTo($row);
           }
           var $newBtn = $(("<input class='answerBtnsRow answers' type='button' style='display:%s;' onclick='btnclick(this, " + gQuestionIndex + ");' />")
                           .replace('%s', $this.is(':visible') ? 'inline-block' : 'none')).attr('name', "value[" + gQuestionIndex + "][]")
               .attr('value', $this.val()).attr('class', $this.attr('class')).attr('id', $this.attr('id') + 'Row');
           $newBtn.appendTo($cell);
    
           i++;
       });
    

1 个答案:

答案 0 :(得分:1)

$question_ids是一个索引数组。你没有发布初始化该数组的代码,所以我不是为什么它是一个索引数组,但无论如何。另一方面,$vidresults来自POST数组,除非您指定键(否则为零),否则该数组为零索引。然后,您遍历$vidresults,将密钥(从零开始)分配到$vidid,然后尝试使用此行上的密钥访问$question_ids

$vidquesid = $question_ids[$vidid];

但是,正如通知所说,$vidresults中的$question_ids的第一个密钥,零,不存在。$question_ids。如果由于某种原因$questionNo = $_POST['numQuestion'][$i]; 必须是一个索引,您可以更改迭代,向键添加一个,或更改html以指定索引(由于您生成输入元素的方式可能会有问题)

我不知道这种事情是否有任何官方消息来源。 This question描述了HTTP数组语法。

编辑你发布了这个:

<th colspan="2">
    Question Number <span class="questionNum">1</span>
    <input type="hidden" class="num_questions" name="numQuestion" value="1">
</th>

但你没有发布相关的html / jquery。 html看起来像这样:

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 $video = $("<td width='17%' class='video'></td>");
  var $questionType = '';

  $('.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);
});

jquery(无关紧要,只是为了表明它没有将输入类型更改为数组):

0

所以,我第一次错了,虽然我指出的问题可能仍需要修复。但问题是您手动从count($_POST['numQuestions'])迭代到$_POST['numQuestions']。但是count是一个整数,而不是一个数组,而this page指出返回值部分,1将返回$_POST['numQuestions'][0]表示不是数组的值。因此,您在第一次迭代时尝试访问{{1}},触发索引零不存在的通知。

注意:我看到评论引用了一些早期的bounty协议问题。我希望这不适用于此。

编辑2:您添加的代码使用foreach循环,它永远不会尝试访问未设置的索引。话虽这么说,你仍然试图用一个for循环遍历一个整数,并且没有循环结构会解决这个问题。也就是说,你的方法有问题,你必须重新考虑你的意图,决定如何解决它。我想我已回答了这个问题,但如果您想重新解释设计问题,我很乐意回答一个单独发布的新问题。