【发布时间】:2017-12-16 23:22:48
【问题描述】:
我正在使用isset() 来检查变量是否有值。我的问题是,即使变量没有值(参数未在 url 中传递),仍然会修改 sql 字符串以附加 where 子句。
例如 - 如果这是传递的 URL
http://internal/test/trbm?userID=3213
这是我的 php sn-p
$user = urldecode($_GET['userID']);
$sql = "Select * from users"
if (isset($user)) {
$sql .= " WHERE userID = '$user'";
}
echo $sql;
回显结果为:
Select * from users where userID = '3213'
然而,这个 URL http://internal/test/trbm 产生以下回显结果,仍然附加 where 子句,即使(至少对我而言)isset() 应该返回 false
Select * from users where userID = ''
我想要/期望的第二个回显语句(右上方)是
Select * from users
isset() 在这种情况下使用的检查不正确吗?如果是这样,我应该用什么支票代替它?
【问题讨论】:
-
试试这个查询
$sql .= " WHERE userID = '.$user.'"; -
使用
!empty($user),因为变量$user总是被设置,因为urldecode()在输入为空时会返回一个空字符串。 -
某处有“关于 isset 和 empty 的权威指南”帖子,我将尝试查找并将其链接为副本。
-
请同时查看How can I prevent SQL injection in PHP -
$_GET['userID']的值即使是 urlencoded,仍然容易受到UNION查询的 SQL 注入攻击。 -
@Mr.Developer 这只会导致错误。你没有正确连接。即使你这样做了,也不会改变任何事情。