1

假设我有3个问题:

QuestionNo   Video
1            
2            wildlife.mp4
3
4            colors.mp4
             sports.mp4

现在我正在做的是将每个问题插入数据库,为每个问题提供自己的自动 QuestionId,所以它现在在技术上看起来像这样:

QuestionId    QuestionNo  Video
123           1
124           2           wildlife.mp4
125           3
126           4           colors.mp4 
                          sports.mp4

现在下面是db中的问题表:

QuestionId (pk auto)  QuestionNo
123                   1
124                   2
125                   3
126                   4

现在每个视频都存储在 Video Table 中自己的 id 中:

VideoId (auto pk)   VideoFile
12                  wildlife.mp4
13                  colors.mp4
14                  sports.mp4

现在终于,这就是问题所在,我有一个 Video_Question 表,我们用它来了解哪个视频进入哪个问题。现在的问题是我为此设置插入的方式是它检索最后一个 QuestionId 插入,然后找到它找到的第一个 videoId 并使用该 QuestionId 显示它。这是不正确的,因为这意味着视频存储在错误的问题中。在上述示例的 db 中,它将像这样显示:

Video_Question 表:

VideoQuestionId (auto pk)  QuestionId  VideoId
4                          123         12
5                          124         13
6                          124         14

以上不正确,因为 VideoId 12 不应该属于 QuestionId 123,它应该在 124 中,VideoId 13 和 14 应该在 126 中,而不是像下面的 124:

Video_Question 表:

VideoQuestionId (auto pk)  QuestionId  VideoId
4                          124         12
5                          126         13
6                          126         14

我的问题是,看看上面的例子,我怎样才能用正确的 QuestionId 插入 videoid?我认为问题在于它没有认识到问题可能没有视频,但我不确定,因此我为什么要寻求帮助>

下面是插入 Question 表和 Video_Question 表的代码:

// Prepare your statements ahead of time
$questionsql = "INSERT INTO Question (SessionId, QuestionNo,
    QuestionContent, NoofAnswers, ReplyId, QuestionMarks, OptionId) 
    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; 
} 

//make sure both prepared statements succeeded before proceeding
if( $insert && $insertvideoquestion)
{
    $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;
    }

    $vidresults = $_POST['vidid'];

    foreach($vidresults as $videoid => $vidvalue) 
    {

         $video = $vidvalue;

         $vidquesid = (int)$question_ids[$videoid];  

         foreach($vidvalue as $video) 
         {

             $insertvideoquestion->bind_param("ii",$video, $vidquesid); 

             $insertvideoquestion->execute(); 

             if ($insertvideoquestion->errno) { 
                 // Handle query error here 
                 echo __LINE__.': '.$insertvideoquestion->error;
                 break 5;
             } 

         }
    }

    $insertvideoquestion->close(); 
    $insert->close();

}

更新:

以下是与上述示例匹配的 var_dumps,唯一的区别是文件名和 id 号。上面提到的例子有4个问题:

var_dump($question_ids);

    array(4) { 
[1]=> int(277) 
[2]=> int(278) 
[3]=> int(279) 
[4]=> int(280) 
} 

var_dump($_POST['vidid']);

array(3) { 
[1]=> array(1) { 
[0]=> string(3) "148" 
} 
[2]=> array(1) { 
[0]=> string(3) "149" 
} 
[3]=> array(1) { 
[0]=> string(3) "150" 
} }

将上面的 var_dumps 组合在一起看起来像这样:

array(4) { 
[1]=> int(289) 
[2]=> int(290) 
[3]=> int(291) 
[4]=> int(292) 
} 
array(3) { 
[1]=> array(1) { 
[0]=> string(3) "148"
} 
[2]=> array(1) { 
[0]=> string(3) "149" 
} 
[3]=> array(1) { 
[0]=> string(3) "150" 
} } 

额外细节:

通过使用这行代码:

$('.hiddenvid').append('<input type="hidden" name="vidid[' + videocounter + '][]" id="'+videoID+'" value="' + videoID + '" />');

