Я написал этот сценарий, чтобы пользователи могли клонировать div = "test hidden" столько раз, сколько потребуется. В каждом div есть некоторый пользовательский ввод, class = "user_input1", а также несколько флажков class = "user_input2". У этого сценария есть две уловки:
Входные данные должны систематически вставляться в базу данных для каждого клонируемого и добавляемого div = "test hidden". Например, если есть три input1 с разными значениями, должны быть созданы три строки с каждым соответствующим значением. Эта загвоздка решена и работает неплохо. Но теперь вторая загвоздка:
Флажки в class = "user_input2" добавляются на страницу в зависимости от содержимого базы данных 1. Это сделано для того, чтобы пользователи могли добавлять имена тестов, которые будут доступны для выбора на веб-странице, без необходимости фактически изменять код HTML и добавить столбцы в базу данных MySQL. Если флажок установлен, идентификатор соответствующего теста будет сохранен в базе данных вместе с вводом class = "user_input1". Позже эти идентификаторы можно будет вызывать снова и ссылаться на соответствующие им имена тестов. Эти идентификаторы сохраняются как часть текста JSON для сохранения выбранных тестов в виде массива в одной записи той же строки в базе данных, и это следует делать для каждой строки.
Вот моя проблема: из-за клонирования div и сценария сервера, учитывающего несколько клонированных записей, выбранные флажком идентификаторы неправильно вставлены в базу данных. Если вы создали три клона, идентификаторы флажков всех трех клонов вставляются в каждую запись базы данных. Я думаю, что это связано с серверным скриптом и требует некоторой вложенной функции, но я новичок в php и не уверен, что делаю неправильно.
Не стесняйтесь использовать приведенный ниже код, чтобы попробовать его на своих машинах.
SQL для создания базы данных 1 и некоторые записи:
CREATE TABLE `envirocare`.`database1` ( `id` INT NULL AUTO_INCREMENT , `checkb` VARCHAR(255) NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;
INSERT INTO `database1` (`id`, `checkb`) VALUES (NULL, 'test1'), (NULL, 'test2')
SQL для создания базы данных 2:
CREATE TABLE `envirocare`.`database2` ( `id` INT NULL AUTO_INCREMENT , `input1` VARCHAR(255) NOT NULL , `input2` VARCHAR(255) NOT NULL , `checkbox` VARCHAR(255) NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;
Скрипт HTML:
<style>
.hidden {
display: none;
}
</style>
<body>
<button id = "add">Add</button>
<div class = "test hidden">
<div class = "input1">
<label>Input1</label>
<input class = "input1" type = "text" name = "value1[]" value = "1" required>
<label>Input2</label>
<input type = "text" name = "value2[]" required>
<div class = "input2">
<table>
<thead>
<tr>
<th>Pick Option</th>
</tr>
</thead>
<tbody>
<?php
if ($resultCheck01 > 0) {
while ($row = mysqli_fetch_assoc($result01)) { ?>
<tr>
<td><input type = "checkbox" name = "check[]" value = "<?php echo $row['id']; ?>"><?php echo $row['checkb']; ?></td>
</tr>
<?php } } ?>
</tbody>
</table>
</div>
</div>
</div>
<form action = "server/server.php" method = "POST">
<div class = "paste">
</div>
<button type = "submit" name = "insert_res">Submit</button>
</form>
JavaScript:
$(document).ready(function() {
var variable = 0
$("#add").click(function() {
var element = $(".test.hidden").clone(true);
element.removeClass("hidden").appendTo(".paste:last");
variable++;
$(".input1:last").val(variable);
});
});
И, наконец, на стороне сервера:
$sql01 = "SELECT * FROM database1";
$result01 = mysqli_query($conn, $sql01);
$resultCheck01 = mysqli_num_rows($result01);
if (isset($_POST['insert_res'])) {
$n = count($_POST['value1']);
for($i = 0; $i<$n; ++$i) {
$value1 = mysqli_real_escape_string($conn, $_POST['value1'][$i]);
$value2 = mysqli_real_escape_string($conn, $_POST['value2'][$i]);
$encode = json_encode($_POST['check']);
$check = mysqli_real_escape_string($conn, $encode);
$query = "INSERT INTO database2 (input1, input2, checkbox) VALUES ('$value1', '$value2', '$check')";
mysqli_query($conn, $query);
}
header("Location: ../test.php?success");
}
При использовании echo "<pre>"; print_r($_POST); die; отображается следующее:
Array
(
[value1] => Array
(
[0] => 1
[1] => 2
)
[value2] => Array
(
[0] => Hello
[1] => World
)
[check] => Array
(
[0] => 1
[1] => 3
[2] => 1
[3] => 2
)
[insert_res] =>
)
Итак, контрольная часть должна выглядеть так:
[check] => Array
(
[0] => 1,3
[1] => 1,2
)
[insert_res] =>
)
Я не уверен, где ввести это в свой код? Не могли бы вы указать мне правильное направление?
Сделать можно сразу после if (isset($_Post['insert_res'])){
У меня похожая проблема, я буду благодарен за некоторые ответы на этот вопрос !!
@toffler, пожалуйста, посмотрите обновление!
В такой ситуации нельзя просто везде использовать name = "foo[]". Флажки создают только запись в наборе данных формы, если они отмечены - в противном случае они не учитываются. Таким образом, в таком случае вы потеряете корреляцию с другими полями ввода. Если вы укажете индекс заранее (name = "foo[0]", name = "foo[1]" и т. д.), Вы сможете избежать этой проблемы, но вам потребуется соответствующим образом изменить функцию клонирования на стороне клиента.
Позвольте мне попробовать это ... хороший момент!
Итак ... Думаю, я все еще не понимаю, что ты не хочешь делать как следует. Может, выложите картинки для наглядного понимания? Я только что придумал обходной путь, который сделает это для этого примера, и, возможно, это то, что вы ищете, однако - это не очень красиво.
`$ val1 = массив (1,2); $ val2 = array («Привет», «Мир»); $ check = массив (1,3,1,2); $ check2 = массив (); $ x = -1; foreach ($ check as $ k => $ tmp) {if ($ k% count ($ val1) == 0) {$ x ++; } если (! isset ($ check2 [$ x])) $ check2 [$ x] = ""; $ check2 [$ x]. = $ tmp. ","; } foreach ($ check2 as $ k => $ tmp) {$ check2 [$ k] = substr ($ tmp, 0, -1); } `после этого вы можете json_encode ur check2
вставьте этот код перед $encode = json_encode($_POST['check']); и замените $check на $_POST['check'] ... также используйте ваши $value1 и 2 вместо моего статического массива.






Я опубликую здесь сводку своих комментариев из-за ограничений по количеству символов.
Я придумал обходной путь для вашей проблемы, однако он не очень красивый, и я не могу гарантировать, что он будет работать во всех случаях, потому что я до сих пор не понимаю, что вы не хотите делать, но я надеюсь, что это все равно поможет вам .
Я создал 3 статических массива для имитации ввода и флажков:
$val1 = array(1,2);
$val2 = array("Hello","World");
$check = array(1,3,1,2);
$check2 = array();
После этого я генерирую новый выходной массив $check2 и форматирую его по вашему запросу:
$x = -1;
foreach($check as $k=>$tmp)
{
if ($k % count($val1) == 0)
{
$x++;
}
if (!isset($check2[$x])) $check2[$x] = "";
$check2[$x] .= $tmp.",";
}
foreach($check2 as $k=>$tmp)
{
$check2[$k] = substr($tmp,0,-1);
}
Вывод $check2:
array(2) {
[0]=>
string(3) "1,3"
[1]=>
string(3) "1,2"
}
Вы можете json_encode и потом сделать свой запрос.
Я очень надеюсь, что это поможет вам, пожалуйста, дайте мне знать об этом
Извините, но мне не повезло. Возможно, нет возможности использовать json_encode перед добавлением его в массив?
Вам нужно кодировать и запрашивать $check2, а не $check
Не могли бы вы рассказать мне в контексте моего php-скрипта, где это должно быть реализовано, я смущен этим и функцией for в моем собственном скрипте?
Ах, понятно ... вам нужно сгенерировать массив $check2 до цикла for. используйте foreach($_POST['check'] as $k=>$tmp). В вашем цикле вы делаете $check = mysqli_real_escape_string($conn, $check2[$i]);
Статические массивы, мне нужно заменить их моими входными массивами?
вы заменяете их своими данными $_POST ... мой $val1 - это ваш $_POST['value1'] и т. д.
Позвольте нам продолжить обсуждение в чате.
Можете ли вы показать нам, что находится внутри
$_POST, если у вас есть, например, 3 клона? (echo "<pre>"; print_r($_POST); die;)