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

これで、各ビデオはビデオ テーブルに独自の 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 は以下のように 124 ではなく 126 に属すべきであるため、上記は正しくありません。

Video_Question テーブル:

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

私の質問は、上記の例を見て、videoid を正しい QuestionId で挿入するにはどうすればよいですか? 問題は、質問にビデオがない可能性があることを認識していないことだと思いますが、よくわからないため、なぜ助けを求めているのですか>

以下は、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.mp4VideoIdである場合、非表示の入力では、アプリケーション内のそのビデオの非表示の入力32の番号が表示されます。32

次に、多次元配列を使用し、videocounterwhich を 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>');
          }

....

}
4

2 に答える 2

1

アップロードされた動画と関連する質問を結び付けるフロントエンドの場所はどこにも見当たりません。したがって、フォームを送信すると、基本的に2つの無関係なリスト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

2 つの値を主キーとして挿入しようとしている可能性があります。この場合、データベース フィールドを非自動インクリメントに設定します。次に--- 親を videoid として、各質問を独自の ID と一致させます。この場合、すでに作成されている行に適切に挿入することはできません.,,更新を使用してください. また、自動インクリメントを使用すると、一部のテーブルが希望どおりに機能しません。この場合、自動インクリメントをオフにして、すべてのプライマリ $id の値エントリの代わりに max(id2)+1 を配置します。---------------select 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. 
于 2013-02-05T14:42:48.493 に答える