打印已准备语句php的结果(mysqli::num_行设置不正确)

打印已准备语句php的结果(mysqli::num_行设置不正确),php,mysqli,Php,Mysqli,我最近更新了正常的声明 $result = mysql_query("SELECT user_id from users WHERE user_id = '$user_id'"); 准备好的声明(安全) 我学习了一些教程,但这仍然不起作用: public function isUserRegistered($user_id) { print $user_id; $stmt = $this->conn->prepare("SELECT user_id

我最近更新了正常的声明

$result = mysql_query("SELECT user_id from users WHERE user_id = '$user_id'");
准备好的声明(安全)

我学习了一些教程,但这仍然不起作用:

public function isUserRegistered($user_id) {
        print $user_id;
        $stmt = $this->conn->prepare("SELECT user_id FROM users WHERE user_id = ?");
        $stmt->bind_param("s", $user_id);
        if ($stmt->execute()) {
            $stmt->bind_result($user_id);
            $stmt->fetch();     

            $no_of_rows = $stmt->num_rows;
            print $no_of_rows;
            $stmt -> close();
            if ($no_of_rows > 0) {
                print "Finally";
                // user already registered
                return true;
            } else {
                print "Stupid";
                // user is not registered
                return false;
            }
        }
    }
提供的id存在,因为我可以在正在打印的控制台中看到它。正在执行
if($stmt->execute())
,但由于某些原因,没有返回任何内容

如何解决此问题以及如何打印结果

我也试过:

while ($stmt->fetch()) {
        printf ("%s (%s)\n", $user_id);
    }

大多数教程都是由知识不比你强的人编写的。在代码中使用num_rows()肯定是这样一个教程的标志

事实上,在PHP中,您永远不需要这样的函数

以您的代码为例已经有一个变量可以告诉用户是否已注册——一个选定的用户id。您可以从函数返回该id。或者你可以用一个像这样的常量

public function isUserRegistered($user_id)
{
    $sql = "SELECT 1 FROM users WHERE user_id = ?";
    $stmt = $this->conn->prepare($sql);
    $stmt->bind_param("s", $user_id);
    $stmt->execute();
    $stmt->bind_result($found);
    $stmt->fetch();     
    return $found;
}

大多数教程都是由知识不比你强的人编写的。在代码中使用num_rows()肯定是这样一个教程的标志

事实上,在PHP中,您永远不需要这样的函数

以您的代码为例已经有一个变量可以告诉用户是否已注册——一个选定的用户id。您可以从函数返回该id。或者你可以用一个像这样的常量

public function isUserRegistered($user_id)
{
    $sql = "SELECT 1 FROM users WHERE user_id = ?";
    $stmt = $this->conn->prepare($sql);
    $stmt->bind_param("s", $user_id);
    $stmt->execute();
    $stmt->bind_result($found);
    $stmt->fetch();     
    return $found;
}

问题是除非您首先存储结果,否则
$stmt->num_rows
无效,如下所述:

获取
工作正常
并按预期返回数据行。唉,
mun_rows
属性为零,因此
isuserregisted
方法失败。即使它返回了正确的数据

注意:更改为实际检查从
获取的返回值

结论:

  • 使用
    $stmt->store_result()
    确保
    $stmt->num_rows
    有用

  • 使用实际返回的数据来确保它返回了您期望的数据

示例代码:

最终
isUserRegistered
我使用的代码:

代码:

var_dump语句的输出:

注意:
store\u结果
语句

12321
string 'UserRegister::isUserRegistered' (length=30)
string 'input user id: 12321' (length=20)
string 'found user id: 12321' (length=20)
string 'reported number of rows: 1' (length=26)
string 'K:\developer\testmysql\index4.php78' (length=35)
Finally
string 'isUserRegistered : 
注释掉“store_result”语句,该语句给出:

12321
string 'UserRegister::isUserRegistered' (length=30)
string 'input user id: 12321' (length=20)
string 'found user id: 12321' (length=20)
string 'reported number of rows: 0' (length=26)
string 'K:\developer\testmysql\index4.php79' (length=35)
Finally
string 'isUserRegistered : true

注意:报告的行数为零。

问题是除非您首先存储结果,否则
$stmt->num_rows
无效,如下所述:

获取
工作正常
并按预期返回数据行。唉,
mun_rows
属性为零,因此
isuserregisted
方法失败。即使它返回了正确的数据

注意:更改为实际检查从
获取的返回值

结论:

  • 使用
    $stmt->store_result()
    确保
    $stmt->num_rows
    有用

  • 使用实际返回的数据来确保它返回了您期望的数据

示例代码:

最终
isUserRegistered
我使用的代码:

代码:

var_dump语句的输出:

注意:
store\u结果
语句

12321
string 'UserRegister::isUserRegistered' (length=30)
string 'input user id: 12321' (length=20)
string 'found user id: 12321' (length=20)
string 'reported number of rows: 1' (length=26)
string 'K:\developer\testmysql\index4.php78' (length=35)
Finally
string 'isUserRegistered : 
注释掉“store_result”语句,该语句给出:

12321
string 'UserRegister::isUserRegistered' (length=30)
string 'input user id: 12321' (length=20)
string 'found user id: 12321' (length=20)
string 'reported number of rows: 0' (length=26)
string 'K:\developer\testmysql\index4.php79' (length=35)
Finally
string 'isUserRegistered : true


注意:报告的行数为零。

您是否收到任何错误?您是否尝试手动执行同一查询并返回任何结果?是的,它确实返回一行。不,我没有发现任何错误。你能把错误检查添加到你的问题中吗?也许你做错了。我是php新手。你这是什么意思?我正在使用postman,我可以在控制台中看到它正在打印id、0行和愚蠢的
123210愚蠢的
只需添加您如何检查代码中的查询错误。很明显,如果出现错误,它将返回0行。您是否收到任何错误?您是否尝试手动执行同一查询并返回任何结果?是的,它确实返回一行。不,我没有发现任何错误。你能把错误检查添加到你的问题中吗?也许你做错了。我是php新手。你这是什么意思?我正在使用postman,我可以在控制台中看到它正在打印id、0行和愚蠢的
123210愚蠢的
只需添加您如何检查代码中的查询错误。很明显,如果出现错误,它将返回0行。谢谢,我现在将修改它。是否可以使用打印结果的打印语句进行更新?在名为isUserRegistered()的函数中不应包含任何打印语句。你必须在一个条件下使用这个函数,你可以在这个条件下打印一些东西。我以后不会使用它,我只需要在控制台中查看是否返回了正确的东西。就像我在函数中打印“Finally”一样,我试图打印返回的值,但仍然一无所获。我想指定这个
从user\u id='12321'
工作的用户中选择user\u id。我的已经是这样了,我仍然无法打印返回的任何内容。谢谢,我现在就修改它。是否可以使用打印结果的打印语句进行更新?在名为isUserRegistered()的函数中不应包含任何打印语句。你必须在一个条件下使用这个函数,你可以在这个条件下打印一些东西。我以后不会使用它,我只需要在控制台中查看是否返回了正确的东西。就像我在函数中打印“Finally”一样,我试图打印返回的值,但仍然一无所获。我想指定这个
从user\u id='12321'
有效的用户中选择user\u id。我的已经是这样了,我仍然无法打印返回的任何内容。@BogdanDaniel,谢谢。对于那些不熟悉
mysqli
的人来说,很难找到故障。结果很有趣,问题是$stmt-