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

2022-08-31 00:20:35

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

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{

    }
}

我可以使用get_result代替store_result()吗?


答案 1

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

在这种情况下,您的代码很好,但它与get_result一起工作同样好。

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

SELECT id FROM users WHERE email = ?

如果您打算用 读出该 id,那么您将坚持使用 ,并用于定义要获取此 id 的变量,如下所示:$stmt->fetchstore_resultbind_result

$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;  
    }
}

如果您希望获取可以调用的结果对象或任何fetch_* 变体方法,则需要使用 ,如下所示:fetch_assoc()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'];
    }
}

请注意,您可以从 中获取结果对象,而 与 不同。您现在应该从该结果对象中获取。get_resultstore_resultnum_rows

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


答案 2

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

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

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

这两个函数都将挂起的结果集从数据库加载到PHP进程的内存中,并且更加通用,因此是首选。get_result()

和 之间的唯一区别是前者为您提供了熟悉的mysqli_result资源/对象,可用于使用熟悉的/例程获取数据,以及稍微现代fetch_all(),所有这些都比例程更方便,这是唯一的选择。get_result()store_result()fetch_row()fetch_assoc()bind_result()store_result()

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


推荐