我有一个你可以在这里查看的应用程序:APPLICATION
请按照以下步骤正确使用该应用程序:
点击Add Question
按钮两次,在下方的表格中附加2个表格行。
两个表行都有自己的文件输入。在两个文件输入中上传一个视频文件(我建议一个非常小的视频,以便快速上传)。您必须一次上传一个视频文件
您将看到每次上传文件时,在表格下方会显示文本输入,文本输入中的值是与上传的每个视频文件关联的数据库中的视频ID。
例如,如果我的视频表目前看起来像这样:
视频表:
VideoId (auto PK) VideoFiles
4 Files/video1.mp4
如果我上传了2个视频文件(video5.mp4
和video6.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
,并希望从VideoId
表中检索视频的Video
。以下是在将视频文件提交并插入db时数据库表的外观:
问题表:
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
检索属于该VideoId
的任何QuestionId
{1}}并将其插入Video_Question
表格?
以下是我的尝试,但没有任何内容插入Video Question
表,它给了我一个:
Notice: Undefined offset: 0 in .... on line 305 error
如何修复错误并使Video_Question
的INSERT生效?
下面是插入的代码(我已经注释了出现消息的行号):
// 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++;
});
答案 0 :(得分:1)
$question_ids
是一个索引数组。你没有发布初始化该数组的代码,所以我不是为什么它是一个索引数组,但无论如何。另一方面,$vidresults
来自POST数组,除非您指定键(否则为零),否则该数组为零索引。然后,您遍历$vidresults
,将密钥(从零开始)分配到$vidid
,然后尝试使用此行上的密钥访问$question_ids
:
$vidquesid = $question_ids[$vidid];
但是,正如通知所说,$vidresults
中的$question_ids
的第一个密钥,零,不存在。$question_ids
。如果由于某种原因$questionNo = $_POST['numQuestion'][$i];
必须是一个索引,您可以更改迭代,向键添加一个,或更改html以指定索引(由于您生成输入元素的方式可能会有问题)
我不知道这种事情是否有任何官方消息来源。 This question描述了HTTP数组语法。
编辑你发布了这个:
<th colspan="2">
Question Number <span class="questionNum">1</span>
<input type="hidden" class="num_questions" name="numQuestion" value="1">
</th>
但你没有发布相关的html / jquery。 html看起来像这样:
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);
});
jquery(无关紧要,只是为了表明它没有将输入类型更改为数组):
0
所以,我第一次错了,虽然我指出的问题可能仍需要修复。但问题是您手动从count($_POST['numQuestions'])
迭代到$_POST['numQuestions']
。但是count
是一个整数,而不是一个数组,而this page指出返回值部分,1
将返回$_POST['numQuestions'][0]
表示不是数组的值。因此,您在第一次迭代时尝试访问{{1}},触发索引零不存在的通知。
注意:我看到评论引用了一些早期的bounty协议问题。我希望这不适用于此。
编辑2:您添加的代码使用foreach循环,它永远不会尝试访问未设置的索引。话虽这么说,你仍然试图用一个for循环遍历一个整数,并且没有循环结构会解决这个问题。也就是说,你的方法有问题,你必须重新考虑你的意图,决定如何解决它。我想我已回答了这个问题,但如果您想重新解释设计问题,我很乐意回答一个单独发布的新问题。