MySQLi SELECT 语句需要 LIMIT

MySQLi SELECT statement requires LIMIT

提问人:Cruzer 提问时间:1/12/2021 最后编辑:RiggsFollyCruzer 更新时间:1/12/2021 访问量:241

问:

我正在尝试显示数据库表中 6 列的列表。此表恰好有 30,000 多条记录。我过去使用的方法有效,但这次列表以 10,939 条记录结束,除非我在行中添加 LIMIT 子句,否则根本不会显示。

表名是 phpbb_users,我排序的列是 username。目标是显示每个人的列表,显示大约 8 个其他数据字段。 如果我使用此代码:

$sql = "SELECT * FROM phpbb_users ORDER BY username";
$result = $conn->query($sql);

然后跟着通常的 while ($row = $result->fetch_assoc()) 的东西,它显示查询失败且没有显示列表的每一行。

如果我将代码更改为:

$sql = "SELECT * FROM phpbb_users ORDER BY username LIMIT 10000";

此时将显示该列表,但仅显示前 10,000 条记录。

在MySQLi SELECT查询中可以读取的记录数量是否有某种限制?当我运行 PHP 5.6 和 MySQL 时,我没有遇到这个问题,但我刚刚升级到 PHP 7.2 和 MySQLi,新代码的工作方式不同。

php select mysqli 限制

评论

0赞 Alon Eitan 1/12/2021
使用分页。
1赞 RiggsFolly 1/12/2021
使用分页,谁实际上会查看网页上的 10,000+ 行
1赞 CBroe 1/12/2021
我怀疑它完全无声地失败了。因此,与其问“有什么东西吗......”,不如去弄清楚实际的错误是什么。
0赞 RiggsFolly 1/12/2021
很高兴知道错误消息,您是否检查了错误日志中的错误消息
1赞 RiggsFolly 1/12/2021
然后,查看发生实际错误的位置周围的代码会很有用。我最初的赌注是内存限制被打破

答:

0赞 Cruzer 1/12/2021 #1

我确实检查了 FileZilla 中的error_log。这似乎是一个内存限制。

[2021 年 1 月 12 日 13:14:12 UTC]PHP 致命错误:在第 202 行的 /home/tiffinrv/public_html/staff/member_search.php 中允许的内存大小为 33554432 字节耗尽(尝试分配 39828320 字节)

过去,管理员会显示列表并使用 CTRL-F 查找他们想要的记录。我计划编写一些代码,通过使用 SELECT 和 INNER JOIN 从两个表访问该信息来简化操作,但首先需要了解为什么它不再有效。但接下来,我将不得不弄清楚如何处理内存限制。它在升级之前工作正常,但似乎较新的版本有更多的开销,并且为此留下的内存更少。希望在服务器上有足够的RAM,并且可以更好地配置/分配它。

我注意到日志中的另一组错误。

[2021 年 1 月 12 日 13:14:11 UTC]PHP 警告:在第 54 行的 /home/tiffinrv/public_html/staff/member_search.php 中使用未定义的常量 localhost - 假定为“localhost”(这将在未来版本的 PHP 中抛出错误)

我已为数据库连接中使用的变量分配了值。它和我过去一样工作得很好,但这个错误警告了未来的问题。根据我收集到的信息,我可能需要定义它们,例如 define('USERNAME','myname;');而不仅仅是建立值,例如 $username = 'myname';以防止将来的升级出现问题?

0赞 Cruzer 1/12/2021 #2

我能够在WHM中提高内存限制,现在我的内存错误消息消失了。但是,如果我在查询中使用 LIMIT 10,000,则列表会显示 10,000 条记录。但是,如果我将限制提高到 20000,或者完全删除 LIMIT,则列表将停止在大约 5,000 条记录,但每次运行它时,实际计数都会有所不同。

评论

0赞 Selim Acar 1/13/2021
您绝对应该避免加载数据库中的所有用户记录。相反,仅加载记录的子集,并将其显示给用户。例如,100 条记录?然后通过分页加载其他记录。对于搜索,您可以使用输入字段。用户在用户表中输入要搜索的文本。您可以通过 AJAX 请求将此搜索文本发送到后端。搜索发生在您的数据库中,而不是在前端。这样效率要高得多。