从包含可重复和不可重复字段的动态表单将一行或多行插入数据库

问题描述 投票:0回答:2

这是我关于同一问题的第二篇文章,在我的第一篇文章中,我使用

mysql
而不是
mysqli
,所以我根据建议做了一些更新。 我有一个表单,其中包含由用户通过 javascript 控制的可变字段集(1 到 20 集)。

没有动态内容一切都运行良好。当我将 html 表单从

city
更改为
city[]
后,它显然停止将数据传递到我的数据库。

我尝试了各种方法来完成这项工作,但没有成功。有什么想法吗?

表单操作:

var i=0; //Global Variable i
//function for increment
function increment(){
    i +=1;
}

$(document).ready(function(e){
    /// Variables
    var html ='<p /><div>';
        html+='<label for="city">City:</label>';
        html+=' <input type="text" name="childcity[]" id="city">';
        html+=' <label for="date">Date:</label>';
        html+=' <input type="text" name="childdate[]" id="date">';
        html+='<a href="#" id="removecity">Remove City</a>';
        html+='</div>';

    var maxRows = 20;
    // var x = 1;

    // Rows
    $("#addcity").click(function(e){
        if(i <= maxRows){
            $("#container").append(html);
            i++;
        }
    });

    // Remove Rows
    $("#container").on('click','#removecity', function(e){
        $(this).parent('div').remove();
        i--;
    });
});

表单数据检索与查询:

<?php
/* Attempt MySQL server connection. Assuming you are running MySQL
server with default setting (user 'root' with no password) */

$mysqli = new mysqli("localhost", "root", "", "pb1646a_jos1");

// Check connection

// Escape user inputs for security

$city = $_POST['city'];
$date = $_POST['date'];

foreach($city AS $key => $value){
    // attempt insert query execution
    $sql = "INSERT INTO employe_table(name,age)
    VALUES (
        '".$mysqli->real_escape_string($value)."',
        '".$mysqli->real_escape_string($date['$key'])."'
    )";
    $insert = $mysqli->query($query);
}
$mysqli->close();    // Close connection
header("location: http://www.orastravelagency.com/modules/mod_pari/test/index.html")
?>

形式:

<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
<script src="java.js" type="text/javascript"></script>
<meta charset="UTF-8">
<title>Add Record Form</title>
</head>
<body>
<form action="insert2.php" method="post">
    <div>
    <p>
        <label for="name">Trip Name:</label>
        <input type="text" name="name" id="name">
    </p>
    </div>
    <div id="container">
    <p>
        <label for="">City:</label>
        <input type="text" name="city" id="city[]">
        <label for="date">Date:</label>
        <input type="text" name="date" id="date[]">
        <a href="#" id="addcity">Add City</a>
    </p>
    </div>
    <p />
    <input type="submit" value="submit">
</form>
</body>
</html>
php jquery html forms mysqli
2个回答
1
投票

$date['$key']
应该是
$date[$key]
。引号阻止对
$key
变量求值,它使用
$key
作为文字索引。

但是您应该使用准备好的语句而不是连接变量。

$city = $_POST['city'];
$date = $_POST['date'];

$stmt = $mysqli->prepare("INSERT INTO employe_table(name, age) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $age);
foreach ($city as $key => $name) {
    $age = $date[$key];
    $stmt->execute();
}

0
投票

您的流程中有一些错误。

您想要生成多个输入字段,并将它们作为数组存储在

$_POST
中。

更改此:

但是,您写的属性不正确,$_POST 无法读取

id
's:

<input type="text" name="city" id="city[]">
<input type="text" name="date" id="date[]">

对此:

<input type="text" name="city[]">
<input type="text" name="date[]">

我已经删除了您的

id
属性,因为您的页面中不应该/不能有重复的 id。如果您需要为 css 标识这些字段,请使用它们的 name 属性或添加
class
属性来标识它们。

当您在 JavaScript 中动态添加后续内容时,您应该再次使用

name=city[]
name=date[]
;并删除 id。

这将导致您的

$_POST
数组成为按预期正确填充的多维数组。

$name = $_POST['name'];  // this is a string
$cities = $_POST['city'];  // this is an array
$dates = $_POST['date'];  // this is an array

如果您不打算将其包含在查询中,我真的不明白为什么

city
会出现在您的表单中 - 所以我将其包含在我的解决方案中。而且您的表列的命名并不直观,因此请考虑将它们更改为更好地表示要存储的值的名称。

$stmt = $mysqli->prepare("INSERT INTO employe_table (`name`,`city`,`date`) VALUES (?,?,?)");
$stmt->bind_param("sss", $name, $city, $date);
foreach ($cities as $index => $city) {
    $date = $dates[$index];
    $stmt->execute();
}

编程时,始终努力制作DAMP和DRY的作品——它将为你和其他看到它的人提供指数级的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.