password_hash 给出错误:严格标准:只有变量应该通过引用传递[重复]

Posted

技术标签:

【中文标题】password_hash 给出错误:严格标准:只有变量应该通过引用传递[重复]【英文标题】:password_hash giving error: Strict standards: Only variables should be passed by reference [duplicate] 【发布时间】:2016-10-11 23:06:18 【问题描述】:

编辑:我的问题已经解决。我不知道或想到 bindValue(),这就是为什么我不认为这是一个重复的问题。感谢您的帮助!

我正在学习如何使用 php 注册用户,似乎 password_hash 给了我“只有变量应该通过引用传递”错误消息。我见过很多人有同样的错误,但它似乎不适用于我的情况(在我看来)。

连接数据库

$server = 'localhost';
$username ='root';
$password ='root';
$database = 'register_test';

try
    $conn = new PDO("mysql:host=$server;dbname=$database;" , $username, $password);
 catch(PDOException $e)
    die ("Connection failed" . $e->getMessage());

注册用户

require 'database.php';
if(!empty($_POST['email']) && !empty($_POST['password'])):

$pass = $_POST['password'];
$email = $_POST['email'];

$sql = "Insert into user (email, password) values (:email, :password)";
$stmt = $conn->prepare($sql);

$stmt ->bindParam(':email', $email);
$stmt ->bindParam(':password', password_hash($pass, PASSWORD_BCRYPT)); //error showns here

if($stmt -> execute() ):
  die('Success');
else:
  die('Fail');
endif;
endif;

如果你们需要更多信息,请告诉我。

【问题讨论】:

使用$stmt->bindValue() 而不是$stmt->bindParam() 您的查询无论如何都不会起作用。您正在指定一个要插入的字段,并提供两个值。 Marc B. 我尝试了一些东西,却忘记将“密码”放回插入语句中。感谢您的关注 【参考方案1】:

使用PDOStatement::bindValue() 代替PDOStatement::bindParam()

来自文档:

与 PDOStatement::bindValue() 不同,该变量被绑定为引用,并且只会在调用 PDOStatement::execute() 时评估

所以,你的代码变成了:

$stmt->bindValue(':email', $email);
$stmt->bindValue(':password', password_hash($pass, PASSWORD_BCRYPT)); 

启用E_STRICT模式时,函数的结果不能通过引用传递,不会触发警告。通过使用bindValue(),我们基本上将函数的返回值作为副本传递。

【讨论】:

谢谢。那确实删除了错误消息,但我确实有一个新问题。邮箱和密码在数据库中分别显示“0”和“0”。 没问题,很高兴为您提供帮助。唔。如果你 var_dump() $email$pass 会显示什么?如果问题不简单,您可能需要发布一个单独的问题。 var_dump() 显示我输入的正确字符。我重新创建了表格,现在工作正常。非常感谢您的帮助!

以上是关于password_hash 给出错误:严格标准:只有变量应该通过引用传递[重复]的主要内容,如果未能解决你的问题,请参考以下文章

文件上传中的严格标准错误

gcc编译选项pedantic(GCC编译器的C++标准严格模式)

为啥 JSLint 会在这个函数上给出严格的违规错误?

调用未定义的函数 password_hash() [关闭]

PHP 5 禁用严格标准错误

严格标准错误