如何使用PHP / MySQL在正确的行中插入ID?

时间:2013-02-02 12:40:14

标签: php mysqli

假设我有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

现在每个视频都存储在视频表中的自己的ID中:

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

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

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?我认为问题在于它不承认问题可能没有视频,但我不确定,因此我寻求帮助的原因>

下面是插入问题表和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_dump组合在一起如下所示:

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.mp4的{​​{1}}为VideoId,那么在隐藏的输入中,它将在应用程序中为该视频的隐藏输入中的32移位。 / p>

然后通过使用多维数组并使用32这是一个以0开头的变量并使用videocounter - ++为每个问题递增,每个输入都属于一个问题编号取决于视频上传的问题。例如,如果视频是在问题2中上传的,则输入会重新确认检索到的视频ID属于问题2.如果我为问题4执行此操作,那么它将识别输入属于问题4等。

这里是一个演示我只能用它来查看它的工作原理(我将隐藏的输入更改为文本输入,以便您可以看到正在发生的事情):DEMO

更新:

当在Video_QuestionId中插入数据时,它在QuestionId显示0,下面的代码是否正确:

name="vidid[' + videocounter + '][]"

2 个答案:

答案 0 :(得分: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()的值。您应该可以通过更改“添加问题”行为,将问题编号放在视频上传表单的字段中,从而轻松完成此操作。

答案 1 :(得分:0)

它可能尝试插入两个值作为主键。如果是这种情况,请将数据库字段设置为非自动增量。然后--- parent作为videoid来匹配每个问题和它自己的个人ID。如果是这种情况,您无法正确插入已创建的行。,,请使用更新。使用自动递增时,某些表也不会按照您的意愿执行。如果是这种情况,请关闭自动递增并放置 - max(id2)+ 1 - 代替所有Primary $ id的值条目。 ---------------选择max(id)+1,“'。$ AnswerId。'”等。此外,每个表都应该有每个对应的父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.