使用Implode将HTML表单$ _POST数组插入MySQL

时间:2012-07-30 11:51:19

标签: php mysql html arrays implode

我有以下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中的第一个代码,我正在学习。我非常感谢能得到的任何帮助!

2 个答案:

答案 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_numdb_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()调用。