【问题标题】:Handling of div clones between web page, server and database as required by user interaction根据用户交互的需要处理网页、服务器和数据库之间的 div 克隆
【发布时间】:2018-06-26 21:41:51
【问题描述】:

我已经为用户编写了这个脚本,可以根据需要多次克隆div="test hidden"。在每个div 中都有一些用户输入class="user_input1",以及一些复选框class="user_input2"。此脚本有两个问题:

  1. 对于克隆和附加的每个div="test hidden",输入应系统地插入到数据库中。例如,如果存在三个具有不同值的 input1,则应使用每个相应的值创建三行。这个问题已经解决并且工作得很好。但现在第二个问题:

  2. class="user_input2" 中的复选框是根据数据库 1 的内容添加到页面中的。这样用户可以在网页中添加可供选择的测试名称,而无需必须实际修改 html 代码并向 MySQL 数据库添加列。如果选中复选框,则相应测试的 id 将与 class="user_input1" 的输入一起保存到数据库中。稍后,可以再次调用这些 id 并引用它们相应的测试名称。这些 id 保存为 JSON 文本的一部分,以将选定的测试保存为数据库中同一行的单个条目中的数组,并且应该对每一行都这样做。

这是我的问题:由于 div 的克隆和服务器脚本考虑了多个克隆条目,复选框选择的 id 没有正确插入数据库。如果您进行了三个克隆,则所有三个克隆的复选框 ID 都将插入到每个数据库条目中。我认为它与服务器脚本有关,需要一些嵌套函数,但我是 php 新手,不知道我做错了什么。

请随意使用下面的代码在您的机器上试用。

用于创建数据库 1 和一些条目的 SQL:

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

用于创建数据库 2 的 SQL:

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 "&lt;pre&gt;"; 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 "&lt;pre&gt;"; print_r($_POST); die;)
  • 我不确定在我的代码中的何处输入?请您指出正确的方向吗?
  • 你可以在if(isset($_Post['insert_res'])){之后马上做
  • 我有一个类似的问题,这个问题的一些答案将不胜感激!!
  • @toffler 请查看更新!

标签: php jquery html mysql json


【解决方案1】:

由于字数限制,我会把我的cmets的总结贴在这里。

我为您的问题想出了一个解决方法,但是它不是很漂亮,我不能保证它适用于所有情况,因为我仍然没有正确理解您不想做什么 - 但我希望它会仍然可以帮助你。

我生成了 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 函数感到困惑?
  • 啊,我明白了……您必须在 for 循环之前生成 $check2 数组。使用foreach($_POST['check'] as $k=&gt;$tmp)。在你的循环中你做$check = mysqli_real_escape_string($conn, $check2[$i]);
  • 静态数组,我必须用我的输入数组替换它们吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多