Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP prepared语句中为select查询确定返回的行数时,为什么要存储结果集?_Php_Mysql_Mysqli_Prepared Statement - Fatal编程技术网

在PHP prepared语句中为select查询确定返回的行数时,为什么要存储结果集?

在PHP prepared语句中为select查询确定返回的行数时,为什么要存储结果集?,php,mysql,mysqli,prepared-statement,Php,Mysql,Mysqli,Prepared Statement,因此,在苦苦挣扎了一段时间后,我找到了一个解决方案,需要使用store_result()函数将返回的行(从select查询)传输到我不知道的位置,但首先传输结果,然后检查行数似乎是不必要的,甚至是昂贵的 例如 $count值为0。但是在添加$stmt->store_result()之后;对于上面的代码,它是有效的 $sql = "SELECT * FROM login_info WHERE user_id=? AND password=?"; //Prepare stateme

因此,在苦苦挣扎了一段时间后,我找到了一个解决方案,需要使用store_result()函数将返回的行(从select查询)传输到我不知道的位置,但首先传输结果,然后检查行数似乎是不必要的,甚至是昂贵的

例如

$count值为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。

因为默认情况下准备好的查询。和num_行对于非缓冲查询不可用

我还要指出,查询返回的行数基本上是无用的。每当你认为你需要它的时候,你可能会发现你已经拥有了你所需要的信息。更不用说这个数字如果经常被误用,对服务器造成了一些严重的伤害。因此,num_行几乎没有任何用处


例如,在您的例子中,显然您不需要返回的行数,而只需要一个标志,无论您的查询是否返回任何内容。你已经有很多这样的旗帜了。例如,
fetch()
的结果或获取的数据本身

因为默认情况下准备好的查询。和num_行对于非缓冲查询不可用

我还要指出,查询返回的行数基本上是无用的。每当你认为你需要它的时候,你可能会发现你已经拥有了你所需要的信息。更不用说这个数字如果经常被误用,对服务器造成了一些严重的伤害。因此,num_行几乎没有任何用处


例如,在您的例子中,显然您不需要返回的行数,而只需要一个标志,无论您的查询是否返回任何内容。你已经有很多这样的旗帜了。例如,
fetch()
的结果或获取的数据本身

请参阅手册。这里有一个链接,仅仅为了得到一个计数而要求所有行没有多大意义。如果您只需要计数,请明确要求它
选择计数(*)作为总数…
。如果您确实需要这些行,请在检索它们时进行计数。在你的情况下,为什么你首先需要一个计数?你希望有许多用户使用相同的用户名和密码吗?@lvaro González不,但我就是这样训练的,检查计数是否大于0,显然计数总是1。你的培训师是错的。请参考手册。这里有一个链接,仅仅为了得到一个计数而要求所有行没有多大意义。如果您只需要计数,请明确要求它
选择计数(*)作为总数…
。如果您确实需要这些行,请在检索它们时进行计数。在你的情况下,为什么你首先需要一个计数?你希望有许多用户使用相同的用户名和密码吗?@lvaro González不,但这就是我接受培训的方式,检查计数是否大于0,显然计数将始终为1。你的培训师错了。对不起,我恐怕我不懂。你能告诉我为什么会这样吗?我刚刚更新了我的答案。无论如何,作为一个noob,你应该退出mysqli,开始PDO。@你的常识是行数真的没用吗?如何在不检索行计数的情况下对结果进行分页?还有别的办法吗?只是好奇……对不起,恐怕我不明白。你能告诉我为什么会这样吗?我刚刚更新了我的答案。无论如何,作为一个noob,你应该退出mysqli,开始PDO。@你的常识是行数真的没用吗?如何在不检索行计数的情况下对结果进行分页?还有别的办法吗?只是好奇。。。
$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;