【问题标题】:Strict Standards: Only variables should be passed by reference in m_auth严格标准:在 m_auth 中只能通过引用传递变量
【发布时间】:2014-02-10 03:58:43
【问题描述】:

我正在为一个使用 MVC 编程的项目开发登录系统,但遇到了这个错误。这是代码,问题行是#31

这个登录系统是一个教程,我一直按原样完成它。我读过 PHP 5 存在一些版本问题?不确定,希望有人可以帮助我。

问题线:

$stmt->bind_param("ss", $user, md5($pass . $this->salt));

代码:

<?php

/*
    Authorization Class
    deal with auth tasks
*/

class Auth
{
private $salt = 'j4H9?s0d';

/*
    Constructor
*/
function __construct()
{
}

/*
    Functions

*/
function validateLogin($user, $pass)
{
    // access db
    global $Database;

    // create query
    if ($stmt = $Database->prepare("SELECT * FROM users WHERE username = ? AND password = ?"))
    {
        $stmt->bind_param("ss", $user, md5($pass . $this->salt));
        $stmt->execute;
        $stmt->store_result();

        // check for num rows
        if ($stmt->num_rows > 0)
        {
            // success
            $stmt->close();
            return TRUE;
        }
        else
        {
            // failure
            $stmt->close();
            return FALSE;
        }
    }
    else
    {
        die("ERROR: Could not prepare MySQLi statement.");
    }
}

function checkLoginStatus()
{
    if (isset($_SESSION['loggedin']))
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

function logout()
{
    session_destroy();
    session_start();
}
}

【问题讨论】:

标签: php oop


【解决方案1】:

bind_param 的参数是对变量的引用。你不能在那里使用md5()。您需要先将其保存到变量中。

$userPass = md5($pass . $this->salt);
$stmt->bind_param("ss", $user, $userPass);

【讨论】:

    【解决方案2】:

    问题是第三个参数是函数调用的结果:

    md5($pass . $this-&gt;salt)

    您需要先将该值保存到一个变量中,然后再将其传递给bind_param,以便它可以通过引用传递。

    示例:

    $password = md5($pass . $this->salt);  
    $stmt->bind_param("ss", $user, $password);
    

    另外,don't use md5 to hash passwords

    【讨论】:

      【解决方案3】:

      加括号:

      $stmt->bind_param("ss", $user, (md5($pass . $this->salt)));
      

      【讨论】:

        【解决方案4】:

        这很可能在 PHP 5.4 中作为 Function Array Dereferencing (FAD) (revision 300266) 的一部分修复。

        或者作为解决方法尝试添加额外的括号,例如

        $stmt->bind_param("ss", $user, (md5($pass . $this->salt)));
        

        这将取消引用方法/函数返回, see: (<5.6) Occasionally significant parentheses.

        【讨论】:

          猜你喜欢
          • 2013-05-21
          • 1970-01-01
          • 2012-12-24
          • 2012-10-25
          • 2020-07-02
          • 2013-12-28
          • 2013-08-14
          相关资源
          最近更新 更多