-1

ここで表示できるアプリケーションがあります:アプリケーション

アプリケーションを正しく使用するには、以下の手順に従ってください。

  1. ボタンを2回クリックして、Add Question下のテーブルに2つのテーブル行を追加します。

  2. 両方のテーブル行には、独自のファイル入力があります。両方のファイル入力で、ビデオファイルをアップロードします(アップロードを迅速に行うために、非常に小さなビデオをお勧めします)。ビデオファイルを一度に1つずつアップロードする必要があります

  3. ファイルがアップロードされるたびに、テーブルの下にテキスト入力が表示されます。テキスト入力の値は、アップロードされた各ビデオファイルに関連付けられたデータベースのビデオIDです。

たとえば、私のビデオテーブルが現在次のようになっている場合:

ビデオテーブル:

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

2つのビデオファイル(video5.mp4video6.mp4)をアップロードし、テキスト入力の状態5とを6それぞれVideoアップロードすると、ファイルのアップロード後、テーブルが次のようになります。

ビデオテーブル:

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を取得したいと思います。したがって、ビデオファイルを送信してデータベースに挿入するときのデータベーステーブルは次のようになります。VideoIdVideo

質問表:

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取得してテーブルに挿入することです。VideoIdQuestionIdVideo_Question

Video Question以下は私の試みですが、テーブルには何も挿入されていません。

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

エラーを修正して、のINSERTを機能させるにはどうすればよいVideo_Questionですか?

以下は挿入のコードです(ノッチが表示される行番号にコメントしました):

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

Jquery:

   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_ids1つのインデックス付き配列です。その配列を初期化するコードを投稿しなかったので、それが1つのインデックス付き配列である理由ではありませんが、何でもかまいません。一方、$vidresultsPOST配列から取得されます。これは、キーを指定しない限り、インデックスがゼロになります(指定しない場合)。次に、を繰り返し$vidresults、キー(ゼロから開始)をに割り当ててから、次の行でそれらのキーを使用し$vididてアクセスを試みます。$question_ids

$vidquesid = $question_ids[$vidid];

ただし、通知にあるように$vidresults、ゼロからの最初のキーはに存在しません$question_ids。何らかの理由$question_idsで1つのインデックスを作成する必要がある場合は、反復を変更するか、キーに1つ追加するか、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);
});

それで、私が指摘した問題はまだ修正する必要があるかもしれませんが、私は最初は間違っていました。0ただし、問題は、からを手動で反復していることcount($_POST['numQuestions'])です。ただし$_POST['numQuestions']、は整数であり、配列ではありません。このページで「戻り値」セクションで指摘されているように、配列ではない値countが返されます。1したがって、最初の反復で、にアクセスしようとして、$_POST['numQuestions'][0]インデックスゼロが存在しないという通知をトリガーします。

注:バウンティプロトコルに関する以前の問題を参照しているコメントを見ました。私はそれがここに当てはまらないことを望んでいます。

編集2:追加したコードはforeachループを使用しており、未設定のインデックスにアクセスしようとはしません。そうは言っても、整数に対してforループを繰り返して反復しようとしていたので、ループ構造でそれを修正することはできません。つまり、あなたのアプローチには何か問題があり、それを解決する方法を決定するためにあなたの意図を再考する必要があります。質問には答えたと思いますが、デザインの問題を言い換えたい場合は、別途投稿された新しい質問に喜んでお答えします。

于 2013-01-26T05:25:23.510 に答える