【问题标题】:MySQLi SELECT statement requires LIMITMySQLi SELECT 语句需要 LIMIT
【发布时间】:2021-04-17 11:15:53
【问题描述】:

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

表名是 phpbb_users,我排序的列是用户名。目标是显示每个人的列表,显示大约 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,新代码的工作方式不同。

【问题讨论】:

  • 使用分页。
  • 使用分页,谁真的会在网页上查看 10,000+ 行
  • 我怀疑它完全没有声音。因此,与其问“有什么东西,那个……”,不如去弄清楚实际的错误是什么。
  • 很高兴知道错误消息,您是否检查过错误日志中的错误消息
  • 然后查看实际错误发生位置的代码会很有用。我最初的赌注是内存限制

标签: php select mysqli limit


【解决方案1】:

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

【讨论】:

  • 您应该绝对避免加载您在数据库中拥有的所有用户记录。而是仅加载记录的子集并向用户显示。例如 100 条记录?然后通过分页加载其他记录。对于搜索,您可以使用输入字段。用户在您的用户表中输入要搜索的文本。您可以通过 AJAX 请求将此搜索文本发送到您的后端。并且搜索发生在您的数据库中,而不是在前端。这样效率更高。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多