【问题标题】:PHP foreach loop with multiple index variables具有多个索引变量的 PHP foreach 循环
【发布时间】:2013-05-27 04:19:41
【问题描述】:

谁能看出下面的代码有什么问题?

我正在尝试对表单中的 2 个数组执行 foreach 循环。

表格代码:

<td>
<input type="checkbox" name="PR[]" value="DP01">Version 1 Daypack - $55.00<br/>
<input type="checkbox" name="PR[]" value="DP02">Version 2 Daypack - $30.00<br/>
</td>
<td>
<input type="text" name="QTY[]" size = "2"/><br/>
<input type="text" name="QTY[]" size="2"/><br/>
</td>

PHP 代码:

if(!empty($_POST['PR']))
{
    foreach (array_combine($_POST['PR'], $_POST['QTY']) as $PRS => $QTYS)
    {
            $sql="INSERT INTO ORDER_TBL (TRANSACTION_ID, CUSTOMER_ID, PRODUCT_ID, QUANTITY)
            VALUES ('','$_SESSION[user]','$PRS,'$QTYS)";

        if (!mysqli_query($con,$sql))
        {
            die('Error: ' . mysqli_error($con));
            exit;
        }
    }
}

【问题讨论】:

  • 安全建议:转义所有用户输入。阅读有关 sql 注入的信息。
  • $TGS 是否在别处定义?这可能会导致 Product_Id 的 nul 值。这出了什么问题 - 输出与预期有何不同?错误代码? - SQL 也是错误的 - '$TGS,'$QTYS 应该是 '$TGS','$QTYS'
  • 您没有执行查询。如果您仍然不使用密钥,那么使用 array_combine 有什么意义?
  • @ZsoltSzilagy 这是一个很好的图像来表示:xkcd.com/327
  • @RobertSeddon-Smith Typo,我编辑了上面的代码。

标签: php mysql loops foreach


【解决方案1】:

这种方式一点都不好。文本字段将被发布,无论它们是空的还是有内容,而复选框仅在选中时发布。这会导致数组的长度不同,array_combine 会失败。

执行 print_r($_POST),您会看到发布的输入内容。

这还没有考虑到这会带来的安全噩梦。

【讨论】:

  • 如果我们不担心安全问题或错误处理,输入正确时它仍然运行吗?
  • @cs91 问题是如果其中一个复选框没有被选中,它就不会被发送,然后你的array_combine就会失败。
  • @cs91 您需要选中两个框以使 array_combine 不会失败,但如果选中两个框,则它应该通过并创建 sql。测试运行生成的查询,看看它与您的数据库合作是否正确
猜你喜欢
  • 2011-05-08
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 2023-04-06
  • 2014-05-27
相关资源
最近更新 更多