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

时间:2016-01-31 17:21:55

标签: php

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

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

2 个答案:

答案 0 :(得分:8)

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

在这种情况下,您的代码很好,但它与 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

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

答案 1 :(得分:1)

像往常一样,被接受的答案过于侧重于问题正文中的无关紧要的细节,而对标题中所述问题的直接答案却难以理解。

可悲的是,还有一个已删除的答案,尽管答案简明扼要,但却是一个完美的经验法则:

  

尽可能使用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()的唯一选择

可以注意到,var mtlLoader = new THREE.MTLLoader(); mtlLoader.load('/models/Glob.mtl', function(materials) { materials.preload(); var objLoader = new THREE.OBJLoader(); objLoader.setMaterials(materials); objLoader.load('/models/Glob.obj', function(object){ scene.add(object); console.log(object); }); 仅在使用mysqlnd驱动程序时可用,这在2019年及以后不再是问题。如果不可用,则可能要在共享主机的配置中打勾一些复选框。