它能够为每个上传的视频检索并显示VideoId插入到表格中的内容。Video因此,例如,如果Wildlife.mp4has VideoIdwhich is 32,那么在隐藏输入中,它将显示32应用程序中该视频的隐藏输入中的数字。

然后通过使用多维数组并使用videocounterwhich 是一个以 0 开头并使用++, - 为每个问题递增的变量name="vidid[' + videocounter + '][]",每个输入都属于一个问题编号,具体取决于上传视频的问题。例如,如果上传了视频在问题 2 中,输入识别检索到的视频 id 属于问题 2。如果我为问题 4 执行此操作,那么它将识别出输入属于问题 4,依此类推。

这是一个演示,你可以用它来看看它是如何工作的(我将隐藏的输入更改为文本输入,这样你就可以看到发生了什么):演示

更新:

目前在 Video_QuestionId 中插入数据时,QuestionId 显示为 0,以下代码是否正确:

function stopVideoUpload(success, videoID, videofilename){

      var result = '';
      videocounter++;


      var questionNum = $(this).closest('td').siblings('.qid').find('input.num_questionsRow').val();

      if (success == 1){
         result = '<span class="videomsg'+videocounter+'">The file was uploaded successfully</span>';
            $('.hiddenvid').append('<input type="text" name="vidid['+questionNum+'][]" id="'+videoID+'" value="' + videoID + '" />');
            $('.listVideo').eq(window.lastUploadVideoIndex).append('<div>' + htmlEncode(videofilename) + '<button type="button" class="deletefilevideo" data-videoID="'+videoID+'"  data-video_file_name="' + videofilename + '" value="'+videoID+'">Remove</button><br/><a href="previewvideo.php?filename='+ videofilename +'" title="Click to view in New window" target="_blank">Test Video<hr/></div>');
          }

....

}
4

2 回答 2

1

我在您的前端看不到任何将上传的视频与它们相关的问题联系起来的地方。因此,当您提交表单时,它基本上只是发送两个不相关的列表numQuestion:(q1,q2,q3...)和vidid:(videos1[],videos2[],videos3[]...)。数组键只是它们添加的顺序,这不是您想要的。

有许多不同的方法可以解决这个问题,但最直接的方法是更改​​为视频构建这些隐藏字段的方式,以便它们与问题的 id 相关。

代替:

<input type="text" name="vidid[]" id="'+videoID+'" value="' + videoID + '" />

你希望这像

<input type="text" name="vidid['+questionNum+'][]" id="'+videoID+'" value="' + videoID + '" />

questionNum视频是针对哪里的问题。

编辑:

您将无法在函数调用时确定这一点,stopVideoUpload()因此您需要为该函数创建一个新参数并将此值传入。这意味着视频上传的 PHP 代码当然需要知道要传递什么值到stopVideoUpload(). 您应该能够通过更改“添加问题”行为将问题编号放在视频上传表单的字段中来轻松完成此操作。

于 2013-02-05T04:32:49.633 回答
0

它可能试图插入两个值作为主键。如果是这种情况,请将数据库字段设置为非自动增量。然后---父母作为视频ID,以将每个问题与它自己的个人ID相匹配。如果是这种情况,您将无法正确插入已创建的行。,请为它们使用更新。此外,在使用自动递增时,某些表不会如您所愿。如果是这种情况,请关闭自动递增并放置--max(id2)+1-- 代替所有主 $id 的值条目。---------------select max(id)+1, "'.$AnswerId.'" 等。此外,每个表都应该有每个对应的 parent-id。

    video-table
    ------------pid------
    questions-table
    ------------qid-----pid----id
    video-question-table
    ------------id------qid----pid


    if(mysql_query('insert into questions (id, parent, questionContent, NoofAnswers,
    ReplyId, AnswerId) select "'.$id.'", "'.$res['parent'].'", "'.$questionCont.'",
    "'.$Noofanswers.'", "'.$ReplyId.'", "'.$AnswerId.'" from questions where
    id="'.$id.'"') and mysql_query('update videos_questions set VideoId="'.$vid.'"and set
    QuestionId="'.$qid where id="'.$id.'" and parent=1'))  etc. 
于 2013-02-05T14:42:48.493 回答