【问题标题】:What is the difference between get_result() and store_result() in php?php 中的 get_result() 和 store_result() 有什么区别?
【发布时间】:2016-01-31 17:21:55
【问题描述】:

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

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() 吗?

【问题讨论】:

  • 你看说明书了吗?
  • 我做了.....get_result() 从准备好的语句返回一个结果集,但 store_result() 也是如此
  • 您使用的是哪个数据库驱动程序?
  • get_result() 是获取,store_result() 是放置

标签: php mysqli


【解决方案1】:

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

在这种情况下,您的代码没问题,但它与 get_result 的效果同样好。

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

SELECT id FROM users WHERE email = ?

如果你打算用$stmt->fetch 读出那个id,那么你会坚持 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;  
    }
}

如果您希望获得可以调用fetch_assoc() 或任何 fetch_* 变体方法的结果对象,那么您需要使用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_result 获得结果对象,store_result 不是这种情况。您现在应该从该结果对象中获得num_rows

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

【讨论】:

    【解决方案2】:

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

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

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

    这两个函数都将待处理的结果集从数据库加载到 PHP 进程的内存中,get_result() 更加通用,因此更受欢迎。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 2018-11-18
      相关资源
      最近更新 更多