PHP mysqli查询使用mysqli\u USE\u result在特定结果大小后不返回任何内容

PHP mysqli查询使用mysqli\u USE\u result在特定结果大小后不返回任何内容,php,mysql,mysqli,Php,Mysql,Mysqli,你好,友好的天才们! 我已经阅读了较大的结果集,在查询时我必须使用MYSQL\u use\u result选项。这是我做的。然而,下面的PHP页面是通过ajax访问的,一旦已知的结果数达到800,我将收到0个结果。在我达到这个阈值之前,查询执行得非常出色 所有查询在phpmyAdmin中都可以正常工作 我做错了什么 <?php $servername = "localhost"; $username = "user"; $password = "password"; $database

你好,友好的天才们! 我已经阅读了较大的结果集,在查询时我必须使用MYSQL\u use\u result选项。这是我做的。然而,下面的PHP页面是通过ajax访问的,一旦已知的结果数达到800,我将收到0个结果。在我达到这个阈值之前,查询执行得非常出色

所有查询在phpmyAdmin中都可以正常工作

我做错了什么

<?php

$servername = "localhost";
$username = "user";
$password = "password";
$database = "mydb";

$mypassword = "expectedPassword";

$receivedPassword =$_POST["pwd"];


if ($receivedPassword != $mypassword) {
    print "credential failure";
} else {

// Create connection
    $conn = new mysqli($servername, $username, $password, $database);
    $myquery =$_POST["query"];

// Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } else {

    }
    $res = $conn->query($myquery, MYSQLI_USE_RESULT);
    $rows = array();
    while ($r = mysqli_fetch_assoc($res)) {
        $rows[] = $r;   
    }
    $conn->close();
    print(json_encode($rows));       
}    
?>
编辑php.ini以让服务器使用更多内存。将memory_limit=128M更改为您所需的值,或添加ini_set'memory_limit','-1';但这将告诉服务器使用它想要的所有内存。

尝试使用以下方法:

<?php

$servername = "localhost";
$username = "user";
$password = "password";
$database = "mydb";

$mypassword = "expectedPassword";

$receivedPassword =$_POST["pwd"];


if ($receivedPassword != $mypassword) {
    print "credential failure";
} else {

// Create connection
    $conn = new mysqli($servername, $username, $password, $database);
    $myquery =$_POST["query"];

// Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } else {
      $res = $conn->query($myquery, MYSQLI_USE_RESULT);
      $rows = array();
      while ($r = mysqli_fetch_assoc($res)) {
        $rows[] = $r;   
      }
      $conn->close();
      print(json_encode($rows));       

    }

}    
?>
在//中,检查您放置的if函数的连接。如果$conn出错,则第一条语句为die。在同一函数的else语句中,如果没有输入任何内容。代码的底部需要在else语句中才能工作

试试看。

试着换掉这个

while ($r = mysqli_fetch_assoc($res)) {
    $rows[] = $r;   
}
关于这个

if ($result = $conn->store_result()) {
    while ($row = $result->fetch_assoc()) {
        $rows[] = $row; 
    }
    $result->free();
}

您使用MYSQL\u使用\u结果来接收表中的所有行吗

这与记忆无关。结果表明,较大的查询结果和失败之间的关系纯粹是统计上的

真正的问题是,数据库中存储的数据中偶尔会出现特殊字符。出于某种原因,也许有人可以解释PHP只是停止了,没有错误,遇到特殊字符时什么也没有。具有特殊字符的字段具有排序规则:utf8\U general\U ci。我从没想过这会是个问题。。。也许有人也能解释这一点


添加:mysqli_set_charset$conn,'utf8';在查询完全解决我的问题之前

请查阅以下链接,并将其应用于您的代码,检查是否有错误。您似乎正在对代码使用用户定义的查询。也许您的问题与没有正确地逃避查询有关。你能检查一下吗?我已经确认生成的查询没有错误。我只是增加了WHERE条件的界限,在某一点我得到了0个结果。从phpmyAdmin执行完全相同的查询。我拨回标准,然后再次得到结果。WHERE子句选择特定日期内的条目。当我不考虑具体的时间间隔而扩大这个差距时,就是问题发生的时候了。我已经确认生成的查询没有错误——那么在添加if之类的东西时就没有什么好担心的了$res instanceof mysqli_result{trigger_error'ouch!ouch!ouch!',E_USER_error;}-@沃克,我添加了你建议的代码。触发器错误不会发生。我没有得到任何回应。为了澄清,我甚至没有得到一个空的结果[],但什么也没有。每行结果都是<500字节的数据。在800个结果中,我要求提供400kB的信息。查询只是要求输入两个日期时间之间的条目。你认为它的开销真的超过了128M吗?我可以试一试。但是为什么phpMyAdmin仍然可以正常工作呢?您使用MYSQLI_USE_RESULT完全是因为php实例的内存中没有完整的结果集。另一方面,您仍在获取所有记录并将它们存储在数组$rows中-这使得MYSQLI_USE_RESULT非常多余….@VolkerK I添加了MYSQLI_USE_RESULT,以响应当查询结果变大时不返回任何内容的行为。也许这与MYSQLI_USE_结果无关。有没有一种方法可以确定一个查询使用了多少内存?如果内存限制是问题所在,它将在php中显示为类似致命错误的内容:允许的内存大小为。。。试图分配的字节数已用尽。。。字节。使用原始内存时,记录将计入内存限制,如果使用libmysql,则不会计入,但$rows[]=$r仍然会计入。我也尝试过将代码放入else中。这没什么区别。连接成功后,将执行else子句和剩下的任何内容。在连接失败时,die函数的作用类似于返回,并且不会执行任何其他操作。