【问题标题】:PHP Isset IssuePHP Isset 问题
【发布时间】: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 这只会导致错误。你没有正确连接。即使你这样做了,也不会改变任何事情。

标签: php joomla joomla3.5


【解决方案1】:

$user 将被设置,因为你在这一行设置了它

$user = urldecode($_GET['userID']);

所以改为直接检查$_GET 的值。

$sql = "Select * from users"
if (isset($_GET['userID']) {
    $user = urldecode($_GET['userID']);
    $sql .= " WHERE userID = '$user'";
}

echo $sql;

【讨论】:

    【解决方案2】:

    运行 isset() 检查 $_GET 变量是否已提交,如果是,则将 $user 变量设置为它,否则将其留空

    $user = '';
    if (isset($_GET['userID'])) {
        $user = urldecode($_GET['userID']);
    }
    
    $sql = "SELECT * FROM users";
    
    if ($user != '') {
    
        $sql .= " WHERE userID = '$user'";
    
    }
    
    echo $sql;
    

    【讨论】:

      【解决方案3】:

      您的问题是您的 $user 变量无论如何都已设置,因为您只是在上面设置了它。不管它是否为空,它都是设置的。您只需检查是否在 IF 语句中设置了 $_GET 变量,并在该 IF 语句中设置了 $user 变量。

      另一种方法是使用 PHP 的 empty() 函数——假设变量无论如何都不应该为空。 空不等于NULL

      最好使用此检查变量必须等于 SOMETHING 以使页面正常工作(特别是使用带有指示变量是否为空的 ELSE 语句),而不是使用 isset,因为它没有相同的检查。

      这里是函数bool empty ( mixed $var )

      这里是一个被认为是空的东西的列表:

      • “”(空字符串)
      • 0(0为整数)
      • 0.0(0 作为浮点数)
      • “0”(0作为字符串)
      • 错误
      • array()(一个空数组)
      • $var; (声明的变量,但没有值)

      您可以通过php.net了解更多信息

      在将变量设置为页面变量之前,您需要检查变量是否为 empty

      在这种情况下,我建议检查它是否为空,如果不是,则设置变量。

      if(!empty($_GET['userID'])) {
          $user = $_GET['userID'];
          $sql .= " WHERE userID = '$user'";
      }
      

      如果你愿意的话,你也可以在那里放置一个else 语句来重定向/显示没有用户ID的错误。


      你当然可以对 isset 做同样的事情,但它检查的东西更少。

      您还可以反转 if 语句的方向(如,使用 empty 您想要 NOT 运算符 ! 但对于 isset 您不想要那个。),因为您要确保它设置为 set变量。

      if(isset($_GET['userID'])) {
          $user = $_GET['userID'];
          $sql .= " WHERE userID = '$user'";
      }
      

      如果你愿意的话,你也可以在那里放置一个else 语句来重定向/显示没有用户ID的错误。

      【讨论】:

        【解决方案4】:

        ....以及正确的方式,使用Joomla的JInput类:

        $userId = JFactory::getApplication()->input->get('userID', '', 'STRING');
        $sql    = 'Select * from users';
        
        if (isset($userId)
        {
            $sql .= ' WHERE userID = ' . urldecode($userId);
        }
        
        echo $sql;
        

        【讨论】:

          【解决方案5】:

          你可以简单地使用这个

          if($_GET['userID']) {
              $user = $_GET['userID'];
              $sql .= " WHERE userID = '$user'";
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-10-25
            • 2017-10-25
            • 1970-01-01
            • 2015-10-14
            • 1970-01-01
            • 1970-01-01
            • 2016-06-28
            相关资源
            最近更新 更多