查询使用 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()