1

我有以下 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>

我有一个包含“db_num”和“db_amnt”字段的 MySQL 表,我想将数组中的所有输入数据插入到表中。我环顾四周,“内爆”似乎是最好的方法,但经过大量研究,我仍然无法让它发挥作用。整个 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,结果它只显示了三个术语;“数组”、“数组”和“提交”。进一步的检查表明,我可以从提交表单中获取要显示的值的唯一方法是,如果我通过 $_POST[db_num] 和 $_POST[db_amnt] 而不仅仅是 $_POST 执行 foreach 循环。我不确定它为什么会这样做以及如何解决它。这是我在 PHP 中的第一个代码,我正在学习。我真的很感激我能得到的任何帮助!

4

2 回答 2

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));
于 2012-07-30T12:00:40.963 回答
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']
];

换句话说,通过holding$_POST['db_num']会有一路的holding 。同样,将持有,将持有,等等。即使用户没有填写其中一个字段,仍然会提交空字段,并且值将是一个零宽度的字符串(空字符串)。$_POST['db_num'][0]1$_POST['db_num'][9]10$_POST['db_amnt'][0]100$_POST['db_amnt'][1]125

通过构建表单数据以提供如此干净且即时可用/可遍历的数据集,您为自己做了一项很棒的服务。

无需重组传入数据(尽管 voodoo 建议使用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值有小数位(它们是浮点数),那么您可以ibind_param()调用中的d. 有些人更喜欢将所有值声明为s(string) 的最简单方法,但我喜欢在处理可预测的用户输入时控制它。

这是迭代技术的演示

如果您要进行其他验证检查,只需将它们添加到我的if表达式中即可。

如果你想享受个人成功检查,你可以在下面写一些东西execute()来引用受影响的行。

重新使用准备好的语句是使用 mysqli 完成此过程的两种方法之一。另一个涉及构建一个包含所有行的包罗万象的 INSERT 查询,但这涉及更多的准备工作。这两种mysqli技术注入安全、稳定、高效。

最后,一些开发人员会说,在尝试访问子数组之前,您应该检查每个索引是否确实存在于子数组中;其他开发人员坚持认为,没有必要处理故意入侵您的 html 的用户生成的通知。我将把它留给各个研究人员来确定他们是否希望isset()在迭代之前和迭代期间进行调用。

于 2020-01-02T05:32:50.783 回答