Обработка клонов div между веб-страницей, сервером и базой данных в соответствии с требованиями взаимодействия с пользователем

Я написал этот сценарий, чтобы пользователи могли клонировать div = "test hidden" столько раз, сколько потребуется. В каждом div есть некоторый пользовательский ввод, class = "user_input1", а также несколько флажков class = "user_input2". У этого сценария есть две уловки:

  1. Входные данные должны систематически вставляться в базу данных для каждого клонируемого и добавляемого div = "test hidden". Например, если есть три input1 с разными значениями, должны быть созданы три строки с каждым соответствующим значением. Эта загвоздка решена и работает неплохо. Но теперь вторая загвоздка:

  2. Флажки в 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] => 
)

Можете ли вы показать нам, что находится внутри $_POST, если у вас есть, например, 3 клона? (echo "<pre>"; print_r($_POST); die;)

toffler 26.06.2018 11:53

Я не уверен, где ввести это в свой код? Не могли бы вы указать мне правильное направление?

Mariska 26.06.2018 12:02

Сделать можно сразу после if (isset($_Post['insert_res'])){

toffler 26.06.2018 13:03

У меня похожая проблема, я буду благодарен за некоторые ответы на этот вопрос !!

user8944445 26.06.2018 13:58

@toffler, пожалуйста, посмотрите обновление!

Mariska 26.06.2018 14:03

В такой ситуации нельзя просто везде использовать name = "foo[]". Флажки создают только запись в наборе данных формы, если они отмечены - в противном случае они не учитываются. Таким образом, в таком случае вы потеряете корреляцию с другими полями ввода. Если вы укажете индекс заранее (name = "foo[0]", name = "foo[1]" и т. д.), Вы сможете избежать этой проблемы, но вам потребуется соответствующим образом изменить функцию клонирования на стороне клиента.

CBroe 26.06.2018 14:27

Позвольте мне попробовать это ... хороший момент!

Mariska 26.06.2018 14:29

Итак ... Думаю, я все еще не понимаю, что ты не хочешь делать как следует. Может, выложите картинки для наглядного понимания? Я только что придумал обходной путь, который сделает это для этого примера, и, возможно, это то, что вы ищете, однако - это не очень красиво.

toffler 26.06.2018 15:27

`$ 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

toffler 26.06.2018 15:27

вставьте этот код перед $encode = json_encode($_POST['check']); и замените $check на $_POST['check'] ... также используйте ваши $value1 и 2 вместо моего статического массива.

toffler 26.06.2018 15:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
10
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я опубликую здесь сводку своих комментариев из-за ограничений по количеству символов.

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

Я создал 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 перед добавлением его в массив?

Mariska 27.06.2018 09:03

Вам нужно кодировать и запрашивать $check2, а не $check

toffler 27.06.2018 09:14

Не могли бы вы рассказать мне в контексте моего php-скрипта, где это должно быть реализовано, я смущен этим и функцией for в моем собственном скрипте?

Mariska 27.06.2018 09:23

Ах, понятно ... вам нужно сгенерировать массив $check2 до цикла for. используйте foreach($_POST['check'] as $k=>$tmp). В вашем цикле вы делаете $check = mysqli_real_escape_string($conn, $check2[$i]);

toffler 27.06.2018 09:32

Статические массивы, мне нужно заменить их моими входными массивами?

Mariska 27.06.2018 10:01

вы заменяете их своими данными $_POST ... мой $val1 - это ваш $_POST['value1'] и т. д.

toffler 27.06.2018 10:36

Позвольте нам продолжить обсуждение в чате.

Mariska 27.06.2018 13:17

Другие вопросы по теме