PHP 资产问题
PHP Isset Issue
我正在使用 isset()
检查变量是否有值。我的问题是,即使变量没有值(参数未在 url 中传递),sql 字符串仍被修改以附加 where 子句。
例如 - 如果这是传递的 URL
http://internal/test/trbm?userID=3213
这是我的 php 片段
$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()
应该 return false
Select * from users where userID = ''
我的 desired/expected 第二个 echo 语句(右上方那个)是
Select * from users
在这种情况下 isset()
是否使用了错误的支票?如果是这样,我应该用什么支票代替它?
$user
会被设置,因为你在这一行设置了
$user = urldecode($_GET['userID']);
所以直接检查 $_GET
值。
$sql = "Select * from users"
if (isset($_GET['userID']) {
$user = urldecode($_GET['userID']);
$sql .= " WHERE userID = '$user'";
}
echo $sql;
运行 isset() 检查 $_GET 变量是否已经提交,如果是则设置 $user 变量给它,否则留空
$user = '';
if (isset($_GET['userID'])) {
$user = urldecode($_GET['userID']);
}
$sql = "SELECT * FROM users";
if ($user != '') {
$sql .= " WHERE userID = '$user'";
}
echo $sql;
您的问题是您的 $user
变量已设置,无论如何,因为您只是在上面设置了它。不管它是否为空,它都是已设置的。您只需要检查 IF 语句中是否设置了 $_GET
变量,并在该 IF 语句中设置 $user
变量。
另一种方法是使用 PHP 的 empty()
函数——假设变量无论如何都不应该为空。 空不等于NULL
最好使用此检查变量 是否必须等于某个值 以使页面正常工作(尤其是使用 ELSE 语句带有指示变量是否为空),而不是使用 isset,因为它没有相同的检查。
这里是函数bool empty ( mixed $var )
以下是被视为空的事物的列表:
- "" (an empty string)
- 0 (0 as an integer)
- 0.0 (0 as a float)
- "0" (0 as a string)
- NULL
- FALSE
- array() (an empty array)
- $var; (a variable declared, but without a value)
您可以在 php.net
了解更多信息
在将变量设置为页面变量之前,您需要检查变量是否 empty
。
在这种情况下,我建议检查它是否为空,如果不是,则设置变量。
if(!empty($_GET['userID'])) {
$user = $_GET['userID'];
$sql .= " WHERE userID = '$user'";
}
你也可以在那里放一个 else
语句来 redirect/show 如果你愿意的话,没有用户 ID 的错误。
你当然可以用 isset 做同样的事情,但它检查的东西更少。
您还反转了 if 语句的方向(例如,使用 empty
您想要 NOT 运算符 !
但对于 isset 您不想要它。),因为您想要确保它已设置为设置变量。
if(isset($_GET['userID'])) {
$user = $_GET['userID'];
$sql .= " WHERE userID = '$user'";
}
你也可以在那里放一个 else
语句来 redirect/show 如果你愿意的话,没有用户 ID 的错误。
...和正确的方式,使用Joomla的JInput class:
$userId = JFactory::getApplication()->input->get('userID', '', 'STRING');
$sql = 'Select * from users';
if (isset($userId)
{
$sql .= ' WHERE userID = ' . urldecode($userId);
}
echo $sql;
你可以简单地使用这个
if($_GET['userID']) {
$user = $_GET['userID'];
$sql .= " WHERE userID = '$user'";
}
我正在使用 isset()
检查变量是否有值。我的问题是,即使变量没有值(参数未在 url 中传递),sql 字符串仍被修改以附加 where 子句。
例如 - 如果这是传递的 URL
http://internal/test/trbm?userID=3213
这是我的 php 片段
$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()
应该 return false
Select * from users where userID = ''
我的 desired/expected 第二个 echo 语句(右上方那个)是
Select * from users
在这种情况下 isset()
是否使用了错误的支票?如果是这样,我应该用什么支票代替它?
$user
会被设置,因为你在这一行设置了
$user = urldecode($_GET['userID']);
所以直接检查 $_GET
值。
$sql = "Select * from users"
if (isset($_GET['userID']) {
$user = urldecode($_GET['userID']);
$sql .= " WHERE userID = '$user'";
}
echo $sql;
运行 isset() 检查 $_GET 变量是否已经提交,如果是则设置 $user 变量给它,否则留空
$user = '';
if (isset($_GET['userID'])) {
$user = urldecode($_GET['userID']);
}
$sql = "SELECT * FROM users";
if ($user != '') {
$sql .= " WHERE userID = '$user'";
}
echo $sql;
您的问题是您的 $user
变量已设置,无论如何,因为您只是在上面设置了它。不管它是否为空,它都是已设置的。您只需要检查 IF 语句中是否设置了 $_GET
变量,并在该 IF 语句中设置 $user
变量。
另一种方法是使用 PHP 的 empty()
函数——假设变量无论如何都不应该为空。 空不等于NULL
最好使用此检查变量 是否必须等于某个值 以使页面正常工作(尤其是使用 ELSE 语句带有指示变量是否为空),而不是使用 isset,因为它没有相同的检查。
这里是函数bool empty ( mixed $var )
以下是被视为空的事物的列表:
- "" (an empty string)
- 0 (0 as an integer)
- 0.0 (0 as a float)
- "0" (0 as a string)
- NULL
- FALSE
- array() (an empty array)
- $var; (a variable declared, but without a value)
您可以在 php.net
了解更多信息在将变量设置为页面变量之前,您需要检查变量是否 empty
。
在这种情况下,我建议检查它是否为空,如果不是,则设置变量。
if(!empty($_GET['userID'])) {
$user = $_GET['userID'];
$sql .= " WHERE userID = '$user'";
}
你也可以在那里放一个 else
语句来 redirect/show 如果你愿意的话,没有用户 ID 的错误。
你当然可以用 isset 做同样的事情,但它检查的东西更少。
您还反转了 if 语句的方向(例如,使用 empty
您想要 NOT 运算符 !
但对于 isset 您不想要它。),因为您想要确保它已设置为设置变量。
if(isset($_GET['userID'])) {
$user = $_GET['userID'];
$sql .= " WHERE userID = '$user'";
}
你也可以在那里放一个 else
语句来 redirect/show 如果你愿意的话,没有用户 ID 的错误。
...和正确的方式,使用Joomla的JInput class:
$userId = JFactory::getApplication()->input->get('userID', '', 'STRING');
$sql = 'Select * from users';
if (isset($userId)
{
$sql .= ' WHERE userID = ' . urldecode($userId);
}
echo $sql;
你可以简单地使用这个
if($_GET['userID']) {
$user = $_GET['userID'];
$sql .= " WHERE userID = '$user'";
}