这是我在同一问题上的第二篇文章,在我使用mysql
而不是mysqli
的第一篇文章中,所以我根据建议做了一些更新。
我有一个带有可变字段集(1到20集)的表单,由用户通过javascript控制。
没有动态内容,一切运作良好。将我的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>
答案 0 :(得分: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();
}
答案 1 :(得分:1)
你的过程中有一些问题。
您想要生成多个输入字段,并将它们存储为$_POST
中的数组。
改变这个:
但是,你写的属性不正确,$ _POST没有读id
&#39>:
<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标识这些字段,请使用其名称属性或添加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();
}
- 所以我将其包含在我的解决方案中。并且您的表列没有直观命名,因此请考虑将它们更改为更好地表示要存储的值的内容。
os.EOL
编程时,始终努力制作DAMP and DRY作品 - 它会以指数方式帮助您和其他任何人看到它。