2016-11-17 20 views
0

因此,经过一段时间的努力寻找安静之后,我遇到了需要使用store_result()函数将返回的行(从select查询)传输到我不知道在哪里的解决方案,但似乎没有必要,甚至是昂贵的传输结果,然后检查行数。为什么在确定选择查询的PHP准备语句中返回的行数时存储结果集?

例如..

$sql = "SELECT * FROM login_info WHERE user_id=? AND password=?"; 

     //Prepare statement 
     $stmt = $conn->prepare($sql); 

     //bind parameters to prepared statement 
     $stmt->bind_param("ss",$userId,$password); 

     //execute query 
     $stmt->execute(); 

     //fetch number of rows returned 
     echo $count = $stmt->num_rows; 

$计数值为0。但之后加入stmt- $> store_result();到上面的代码它的工作。

$sql = "SELECT * FROM login_info WHERE user_id=? AND password=?"; 

     //Prepare statement 
     $stmt = $conn->prepare($sql); 

     //bind parameters to prepared statement 
     $stmt->bind_param("ss",$userId,$password); 

     //execute query 
     $stmt->execute(); 

     //store result 
     $stmt->store_result(); 

     //fetch number of rows returned 
     echo $count = $stmt->num_rows; 

现在代码在count变量中打印行数为1。

+1

请参阅说明书。这里是一个链接http://php.net/manual/en/mysqli.store-result.php –

+0

要求所有行只是为了计算没有多大意义。如果你只需要计数,明确地要求它'SELECT COUNT(*)总计...'。如果您确实需要这些行,请在检索它们时进行计数。就你而言,你为什么首先需要点数?你希望有许多用户使用相同的用户名和密码吗? –

+0

@ÁlvaroGonzález不,但这是我接受培训的方式,检查计数是否大于0,显然计数总是1. – phpNoob

回答

2

由于预设的查询默认为unbuffered。并且num_rows不可用于未缓冲的查询。

让我也观察查询返回的行数基本上是无用的。每当你认为你需要它时,你可能会发现你已经有了你需要的信息。更何况这个数字如果经常被误用,会对服务器造成严重的伤害。所以num_rows几乎没有用处。

例如,在你的情况下,显然你不需要行返回的行,但只是一个标志,无论你的查询是否返回任何东西。所以你已经有很多这样的标志。例如fetch()的结果或获取的数据本身。

+0

抱歉,我恐怕我不遵循,你可以进一步说明为什么是这样。 – phpNoob

+0

我刚更新了我的答案。无论如何,作为一个noob,你应该退出mysqli并开始PDO。 –

+0

@YourCommonSense行数真的无用吗?你如何分页结果而不检索行数?有没有其他方法?只是好奇... – user966939

相关问题