簡體   English   中英

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

[英]How to insert IDs in correct rows with PHP/MySQL?

可以說我有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顯示在一起。 這是不正確的,因為這意味着視頻存儲在錯誤的問題中。 在上面示例的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 + '" />');

它能夠為每個上傳的視頻檢索並顯示插入到Video表中的VideoId 因此,例如,如果Wildlife.mp4 VideoId32 ,則在隱藏輸入中,它將在應用程序中該視頻的隱藏輸入中顯示數字32

然后,通過使用多維數組並使用videocounter ,該變量是從0開始並使用++ ,- name="vidid[' + videocounter + '][]"為每個問題遞增的變量,每個輸入都屬於一個問題編號,具體取決於視頻是在哪個問題上上傳的。因此,例如,如果視頻是在問題2上上傳的,則輸入會識別出檢索到的視頻ID屬於問題2。如果我對問題4這樣做,則它將識別出輸入屬於問題4等

我只是在這里演示了一個示例,您可以用來查看它的工作方式(我將隱藏的輸入更改為文本輸入,以便可以看到發生了什么): DEMO

更新:

現在,在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>');
          }

....

}

我看不到您前端的任何地方,都無法將上傳的視頻與與之相關的問題聯系起來。 因此,當您提交表單時,它基本上只發送兩個不相關的列表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是questionNum。

編輯:

您將無法在調用時為stopVideoUpload()函數確定該值,因此您需要為該函數創建一個新參數並將該值傳遞給它。這意味着視頻上傳的PHP代碼當然需要知道傳遞給stopVideoUpload() 通過更改“添加問題”行為,將問題編號放在視頻上傳表單的字段中,您應該能夠足夠輕松地完成此操作。

它可能試圖插入兩個值作為主鍵。 在這種情況下,請將數據庫字段設置為非自動增量。 然后,將其作為視頻ID的父級,以將每個問題與其自己的ID相匹配。 在這種情況下,您不能正確地插入已經創建的行中。請對其進行更新。 同樣,某些表在使用自動增量時不會如您所願。 如果是這種情況,請關閉自動遞增功能,並使用max(id2)+1代替所有主要$ 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. 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM