【问题标题】:loop through $_GET results遍历 $_GET 结果
【发布时间】:2010-11-16 08:57:32
【问题描述】:

如果我有这样的事情:

?FormSub=Submit&qty=1&partno=ipod&notes=apple&unitprice=102.99&rowid=1&qty=2&partno=Ear+Buds&notes=Headphones&unitprice=45.99&rowid=2

是否可以通过 GET 循环将结果返回到 HTML 表中并添加到 SQL 表中?

或者我是否需要将 rowid 添加到每个 $_GET 的末尾(即 qty1=1&partno1=ipod ...)?

感谢收看。

【问题讨论】:

  • 在对用户输入进行任何操作之前对其进行清理
  • 没有人会忘记小鲍比桌...
  • @Skilldrick:必须链接到 Little Bobby Tables 漫画:xkcd.com/327
  • 如果您要链接到 Bobby Tables,您不妨链接到 bobby-tables.com,其中包含有关如何不注入 SQL 以及卡通的有用信息。

标签: php sql html


【解决方案1】:

不过,您可以循环访问$_GET。它只是一个数组:

foreach ($_GET as $key => $value) { }

当您进行 SQL 查询时,请记住清理您的所有输入。同样用于在页面上显示值。使用 htmlentities 清理 HTML 显示。假设您的数据库是 MySQL,请为 SQL 使用 mysql_real_escape_string

【讨论】:

  • Some say 认为htmlspecialchars 优于htmlentities,读者的选择。
【解决方案2】:

小心!有人可以轻松更改并提交:

?FormSub=Submit&qty=1&partno=ipod&notes=apple&unitprice=0.99&rowid=1&qty=2&partno=Ear+Buds&notes=Headphones&unitprice=0.05&rowid=2

注意:“单价”原来是102.99和45.99,现在改成0.99和0.05了,我猜他们现在正以优惠的价格出售!

【讨论】:

  • 好电话!亚马逊曾经在他们的代码中有一个漏洞,这个漏洞并不比这更先进。确实有些人以高价买了一些东西。
  • 是的,感谢您的关注 - 这是一个内部报价系统...不适用于 Joe Public .....
  • @Bifter,即使这是“内部”使用,它仍然不是一个很好的方法
  • 验证一切。恶意并不是这类事情出错的唯一原因。错误的击键、人们在 GET 字符串中使用此数据为您的页面添加书签以及许多其他原因可能会导致此操作无法按您的预期工作。用户,尤其是不精通技术的用户,有一种奇怪的方式让事情发生,你从未想过会发生。
  • 一些用户会通过编辑 URL 来学习导航您的应用程序(他们会发现它比使用菜单/屏幕更快),但是如果您不进行防御性编码,这可能会导致问题
【解决方案3】:

FAQ How do I create arrays in a HTML <form>?

所以在你的情况下,请求:

?FormSub=Submit&qty[]=1&partno[]=ipod&notes[]=apple&unitprice[]=102.99&rowid[]=1&qty[]=2&partno[]=Ear+Buds&notes[]=Headphones&unitprice[]=45.99&rowid[]=2

将创建一个表单数组:

array(
    'FormSub' => 'Submit',
    'qty' => array(
        0 => '1',
        1 => '2'
    ),
    'partno' => array(
        0 => 'ipod',
        1 => 'Ear Buds'
    ),
    'notes' => array(
        0 => 'apple',
        1 => 'Headphones'
    ),
    'unitprice' => array(
        0 => '102.99',
        1 => '45.99'
    ),
    'rowid' => array(
        0 => '1',
        1 => '2'
    )
)

但我希望您不要在未经验证的情况下接受这些值,甚至不要将其用于实际订单。

另外GET is intended to be used for data retrieval only:

特别是,已经建立了约定,即 GET 和 HEAD 方法不应具有采取除检索之外的操作的意义。

对于具有副作用的请求(更改服务器上的数据),您应该使用 POST。

【讨论】:

    【解决方案4】:

    $_GET 是一个数组 .. 所以你可以使用 foreach 对其进行迭代

    foreach($_GET as $query_string_variable => $value) {
       echo "$query_string_variable  = $value <Br />";
    }
    

    您也可以使用extract($_GET) 将它们全部设为变量.. 但我不建议这样做。

    如果你想把它保存到数据库,你应该考虑mysql_real_escape_string($value)

    要打印 HTML 表格 .. 你想要这样的东西吗?

    $count = count($_GET);
    if($count > 0) {
      echo "<table>";
        foreach($_GET as $query_string_variable => $value) {
           echo "<tr><td>$query_string_variable</td><td>$value</td></tr>"
        }
      echo "</table>";
    }
    

    希望这会有所帮助。

    【讨论】:

    • +1,但$query_string_variable 有点长且笨拙。像$key$param 这样的东西更容易阅读。
    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    相关资源
    最近更新 更多