[英]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
VideoId
為32
,則在隱藏輸入中,它將在應用程序中該視頻的隱藏輸入中顯示數字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.