也许我从一开始就做错了,如果是这样我也会改正...
我有一个菜单项,它作为 URL 的一部分传递事件 ID#。在我的特定情况下,它将用户带到该事件的信息页面。然后有一个按钮可以让他们注册参加事件。单击,他们已注册参加事件,然后返回到同一信息页面,该页面现在显示他们已注册并让他们看到一些额外的内容。
他们第一次访问该页面时,我使用 $_GET 来计算事件 ID#,如果他们单击作为隐藏输入字段的注册按钮,该事件 ID# 就会传回页面。但这次我需要使用 $_POST 来计算事件 ID#。所以我查询中的代码有一个 bool 部分,看起来像
SELECT stuff FROM ... WHERE eventID = ($_GET["ID"] ? $_GET["ID"] : $_POST["ID"])
它有效,但感觉它可以做得更好......
最佳答案
- 清理您的数据库输入。
mysql_real_escape_string()
是实现此目的的一种快速简便的方法(或者,如果 ID 始终是数字,您可以只使用intval()
)。不要像爱上的学校一样Bobby Tables . 如果您不确定使用了哪种请求方法,请使用$_REQUEST
超全局变量,它包含 GET 和 POST 变量(例如:$_REQUEST['ID' ]
)。我通常不使用$_REQUEST
,因为我想清楚我的数据来自何处,但这是使用它的完美情况。
正如 Nick Presta 指出的那样,$_REQUEST
还包括 cookie 变量,事实上,名称冲突的默认*优先顺序是 $_COOKIE
, $_POST
,然后是 $_GET
。鉴于此,在将数据插入查询之前,您可以执行您现在正在执行的操作,或者改用 $_SERVER['REQUEST_METHOD']
:
// You can use mysql_real_escape_string() instead if you want
$id = ($_SERVER['REQUEST_METHOD'] == 'POST') ? intval($_POST['id']) : intval($_GET['id']);
此外,如前所述,请记住您可以选择使用 prepared statements而不仅仅是原始 SQL 查询。
* — 顺序是 configurable通过 variables_order
配置指令,正如 Stewart 在评论中提到的那样。
关于php - 使用 $_GET 和 $_POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1252448/