我的网页有很多行,有两个输入。可能有 10 行,也可能有 100 行,这取决于按钮 addP 被点击了多少次。这些输入值应使用 idc_addDVC.php 插入到 IDC 表中。
我想对许多输入数据使用 while 循环。但不幸的是,这些数据不能用我的 idc_addDVC.php 插入到 IDC 表中。
提交后 ClOUDT 和 IDC 表什么都没有显示。这是我的 JS 代码:
<script>
var aDWI=1;
function addPf()
{
newrow = '<tr><td style="width:25%" colspan="2"><input style="width:98%" name="enName'+aDWI+'"></td><td style="width:85%" colspan="2"><input style="width:98%" name="enID'+aDWI+'"></td></tr>';
$(newrow).insertAfter($('#staTable tr:eq('+aDWI+')'));
aDWI = aDWI + 1;
$('#engID').attr("value",aDWI);
}
</script>
这是我的 html 代码:
<div>
<form action="idc_addDVC.php?act=add&table=IDC" method="POST">
<table>
<tr>
<input type="button" id="addP" onclick="addPf()" value="AP">
</tr>
<tr>
<input type="text" name="enName">
<input type="text" name="enID">
</tr>
<tr>
newrow is added here
</tr>
<tr>
<td>
<input type="submit" value="submitBtn">
<input type="hidden" id="engID" value="1" name="engRow">
</td>
</tr>
</table>
</form>
</div>
这是失败的 idc_addDVC.php 代码:
<?php
if($_GET["act"]=="add")
{
$conn=new PDO('mysql:host=localhost;port=3306;dbname=xxx' , 'root' , 'xxx');
$query="begin declare i int;
set i=1;
insert into ClOUDT (customer) values ('JOHN');
while i < ".$_POST['engRow']."
do
insert into IDC (name,id,cloudeid) values('".$_POST['enName'+i]."','".$_POST['enID'+i]."',LAST_INSERT_ID());
set i=i+1;
end while;
commit;";
$stmt=$conn->query($query);
echo "success";
......
}
else
{
echo "fail";
......
}
}
?>
成功的idc_addDVC.php代码如下:
<?php
if($_GET["act"]=="add")
{
$conn=new PDO('mysql:host=localhost;port=3306;dbname=xxx','root','xxx');
$query="begin ;
insert into ClOUDT (customer) values ('JOHN');
insert into IDC (name,id,cloudeid) values('".$_POST['enName']."','".$_POST['enID']."',LAST_INSERT_ID());
commit;";
$stmt=$conn->query($query);
echo "success";
......
}
else
{
echo "fail";
......
}
}
?>
我想 idc_addDVC.php 的 $query 中的 'enName'+i 是错误的。但是我不知道如何获取动态输入值。这很复杂,谁能帮助我?
最佳答案
HTML
删除 onclick
属性并使用 jQuery 附加 onclick
事件处理程序。
<input type="button" id="addP" value="AP">
JavaScript
在构建输入名称时使用数组符号 []
。这使得之后循环遍历 POSTed 字段变得更加容易。并且避免您必须使用 engRow
跟踪最后一行。
$('#addP').click(function () {
$('#staTable tr:last-child').before('
<tr><td colspan="2" style="width:25%"><input name="enName[]" style="width:98%"></td></tr>
');
});
PHP
我会在事务而不是存储过程中执行批量插入。
<?php
// turn on error reporting in case
error_reporting(E_ALL);
ini_set('display_errors', 1);
// wrong: == (comparaison), not = (assignment)
if ($_GET['act'] == 'add') {
try {
$conn=new PDO('mysql:host=localhost;port=3306;dbname=xxx' , 'root' , 'xxx');
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->beginTransaction();
// wrong: INSERT INTO, not INSET INTO
$sth = $conn->prepare("INSERT INTO cloudt(customer) VALUES('JOHN')");
$sth->execute();
$cloudeid = $conn->lastInsertId();
// $_POST['enName'] should be an array
foreach ($_POST['enName'] as $name) {
$sth = $conn->prepare("INSERT INTO idc(name, cloudeid) VALUES(?, ?)");
$sth->execute(array($name, $cloudeid));
}
$conn->commit();
echo "success";
} catch (PDOException $e) {
echo $e->getMessage();
$conn->rollBack();
echo "fail";
}
}
?>
有用的读物
关于javascript - 如何使用 PHP、javascript mysql 事务将输入的数组值插入到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45561766/