-1

我有一个应用程序,您可以在这里查看:应用程序

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

  1. 单击该Add Question按钮两次以在下面的表格中附加 2 个表格行。

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

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

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

视频表:

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

如果我分别上传 2 个视频文件 (video5.mp4video6.mp4) 并且文本输入状态56,那么这意味着Video在上传文件后表格现在看起来像 thi:

视频表:

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。因此,在提交视频文件并将其插入数据库时​​,数据库表应如下所示:

问题表:

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并将其插入Video_Question表格?

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

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

如何修复错误并获得 INSERTVideo_Question才能正常工作?

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

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

查询:

   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++;
   });
4

1 回答 1

1

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

$vidquesid = $question_ids[$vidid];

但是,正如通知所说,$vidresults从零开始的第一个键在 中不存在$question_ids。如果由于某种原因$question_ids必须是一个索引,您可以更改迭代,将一个添加到键,或更改 html 以指定索引(这可能会因为您生成输入元素的方式而产生问题)。

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

编辑:你发布了这个:

$questionNo = $_POST['numQuestion'][$i];

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

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

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

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

所以,我第一次错了,尽管我指出的问题可能仍然需要解决。但问题是您手动从0to迭代count($_POST['numQuestions'])。But$_POST['numQuestions']是一个整数,而不是一个数组,正如本页在“返回值”部分中指出的那样,count将返回1一个不是数组的值。因此,您在第一次迭代时尝试访问$_POST['numQuestions'][0],触发索引零不存在的通知。

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

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

于 2013-01-26T05:25:23.510 回答