2

在提交用户详细信息后,我正在尝试查询数据库以检查电子邮件是否已注册。

但是,我使用以下代码(摘录)收到“严格标准:仅应通过引用传递变量”错误:

} else  if (isset($_POST['srSubmit']) && $_POST['srEmail']) {

    //check if email already taken
    if ($stmtreg = $mysqli->prepare("SELECT user_email FROM users WHERE user_email = ?")) {
        $stmtreg->bind_param("s", strtolower($_POST['srEmail']));
        $stmtreg->execute();
        $stmtreg->store_result();
        $num_rows = $stmtreg->num_rows();
        $stmtreg->bind_result($email);
        $stmtreg->fetch();
        $stmtreg->close();
    }

我有两个问题:i) 为什么脚本仍然有效,即使出现此错误?ii) 是什么原因造成的,我该如何解决?

谢谢

4

4 回答 4

5

为 设置一个临时变量strtolower($_POST['srEmail']),例如:

$email = strtolower($_POST['srEmail']);

然后传入$email你的bind_param. 即使 strtolower() 返回一个字符串,PDO 也不能引用它,因为它不是一个变量。

于 2013-07-26T16:33:26.433 回答
1

无法回答您的第一个问题,但这是您通过参考传递的方式:

//check if email already taken
if ($stmtreg = $mysqli->prepare("SELECT user_email FROM users WHERE user_email = ?")) {
    $email = strtolower($_POST['srEmail']);
    $stmtreg->bind_param("s", &$email);
    $stmtreg->execute();
    $stmtreg->store_result();
    $num_rows = $stmtreg->num_rows();
    $stmtreg->bind_result($email);
    $stmtreg->fetch();
    $stmtreg->close();
}

为了通过引用传递变量,您需要&在变量名之前放置一个(例如&$email

于 2013-07-26T16:31:07.913 回答
0

看看这一行:

$stmtreg->bind_param("s", strtolower($_POST['srEmail']));

正如bind_param 的 php 手册所说:

bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )

此函数需要通过引用传递变量。虽然您没有将值传递给它: strtolower 函数的结果。

要查看差异,请查看以下代码:

<?php
function foo(&$var)
{
    $var .= "!";
}

$a = "1";
foo($a);
print $a;
print "\n";

$b = "1";
foo(strtolower($b));
print $b;
?>

它将打印:

1!
1

$b 没有被修改,因为 php 没有要修改的变量。http://www.php.net/manual/en/language.references.pass.php

因此,将结果保存到变量并改为传递它:

$email = strtolower($_POST['srEmail']);
$stmtreg->bind_param("s", $email);

“为什么脚本仍然有效,即使有这个错误?”

因为您只需要将参数替换为值,而不是修改 bind_param 函数中的输入变量。

于 2013-07-26T16:37:37.733 回答
0

问:为什么这个脚本仍然有效?

因为这是一个警告,而不是真正的错误。

问:是什么原因造成的?

正是这条线导致了错误。

$stmtreg->bind_param("s", strtolower($_POST['srEmail']));

bind_param 期望 VARIABLE 作为第二个参数。该strtolower函数返回一个字符串,而不是一个变量。

问:我该如何解决这个问题?

解决此问题的一种方法是将 strtolower 的返回值分配给一个变量,然后在 bind_param 中引用该变量:

$lower_email = strtolower($_POST['srEmail']);
$stmtreg->bind_param("s", $lower_email);
于 2013-07-26T16:40:05.430 回答