【问题标题】:Can't find a 'syntax error' in my PHP code在我的 PHP 代码中找不到“语法错误”
【发布时间】:2013-01-11 06:06:32
【问题描述】:

我正在编写一个函数来验证用户。我创建与数据库的连接,然后准备查询,绑定参数,执行查询,将结果绑定到变量,检查查询是否返回结果。

如果是,我比较结果(绑定到变量),关闭语句,关闭连接,然后返回适当的值。好吧,这就是我认为我正在做的事情,但我不断收到语法错误,我无法弄清楚我做错了什么:

语法错误:预期:exit、if、标识符、变量、echo、do、while、for、foreach、declare、switch、break、continue、function、return、try、throw、use、global、unset、isset、空、类、接口、数组、{、}、包含、include_once、eval、require、require_once、print、';'、+、-、!、~、++、--、@、[、new、static、抽象的,最终的,(,$

我的代码:

/**
     * Authenticates a user. 
     * @param type $email - String value
     * @param type $hashedPassword - String value
     * @return true if user is authenticated or false otherwise - Boolean value
     */
    function isValidUser($email, $hashedPassword)
    {
        //This variable will hold the value returned from the query to the database.
        var $rPassword = NULL;

        //Establish a connection
        $mysqli = new mysqli($GLOBALS['dbServer'], $GLOBALS['dbUserName'], $GLOBALS['dbPassword'], $GLOBALS['dbName']);

        //Check if connection failed
        if($mysqli->connect_error)
        {
            die('Connect Error (' . $mysqli->connect_errno . ') ' 
                    . $mysqli->connect_error);
        }

        $stmt = $mysqli->prepare("SELECT password FROM user_info WHERE email=?");
        $stmt->bind_param('s', $email);
        $stmt->execute();
        $stmt->bind_result($rPassword);
        if($stmt->fetch())
        {
            if(($rPassword != null) && ($rPassword == $hashedPassword))
            {
                $stmt->close();
                $mysqli->close();
                return true;
            } 
        }           
        $stmt->close();
        $mysqli->close();
        return false;           
    }

我在不使用预准备语句的情况下执行此操作,并且代码运行良好,但后来我做了一些研究,发现预准备语句是可行的方法,因为它们有助于防止 SQL 注入。

【问题讨论】:

  • 哪一行出现语法错误?
  • 从 user_info WHERE email=:s 中选择密码
  • @vodich 不。这是 MySQLi。您正在考虑 PDO。
  • 如果删除他的 var 删除了他的错误,请不要忘记对答案进行投票并选择接受。
  • 它消除了他的语法错误,那是你的问题。该代码可能有很多其他问题,但这与这个问题无关。 SO 不是调试服务。

标签: php database mysqli prepared-statement


【解决方案1】:
var $rPassword = NULL;

应该是:

$rPassword = NULL;

var 用于初始化类中的属性。见documentation。如果您使用的是类,则需要在方法(函数)之外对其进行初始化,然后通过$this->rPassword 访问该属性。

【讨论】:

  • 感谢确实消除了语法错误,但其余逻辑是否正确?
  • @PAujla03 您是否重新测试了代码以查看它是否通过了身份验证?您要问的问题与关于语法错误的原始帖子完全不同。测试代码,看看它现在是否可以工作,如果不行,那么我们可以从那里开始。你的方法是正确的,所以你知道。
  • 只是一个小说明:类属性在使用前没有被初始化,但如果你不声明它们,它们将默认为public(并且你不想要那个)。声明它们是一种好习惯,您可能希望将它们声明为 protected
  • 戈登:哈哈,谢谢。 @crypticツ我确实重新测试了它,但它不起作用。所以我将不得不重新评估我的逻辑。正如有人指出我的问题已经得到解答,这不是调试服务,哈哈。所以我要感谢你摆脱了我的语法错误。我会继续自己努力。
  • @PAujla03 如果问题已回答,请通过单击旁边的复选标记选择答案,将其标记为已回答。
【解决方案2】:

var 关键字自 PHP 5.0 起已弃用...

它用于在 PHP4 中声明类成员变量,不再需要。它可以在 PHP5 中工作,但会在 PHP 5.0.0 到 5.1.2 版本中引发E_STRICT 警告,自此它已被弃用。

【讨论】:

    【解决方案3】:

    你有两个错误

    不要将 rPassword 重新启动为 NULL 只是让它像这样 $r密码 = 0; 或者使用大写使两个 NULL 和 null 相同的 NULL ! 其次,rPassword 没有像这样得到你需要的结果 你需要通过正确的语言看这里

    http://php.net/manual/en/mysqli-stmt.bind-result.php

     $stmt->bind_result($rPassword);
            if($stmt->fetch())
            {
                if(($rPassword == null) || ($rPassword != $hashedPassword))
                {
                    $stmt->close();
                    $mysqli->close();
                    return false;
                } 
            }           
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      • 2011-02-03
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多