php中的get_result()和store_result()有什么区别?

Sur*_*dal 10 php mysqli

这是我的代码.我正在检查登录/注册系统中是否存在用户:

public function userExist($email){
    $stmt = $this->conn->prepare("select email from users where email= ?");
    $stmt->bind_param("s", $email);
    $stmt->execute();
    $stmt->store_result();
    if($stmt->num_rows>0){

    }
    else{

    }
}
Run Code Online (Sandbox Code Playgroud)

我可以使用get_result而不是store_result()吗?

tri*_*cot 13

这取决于您计划如何读取结果集.但是在您给出的实际示例中,您对读取任何返回的数据不感兴趣.您唯一感兴趣的是是否有记录.

在这种情况下,您的代码很好,但它对get_result同样有效.

当您想要获得具有给定电子邮件的用户的用户标识时,差异变得更加明显:

SELECT id FROM users WHERE email = ?
Run Code Online (Sandbox Code Playgroud)

如果您打算宣读ID$stmt->fetch,那么你就坚持 store_result,并会使用bind_result在你想获得这里面变量定义ID,就像这样:

$stmt->store_result();    
$stmt->bind_result($userid);  // number of arguments must match columns in SELECT
if($stmt->num_rows > 0) {
    while ($stmt->fetch()) {
        echo $userid;  
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您希望获得可以调用的结果对象fetch_assoc()或任何fetch_*variant方法,那么您需要使用get_result,如下所示:

$result = $stmt->get_result();   // You get a result object now
if($result->num_rows > 0) {     // Note: change to $result->...!
    while ($data = $result->fetch_assoc()) {
        echo $data['id'];
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您从中获取结果对象get_result,但情况并非如此store_result.您num_rows现在应该从该结果对象获得.

这两种方式都有效,这实际上是个人偏好的问题.


You*_*nse 10

像往常一样,接受的答案过于局部化,更关注无关紧要的细节而不是答案本身。

可悲的是,还有一个已删除的答案,虽然简洁,但却是一个完美的经验法则:

尽可能使用 get_result 并在其他地方使用 store_result。

这两个函数都将数据库中待处理的结果集加载到 PHP 进程的内存中,get_result()用途更广泛,因此是首选。

之间唯一的区别get_result()store_result()是,前者得到你熟悉的mysqli_result可用于使用熟悉的获取数据资源/对象fetch_row()/fetch_assoc()例程,还有一个稍微现代fetch_all(),所有这些是无比不是更方便的bind_result()例程是唯一的选项store_result()

需要注意的get_result()是,只有在使用 mysqlnd 驱动程序时才可用,这在 2019 年及以后不是问题。如果它不可用,您可能需要在共享主机的配置中勾选一些复选框。