我有以下html提交表单。此表单是PHP_SELF,并将输入数据存储为$ _POST中的数组。
<html>
<body>
<form method="post" action="<?php echo htmlentities($PHP_SELF); ?>">
<fieldset>
<legend>Direct Bill Information:</legend>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" /> </br>
DB #: <input type="int" name="db_num[]" /> DB Amount: <input type="int" name="db_amnt[]" />
</fieldset>
<input type="submit" value="submit" name="submit" />
</form>
</body>
</html>
我有一个MySQL表,其中包含“db_num”和“db_amnt”字段,我想将数组中的所有输入数据插入到表中。我环顾四周,“内爆”似乎是最好的方式,但经过大量的研究,我仍然无法让它发挥作用。然而,整个PHP执行并且没有错误地完成,而不是显示两列的所有10行,它只显示两列的2行,其中值= 0表示所有条目。这是我正在使用的代码:
$sql2 = array();
foreach($_POST as key=>$value)
{
if(key != 'submit')
{
if($value != '')
{
$sql2[] = '("'.mysql_real_escape_string($value['db_num']).'", "'.$value['db_amnt'].'")';
}
}
}
mysql_query('INSERT INTO ' .$tablename_db. '(db_num, db_amnt) VALUES '.implode(',', $sql2));
我做了一些调试并回显了foreach循环中的$ value,结果发现它只显示了三个术语; 'Array','Array'和'submit'。进一步的检查表明,我可以从提交表单中显示值的唯一方法是,如果我通过$ _POST [db_num]和$ _POST [db_amnt]而不是$ _POST执行foreach循环。我不确定为什么要这样做以及如何解决它。这是我在PHP中的第一个代码,我正在学习。我非常感谢能得到的任何帮助!
答案 0 :(得分:1)
试试这个
$db_num = $_POST['db_num'];
$db_amnt = $_POST['db_amnt'];
$items = array_combine($db_num,$db_amnt);
$pairs = array();
foreach($items as $key=>$value){
$pairs[] = '('.intval($key).','.intval($value).')';
}
mysql_query('INSERT INTO ' .$tablename_db. '(db_num, db_amnt) VALUES '.implode(',',$pairs));
答案 1 :(得分:0)
提交后,您的html表单将生成以下$_POST
数组(我将制作一些示例值)。
$_POST = [
'db_num' => ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'],
'db_amnt' => ['100', '125', '150', '175', '200', '225', '250', '275', '300', '325']
];
换句话说,$_POST['db_num']
将一直$_POST['db_num'][0]
保持1
,直到$_POST['db_num'][9]
保持10
。同样,$_POST['db_amnt'][0]
将保留100
,$_POST['db_amnt'][1]
将保留125
,依此类推。即使用户未能填写其中一个字段,该空白字段仍将被提交,并且该值将为零宽度的字符串(空字符串)。
通过结构化表单数据以提供如此干净且立即可用/可遍历的数据集,您为自己做了一项很棒的服务。
无需重组传入的数据(尽管伏都教建议使用array_combine()
)。如果根本不需要任何额外的工作,则可能要验证表单每一行中的“成对”值。例如,我假设您仅会在给定行的db_num
和db_amnt
都不为空的情况下存储数据-因此,我将把该检查内容放入建议的代码段中。>
$conn = new mysqli($server, $user, $password, $database);
$stmt = $conn->prepare("INSERT INTO {$tablename_db} (db_num, db_amnt) VALUES (?,?)");
$stmt->bind_param("ii", $num, $amnt); // name the two variables which will pass integer values where the ?'s are located
foreach ($_POST['db_num'] as $index => $num) {
$amnt = $_POST['db_amnt'][$index];
if (strlen($num) && strlen($amnt)) {
$stmt->execute(); // only INSERT qualifying rows
}
}
请注意,如果您的db_amnt
值具有小数位(它们是浮点数),则可以将i
调用中的bind_param()
更改为d
。有些人更喜欢将所有值声明为s
(字符串)的最简单方法,但是我喜欢在处理可预测的用户输入时加以限制。
这里是a demonstration of the iterating technique。
如果要进行其他验证检查,只需将其添加到我的if
表达式中即可。
如果您希望进行个人成功检查,则可以在execute()
下立即写一些内容来引用受影响的行。
重新使用准备好的语句是应使用mysqli完成该过程的两种方法之一。另一种方法是构建一个包含所有行的,包含所有内容的INSERT查询,但这需要更多的准备工作。这两种mysqli技术是注入安全,稳定和高效的。
最后,一些开发人员会说,在尝试访问子数组之前,应该检查每个索引 actually 是否确实存在。其他开发人员则坚称,没有必要处理故意黑客入侵您的html的用户生成的通知。我将其留给各个研究人员确定他们是否希望在迭代之前和同时进行isset()
调用。