这是我的代码。我正在检查登录/注册系统中是否存在用户:
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()吗?
答案 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年及以后不再是问题。如果不可用,则可能要在共享主机的配置中打勾一些复选框。