【问题标题】:isset and if function in php with or operatorisset 和 if 函数在 php 中使用 or 运算符
【发布时间】:2016-04-03 12:13:02
【问题描述】:

我有一些 PHP 代码来检查用户登录状态,检查是否设置了会话变量或设置了 cookie。如果其中任何一个条件为真,那么它的大权限将重定向到登录页面。代码如下所示:

if(isset($_SESSION["userid"]) || isset($_COOKIE["userid"]) && isset($_SESSION["username"]) || isset($_COOKIE["username"])  && isset($_SESSION["password"]) || isset($_COOKIE["password"])){
} else {
header("location : register.php");
}

问题是,如果会话被破坏(通过关闭浏览器或任何其他原因),它会将用户重定向到登录页面。但它必须做的是读取 cookie 数据并授予用户访问权限,因为 cookie 仍然存在(我通过 echo cookie 数据检查了 cookie 仍然存在)。

【问题讨论】:

  • if((isset($_SESSION["userid"]) && isset($_SESSION["username"]) && isset($_SESSION["password"])) || (isset($_COOKIE["userid"]) && isset($_COOKIE["username"]) && isset($_COOKIE["password"]))){ } else { header("location : register.php"); }
  • 当您发布该代码时,您能提供一个链接给我吗?我会尝试一下。
  • 我强烈建议您更多地了解 OOP 或使用 Slim 或 Silex 等框架。 phptherightway.com
  • 不仅是面向对象编程,还有安全性。尤其是在哪里使用 cookie、信任 cookie 以及不存储在 cookie 中的内容。见:|| (isset($_COOKIE["userid"]) && isset($_COOKIE["username"]) && isset($_COOKIE["password"]))

标签: php if-statement cookies


【解决方案1】:

&& 的优先级高于||,所以需要用括号保护||。此外,有一个空的 if 语句只是多余的:

if(!(isset($_SESSION["userid"]) || isset($_COOKIE["userid"]) ||   
   !(isset($_SESSION["username"]) || isset($_COOKIE["username"])) || 
   !(isset($_SESSION["password"]) || isset($_COOKIE["password"]))) {
    header("location : register.php");
}

【讨论】:

    【解决方案2】:

    您需要稍微改变一下您的条件,因为您在SESSIONCookie 中混淆了它。将它们与&& 放在一起并用|| 将它们分开,如下所示:-

    if((isset($_SESSION["userid"]) &&  isset($_SESSION["username"]) && isset($_SESSION["password"])) || (isset($_COOKIE["userid"]) && isset($_COOKIE["username"])  && isset($_COOKIE["password"]))){
    
        // your action that you want
    
    } else {
    
       header("location : register.php");
    }
    

    注意:- 注意相同的东西会应用到任何地方(在彼此的页面和条件上),否则你会遇到问题。

    另外对cookie的依赖也不好,因为用户可以随时更改。

    【讨论】:

      【解决方案3】:

      您需要添加几个断路器来对您的语句进行分组,如下所示:

          if( 
          ( isset($_SESSION["userid"]) || isset($_SESSION["username"]) && isset($_SESSION["password"]) ) 
      ||
          ( isset($_COOKIE["userid"]) || isset($_COOKIE["username"]) && isset($_COOKIE["password"]) )
      ){
          // Your action
      } else {
      header("location : register.php");
      }
      

      此类语句将检查是否设置了 COOKIE 或 SESSION 并检查 user_id 或用户名和密码。 如果你需要 AND user_id AND username 比替换 ||在此字段的 isset() 函数之间的括号中。

      【讨论】:

        【解决方案4】:

        我认为您的 if 条件缺少一些括号。为了使您的代码更具可读性,您可以创建两个函数

        function isSessionValid()
        {
            return isset($_SESSION["userid"]) && isset($_SESSION["username"]) && isset($_SESSION["password"]);
        }
        
        function isCookieValid()
        {
            return isset($_COOKIE["userid"]) && isset($_COOKIE["username"]) && isset($_COOKIE["password"]);
        }
        

        然后在你的 if 语句中使用这些函数:

        if (isSessionValid() || isCookieValid()) {
        
        } else {
        
        }
        

        【讨论】:

          猜你喜欢
          • 2013-10-16
          • 2012-02-22
          • 1970-01-01
          • 1970-01-01
          • 2017-03-06
          • 1970-01-01
          • 2021-06-20
          • 2017-04-10
          • 1970-01-01
          相关资源
          最近更新 更多