【问题标题】:Rules for naming POST/GET variables?命名 POST/GET 变量的规则?
【发布时间】:2011-05-10 00:35:33
【问题描述】:

在表单中命名 POST 变量或在查询字符串中命名 GET 变量时,是否需要遵循任何规则?

谢谢-

【问题讨论】:

    标签: html http post get


    【解决方案1】:

    要从字面上回答这个问题,我知道在 php.ini 中命名 $_POST$_GET 数组键确实没有“规则”。它是一个和其他数组一样的数组。看看this working example on Codepad

    <?php
    $_POST['♠♣♥♦'] = 'value1';
    $_POST['\'\'\'\''] = 'value2';
    $_POST['<?php echo "Hello World"; ?>'] = 'value3';
    $_POST['     '] = 'value4';
    $_POST[''] = 'value5';
    $_POST['@#$%^&*()'] = 'value6';
    
    print_r($_POST);
    

    对于表单输入名称,它们必须是合法的 HTML“名称”属性(见下文)。但是,在实践中,许多不寻常的字符实际上会起作用。请记住,这并不意味着这是一个好主意。不同的服务器(可能还有不同的浏览器)对某些字符(例如空格)的行为会有所不同。

    正如Tadeck 所指出的,重复键将在读取时被最后一个键覆盖,但使用brackets[] 将通过将变量转换为数组来在客户端解决此问题。

    就命名约定和最佳做法而言,空间不大。建议您坚持使用 A-Z a-z 0-9、破折号和下划线。尽管Ajay 为了方便起见建议使用数据库列名称作为表单输入名称,但许多人会告诉您,将有关数据库的信息公开给公众是不好的做法。我认为invertedlambda 可能有最接近这个问题的答案,而Tadeck 有最接近最佳实践的答案。

    关于 HTML“名称”属性:http://www.w3.org/TR/html4/types.html#h-6.2

    IDNAME 标记必须以字母 ([A-Za-z]) 开头,后跟任意数量的字母、数字 ([0- 9])、连字符(“-”)、下划线(“_”)、冒号(“:”)和句点(“.”)。

    也许有人可以告诉我上述文件是规则还是建议,我绝不是这方面的专家。在实践中,我似乎没有违反其中一些规则的问题。我也没有问题将这个示例文档验证为 XHTML 严格:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
    <title></title>
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
    </head>
    <body>
    <div><form action="" method="post">
    <div>
    <input name="♠♣♥♦" />
    <input name="''''" />
    <input name=")(&amp;#$)%#$%" />
    </div>
    </form>
    </div>
    </body>
    </html>
    

    粘贴到the validator,就可以通过了。


    要添加的另一个最佳实践:使您的表单输入名称或 get/post 键有意义,当然与所有其他命名约定一样。不要使用input1$_GET['param']。使用描述含义的名称,例如last_name$_GET['sort_order']

    【讨论】:

      【解决方案2】:

      我认为最好的解决方案是:

      • 使用小写,
      • 不使用点,任何其他特殊字符(可以不带线),
      • 了解它们在请求期间的传递方式(例如,name="test[][]" 将在其他数组中的数组中创建值)并正确使用它,
      • 避免产生冲突(例如,?test=1&amp;test=2 会产生问题,因为只会传递其中一个值 - 最好使用 ?test[]=1&amp;test[]=2,这样会传递具有两个值的数组),
      • 保持一致,

      此外,浏览您可能在 GitHub.com 上找到的不同解决方案,这样您将使用许多人经过测试和使用的良好实践。

      【讨论】:

      • 这些并不都是真正的规则,有些是你的意见。
      • @Wesley 正确。第一个不需要遵循。这就是你的想法?
      • 这些语言/框架不是依赖于某些语言/框架吗? IE。第三个和第四个(例如,Django 可以很好地处理相同的查询键)。
      • 我认为这就是为什么您不应该以一种语言支持而另一种语言不支持的方式编写它。你不觉得吗?此外,Yarin 没有给我们任何关于解释 POST / GET 的语言的提示(可能在服务器端,但不一定)。
      • "点,任何其他特殊字符" 完全没问题。空格很好。破折号很好。对于 OP 的问题:查询字符串中的 GET 变量可以包含任何内容,但会(应该)被编码。
      【解决方案3】:

      总之,不——只要您的变量名称符合 HTTP 规范和您使用的支持 Web 服务器,您可以随意调用您的参数。

      如果您使用与命名变量时相同的参数命名准则,您应该能够选择一个好的名称。

      【讨论】:

        【解决方案4】:

        我们可以将名称用作变量名称规则,但也可以将关键字用作 GET/POST 变量名称。 更好的是,我们可以在适用的情况下使用与数据库列名相同的名称。但是没有这样的规则。 只是这些是一些建议。

        【讨论】:

        • 公开数据库列名一般不是建议。
        • @Wesley 谢谢,这是真的,感谢您的澄清。在 Get 的情况下,我们可以使用适合搜索引擎优化的好名称,例如使用关键字。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-10
        • 1970-01-01
        • 1970-01-01
        • 2013-10-29
        相关资源
        最近更新 更多