查询使用 MYSQLI_USE_RESULT 在特定结果大小后不返回任何内容 [重复]

Posted

技术标签:

【中文标题】查询使用 MYSQLI_USE_RESULT 在特定结果大小后不返回任何内容 [重复]【英文标题】:query returns nothing after a particular result size using MYSQLI_USE_RESULT [duplicate] 【发布时间】:2016-06-11 18:51:26 【问题描述】:

我已经阅读了更大的结果集,我在查询时必须使用 mysql_USE_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.net/manual/en/mysqli.error.php 和 php.net/manual/en/function.error-reporting.php 并将其应用于您的代码,如果有错误,请检查。 您似乎在代码上使用用户定义的查询。也许您的问题与未正确转义您的查询有关。你能检查一下吗? 我已经确认生成的查询没有错误。我只是增加了 WHERE 标准的界限,在某个点上我得到了 0 个结果。完全相同的查询可以从 phpmyAdmin 执行。我拨回标准,我再次得到结果。 WHERE 子句选择特定日期内的条目。当我扩大这个差距时(无论具体间隔如何)就是问题发生的时候。 “我已经确认生成的查询没有错误” - 然后添加类似 if ( !($res instanceof mysqli_result) ) trigger_error('ouch! ouch! ouch!', E_USER_ERROR); 的内容时无需担心;-) @VolkerK,我添加了您建议的代码。 trigger_error 不会发生。我只是没有得到任何回应。 :( 。澄清一下,我什至没有得到空结果( [] ),但什么也没有。 【参考方案1】:

编辑您的php.ini,让您的服务器使用更多内存。将memory_limit =128M 更改为您想要的值或将ini_set('memory_limit', '-1'); 添加到您的php 代码中,但这会告诉服务器使用它想要的所有内存。

【讨论】:

每行结果是 您使用 MYSQLI_USE_RESULT 完全是因为您的 php 实例的内存中没有完整的结果集。另一方面,您仍在获取所有记录 将它们存储在数组 $rows 中 - 这使得 MYSQLI_USE_RESULT 非常多余..... @VolkerK 我添加了 MYSQLI_USE_RESULT 以响应当查询结果大小增加时没有返回的行为。也许这与 MYSQLI_USE_RESULT 无关。有没有办法确定查询使用了多少内存? 如果 memory_limit 是/是问题,它将在 php error log 中显示为 Fatal error: Allowed memory size of ... bytes exhausted (tried to allocate ... bytes)。使用mysqlnd 时,记录的“原始”内存将计入memory_limit,如果使用libmysql,则不会(但$rows[]=$r 仍然如此)。【参考方案2】:

尝试使用这个:

<?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()。在相同 if 函数的 else 语句中,您什么也没放。代码的底部需要在 else 语句中才能工作。

试试看。

【讨论】:

我也试过了——把代码放在else中。这没什么区别。连接成功后, else 子句和剩下的任何内容都会被执行。在连接失败时,die 函数就像返回一样,没有其他任何东西被执行。【参考方案3】:

尝试替换这个

while ($r = mysqli_fetch_assoc($res)) 
    $rows[] = $r;   

关于这个

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

您使用MYSQL_USE_RESULT 从表中接收所有行?

【讨论】:

【参考方案4】:

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

真正的问题是数据库中存储的数据中偶尔会有特殊字符。出于某种原因(也许有人可以解释)PHP 刚刚停止——没有错误,遇到特殊字符时也没有。带有特殊字符的字段有排序规则:utf8_general_ci。我从没想过这会是一个问题……也许有人也可以解释一下。

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

【讨论】:

以上是关于查询使用 MYSQLI_USE_RESULT 在特定结果大小后不返回任何内容 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别

mysqli_store_result() 与 mysqli_use_result()

TiDB在特来电的探索

RabbitMQ在特来电的深度应用

如何检查用户是不是在共享频道中写消息并告诉他或她在特定于机器人的频道中写

流计算及在特来电监控引擎中的实践