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'";
}