Как правильно размещать и вставлять значения в базу данных?

82
11

Я хочу использовать многомерный массив в этом формате: значение [n] [], где n - номер вопроса. С помощью этой новой настройки вы должны будете иметь следующие поля флажков:

<input type="checkbox" value="A" name="value[1][]">
<input type="checkbox" value="B" name="value[1][]">
<input type="checkbox" value="A" name="value[2][]">
<input type="checkbox" value="C" name="value[2][]">
<input type="checkbox" value="E" name="value[2][]">

Обратите внимание, что выбранное значение кодируется в атрибуте value. Атрибут name содержит только вопрос, которому принадлежит значение.

Итак, что говорится выше, это:

question 1: answer: A
question 1: answer: B
question 2: answer: A
question 2: answer: C
question 2: answer: E

Я хочу вставить эти данные в таблицы базы данных "Вопрос" и "Ответ" ниже:

Таблица вопросов:

SessionId    QuestionId

MUL 1
MUL 2

Таблица ответов:

 AnswerId (auto)  SessionId  QuestionId   Answer
1 MUL 1 A
2 MUL 1 B
3 MUL 2 A
4 MUL 2 C
5 MUL 2 E

Теперь я попытался написать код mysqli/php ниже, чтобы вставить эти значения в базу данных, но я получаю ошибки и плохо терпеть неудачу в стремлении добиться того, чего я хочу достичь. Мне нужна помощь, позволяющая правильно вставлять правильные значения в соответствующие таблицы.

Ниже приведен код php/mysqli:

var_dump($_POST);  

$i = 0;
$c = count($_POST['numQuestion']);

for($i = 0; $i < $c; $i++ ){

/*
switch ($_POST['gridValues'][$i]){

case "3":
$selected_option = "A-C";
break;

case "4":
$selected_option = "A-D";
break;

case "5":
$selected_option = "A-E";
break;

default:
$selected_option = "";
break;

}

*/ needed later on when I insert grid values

$results = $_POST['value'];
foreach($results as $id => $value) {
$answer = $value;

$questionsql = "INSERT INTO Question (SessionId, QuestionId)
VALUES (?, ?)";

$sessid = $_SESSION['id'] . ($_SESSION['initial_count'] > 1 ? $_SESSION['sessionCount'] : '');

if (!$insert = $mysqli->prepare($questionsql)) {
// Handle errors with prepare operation here
}

$insert->bind_param("si", $sessid, $id);

$insert->execute();

if ($insert->errno) {
// Handle query error here
}

$insert->close();

$insert->insert_id;

foreach($value as $answer) {

$answersql = "INSERT INTO Answer (SessionId, QuestionId, Answer)
VALUES (?, ?, ?)";

if (!$insertanswer = $mysqli->prepare($answersql)) {
// Handle errors with prepare operation here
}

$insertanswer->bind_param("sis" $sessid, $lastID, $answer);

$insertanswer->execute();

if ($insertanswer->errno) {
// Handle query error here
}

$insertanswer->close();

}

}

}

var_dump($_POST) выводит это ниже:

    array(3) { 
["numQuestion"]=> array(2) {
[0]=> string(1) "1"
[1]=> string(1) "2"
}
["submitDetails"]=> string(14) "Submit Details" ["value"]=> array(4) {
["answerARow"]=> string(2) "on"
["answerCRow"]=> string(2) "on"
["answerBRow"]=> string(2) "on" ["answerERow"]=> string(2) "on"
}
}

Ниже приведены ошибки, которые я получаю, и строка кода, с которой связана каждая ошибка:

Предупреждение: неверный аргумент для foreach() в/.../в строке 252

foreach($value as $answer) {

Предупреждение: mysqli_stmt :: execute(): (23000/1062): Дублировать запись "MUL-0" для ключа "PRIMARY" в/.../в строке 242

Вышеприведенная ошибка показывает, что номер вопроса не вставлен, поскольку он продолжает отображать его как '0'

спросил(а) 2012-10-12T23:04:00+04:00 7 лет, 5 месяцев назад
1
Решение
82

Ваш текущий код генерирует это (обратите внимание на атрибут плохого имени):

<input type="button" onclick="btnclick(this, 1);" style="display:inline-block;" class="answerBtns answers answerBtnsOff" name="value[answerF]" value="F" id="answerHRow">

Обратите внимание, что атрибут name является value[answerF] вместо value[1][] как вы писали в своем вопросе.

Обновите свой javascript и измените $newBtn на:

    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');

ответил(а) 2012-10-12T23:50:00+04:00 7 лет, 5 месяцев назад
37

Таким образом, похоже, что главное, что вы пытаетесь сделать, - это обойти флажки неспособности к работе с кожей. Я сделал это раньше. То, как я это делал, это использовать привязанный к скрытому флажку диапазон.

Я использовал промежутки, потому что я не уверен, что кнопка в поле формы выведет значение при отправке формы. Я знаю, что пролет не будет. Это гарантирует, что будет отправлено только ваше значение флажка, а не значение "сокрытие".

В вашем jsFiddle в функции updateAnswer() вас есть этот код:

if (!bDisableAppend) {
// append those values to the form
var input = '<input type="checkbox" id="' + hid + '" name="value[' + id + ']" checked /><label for="' + hid + '">' + value + '</label>';
_oCurrAnswerContainer.append(input);
}

В этом коде вы устанавливаете атрибут name этого флажка как value[answerARow]. Вот где ваша проблема.

TBH, мне нелегко следовать вашему коду, поэтому решение, которое я придумал, вероятно, потребует некоторой настройки, чтобы добавить какой-то скрытый трюк, который я пропустил в вашем примере. Но вот что я придумал:

jsFiddle

JS/JQuery:

var options = ["A", "B", "C", "D", "E", "F", "G", "H"];

// this will bind the event handler to the document element, so that even when a new element is created,
// the event will be automatically bound to it.
$(document).on("click", "span.checkbox", function() {
$("#chk"+ $(this).attr("id")).click();
$(this).toggleClass("unselected selected");
});

$("#btnAddQuestion").click(function() {
var questionNum = $("#tblQuestions tbody tr").length+1;

var cell = $(document.createElement("td")).addClass("optAns").html("Answer:<br />");

// loop through the options and add them to the cell
for (var i in options)
{
$(cell).append(
// the front-end overlay for the checkbox
$(document.createElement("span"))
.addClass("checkbox unselected")
.attr("id", "Value"+ questionNum + options[i])
.html(options[i])
).append(
// the hidden checkbox that will post the actual value
$(document.createElement("input"))
.attr("type", "checkbox")
.addClass("hidden")
.attr("id", "chkValue"+ questionNum + options[i])
.attr("name", "value["+ questionNum +"][]")
.attr("value", options[i])
);
}

// create a new table row, append the "option and answer" cell
// and question number cell, and append it to the table body
$(document.createElement("tr"))
.append(cell)
.append($(document.createElement("td")).addClass("questionNum").html(questionNum))
.appendTo("#tblQuestions tbody");
});

HTML:

<div id="detailsBlock">
<button id="btnAddQuestion">Add Question</button>
</div>
<hr />
<div id="details">
<table id="tblQuestions">
<thead>
<tr>
<th>Option and Answer</th>
<th>Question No</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>

ответил(а) 2012-10-12T23:37:00+04:00 7 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема