【问题标题】:Restrict Foreach Loop From Inserting Blank MySQL Rows限制 Foreach 循环插入空白 MySQL 行
【发布时间】:2013-10-15 19:19:45
【问题描述】:

我遇到了问题。我有一堆同名的输入。这会创建放置到数据库中的数组,并且一切正常,但是我在试图阻止输入的空白​​行在数据库表中创建空白条目时遇到了一个主要难题。

代码是这样的:

foreach($_POST['datetime'] as $dbrow=>$startdate) {
if(isset($_POST['def'])) {
$start = $startdate; 
$abc = $_POST['abc'][$dbrow];
$def = $_POST['def'][$dbrow];
$ghi = $_POST['ghi'][$dbrow];


$db_insert = "INSERT INTO tablename (start, abc, def, ghi) VALUES('$start', '$abc', '$def', '$ghi')";

这很好,但我无法让 if 语句工作。使用 POST 获取用户信息的表单有 5 行输入,每行有四列(start、abc、def、ghi)。如果我在表单中输入数据并提交,那么所有数据都会进入数据库(是的 - 成功),如果我只输入第 1-4 行的数据,那么数据库仍然会输入 5 行数据。我做错了什么?

----------编辑---------- 好的,所以更深入地观察似乎正在发生的事情是代码一直想要提交所有动态生成的输入行,无论它们是否包含内容。所以我设计了以下代码:

$db_tur = count(array_filter($start_date));
for($db_total_used_rows=0;$db_total_used_rows<=$db_tur;$db_total_used_rows++){


$db_start_date = $_POST['datetime'][$db_total_used_rows]; 
$db_abc = $_POST['abc'][$db_total_used_rows];
$db_def = $_POST['def'][$db_total_used_rows];
$db_ghi = $_POST['ghi'][$db_total_used_rows];


}

$db_insert = .....;

理论上,它的作用是 $db_tur 对 start_date 变量下使用的所有输入进行计数。然后我将它分解为一个计数数组,该数组应该能够用作 $db_total_used_rows。然而,这似乎并没有限制插入数据库的输入行总数。所以我想它回到了绘图板上,除非其他人对如何实现这一点有更好的想法。我现在已经准备好放弃了。

【问题讨论】:

  • 为什么要检查if(isset($_POST['def'])) 是否设置?为什么不只是if(isset($startdate))
  • 为什么不检查传入的值,如果它们为空,请跳过为它们运行查询。
  • 这段代码存在一些SQL注入漏洞...
  • 感谢大家的快速回复。我会尝试一些答案。 @Charles,是的,我只是重新输入了一堆代码,只是为了大致了解正在发生的事情,它不是最终的安全代码。

标签: php mysql arrays insert restrict


【解决方案1】:

使用这个循环结构:

foreach ($_POST['datetime'] as $dbrow => $start) {
    $abc = $_POST['abc'][$dbrow];
    $def = $_POST['def'][$dbrow];
    $ghi = $_POST['ghi'][$dbrow];
    if (!empty($abc) && !empty($def) && !empty($ghi) && !empty($start)) {
        $db_insert = ...;
        ...
    }
}

如果用户可以将某些字段留空,您可以将 &amp;&amp; 更改为 || - 它只会跳过所有字段为空的行。

【讨论】:

  • 澄清一下,您是否建议删除循环中我为每个 POSTED 变量添加行数的部分? IE。删除 $abc = $_POST['abc'][$dbrow];
  • 太棒了,迫不及待想试试!
  • 好消息是它部分工作。不再有任何空白条目。然而,它仍然产生了至少五条记录。我有一个偷偷摸摸的怀疑,这是因为输入的行是通过循环生成的,在页面加载时生成的行数最少 (5)。
  • 如果它创建了5条记录,但没有任何空白记录,如果用户只填写其中一条记录,其他记录是什么?
  • 使用您提供的代码复制所有五条记录上的数据。如果我填写两行输入,则第一行将正确输入,但第二行将在其他 4 条记录中复制。
【解决方案2】:

除了复选框,所有表单字段都会 POST,即使是空的。因此,如果def 是一个文本框,它将始终出现在您的 POST 中。更好的测试是

if(!empty($_POST['def'])) {

【讨论】:

  • 只检查所有行是否为空。它不会过滤掉单独的空白行。
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 2015-05-10
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2014-01-19
相关资源
最近更新 更多