Image_Question
テーブルにデータを挿入したい。Image_Question
ただし、テーブルへの挿入は実行されません。
2つのエラーが発生します:
- 注意:未定義のオフセット:305行目の...で0
- 注意:未定義のオフセット:305行目の3インチ...
使用できるアプリケーションは次のとおりです。アプリケーション
アプリを使用して何が起こっているかを確認するには、次の手順を実行します。
ボタンを2回クリック
Add Question
して、2つのファイル入力を追加します次に、ファイルを1つずつアップロードしますが、このようにします。行1のファイル入力にファイルをアップロードし、次に行2のファイルをアップロードし、次に行1のファイルを再度アップロードし、最後に行2のファイルをアップロードします。
以下はmysqliコードです:
// 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;
}
$imagequestionsql = "INSERT INTO Image_Question (ImageId, QuestionId)
VALUES (?, ?)";
if (!$insertimagequestion = $mysqli->prepare($imagequestionsql)) {
// Handle errors with prepare operation here
echo __LINE__.': '.$mysqli->error;
}
//make sure both prepared statements succeeded before proceeding
if( $insert && $insertimagequestion) {
$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;
}
$imgresults = $_POST['imgid'];
foreach($imgresults as $imgid => $imgvalue) {
$image = $imgvalue;
$imgquesid = $question_ids[$imgid]; //LINE 305 where error is
foreach($imgvalue as $image) {
$insertimagequestion->bind_param("ii",$image, $imgquesid);
$insertimagequestion->execute();
if ($insertimagequestion->errno) {
// Handle query error here
echo __LINE__.': '.$insertimagequestion->error;
break 2;
}
}
}
$insertimagequestion->close();
$insert->close();
}
?>
以下は、デモを設定するコードです。
function GetFormImageCount(){
return $('.imageuploadform').length + 1;
}
var qnum = 1;
var qremain = 5;
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 $image = $("<td width='17%' class='image'></td>");
$('.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);
});
var $fileImage = $("<form action='imageupload.php' method='post' enctype='multipart/form-data' target='upload_target_image' onsubmit='return imageClickHandler(this);' class='imageuploadform' >" +
"<p class='imagef1_upload_form'><label>" +
"Image File: <input name='fileImage' type='file' class='fileImage' /></label><br/><br/><label class='imagelbl'>" +
"<input type='submit' name='submitImageBtn' class='sbtnimage' value='Upload' /></label>" +
"<p class='imagef1_upload_process'>Loading...<br/><img src='Images/loader.gif' /></p>" +
"<input type='hidden' class='numimage' name='numimage' value='" + GetFormImageCount() + "' />" +
"</p><p class='imagemsg'></p><p class='listImage'></p>" +
"<iframe class='upload_target_image' name='upload_target_image' src='/' style='width:0px;height:0px;border:0px;solid;#fff;'></iframe></form>");
$image.append($fileImage);
$tr.append($qid);
$tr.append($image);
$tbody.append($tr);
}
function imageValidation(imageuploadform) {
var val = $(imageuploadform).find(".fileImage").val();
switch(val.substring(val.lastIndexOf('.') + 1).toLowerCase()){
case 'gif':
case 'jpg':
case 'jpeg':
case 'pjpeg':
case 'png':
return true;
case '':
$(imageuploadform).find(".fileImage").val();
alert("To upload an image, please select an Image File");
return false;
default:
alert("To upload an image, please select an Image File");
return false;
}
return false;
}
function htmlEncode(value) { return $('<div/>').text(value).html(); }
function startImageUpload(imageuploadform){
$(imageuploadform).find('.imagef1_upload_process').show()
$(imageuploadform).find('.imagef1_upload_form').hide();
$(imageuploadform).find('.imagemsg').hide();
sourceImageForm = imageuploadform;
return true;
}
var imagecounter = 0;
function stopImageUpload(success, imageID, imagefilename) {
var result = '';
imagecounter++;
if (success == 1){
result = '<span class="imagemsg'+imagecounter+'">The file was uploaded successfully</span>';
$('.hiddenimg').eq(window.lastUploadImageIndex).append('<input type="text" name="imgid[]" id="'+imageID+'" value="' + imageID + '" />');
$('.listImage').eq(window.lastUploadImageIndex).append('<div>' + htmlEncode(imagefilename) + '<button type="button" class="deletefileimage" data-imageID="'+imageID+'" data-image_file_name="' + imagefilename + '" value="'+imageID+'">Remove</button><br/><hr/></div>');
}
$(sourceImageForm).find('.imagef1_upload_process').hide();
$(sourceImageForm).find('.imagemsg').html(result);
$(sourceImageForm).find('.imagemsg').show();
$(sourceImageForm).find(".fileImage").replaceWith("<input type='file' class='fileImage' name='fileImage' />");
$(sourceImageForm).find('.imagef1_upload_form').show();
var _imagecounter = imagecounter;
$('.listImage').eq(window.lastUploadImageIndex).find(".deletefileimage").on("click", function(event) {
jQuery.ajax("deleteimage.php?imagefilename=" + $(this).attr('data-image_file_name')).done(function(data) {
$(".imagemsg" + _imagecounter).html(data);
});
var buttonid = $(this).attr('value');
$(this).parent().remove();
$("#"+ buttonid +"").remove();
});
return true;
}
function imageClickHandler(imageuploadform){
if(imageValidation(imageuploadform)){
window.lastUploadImageIndex = $('.imageuploadform').index(imageuploadform);
return startImageUpload(imageuploadform);
}
return false;
}
</script>
</head>
<body>
<form id="QandA" action="insertQuestion.php" method="post">
<table id="question">
<tr>
<th colspan="2">
Question Number <span class="questionNum">1</span>
<input type="hidden" class="num_questions" name="numQuestion" value="1">
</th>
</tr>
</table>
<table id="questionBtn" align="center">
<tr>
<th>
<input id="addQuestionBtn" name="addQuestion" type="button" value="Add Question" onClick="insertQuestion(this.form)" />
</th>
</tr>
</table>
</div><hr/><!-- This Divide close tag has no open tag!-->
<table id="qandatbl" align="center" cellpadding="0" cellspacing="0" border="0">
<thead>
<tr>
<th width="5%" class="qid">Question Number</th>
<th width="17%" class="image">Image</th>
</tr>
</thead>
</table>
<div id="qandatbl_onthefly_container">
<table id="qandatbl_onthefly" align="center" cellpadding="0" cellspacing="0" border="0">
<tbody>
</tbody>
</table>
</div>
<div class="hiddenimg"><!-- All uploaded image file ids go here --></div>
</form>
</body>
次のvar_dumpsを実行します。
var_dump($question_ids);
var_dump($imgresults);
私はこれらの結果を得る:
array(2) {
[1]=> int(159)
[2]=> int(160)
}
array(2) {
[0]=> string(3) "129"
[1]=> string(3) "130"
}
奇妙なのは、imgresultの数字が0から1で始まることです。また、なぜ文字列を示しているのかわかりません。intである必要があります。しかし、それが入力からのものである場合、bind_paramを呼び出すのですi
か、それともs
dbのようにそのintを呼び出すのですか?
追加の詳細:
私が得られないのはこのmysqliの下にあり、答えのために同様のmysqliを生成します。奇妙なことに、上記のimage_question挿入のように0で始まっていても、正しく挿入されます。
$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;
}
}
}
var_dump($ result)は、1つの質問に対する以前のvarダンプを示しています。
array(1) { //var_dump($question_ids);
[1]=> int(171)
} array(1) { //var_dump($imgresults);
[0]=> string(3) "130"
} array(1) {
[1]=> array(1) { //var_dump($results);
[0]=> string(1) "B" } }