我有一个包含12000个产品的数据库。我有一个查询,可以在一个页面上显示大约3000个产品,并且需要一段时间才能显示。但是,在整个查询或循环结束后会显示数据。无论如何都要显示每个结果,因为它们被拉?以下是我的代码..
$result = mysql_query("SELECT title, model, description FROM products WHERE price > 500");
while($row = mysql_fetch_array($result)):
...
endwhile;
感谢任何帮助。感谢
答案 0 :(得分:2)
它被称为db的延迟加载。
如果我必须进行综合,基本上你LIMIT
查询一定数量的记录,必须从db中取出。一旦达到某些条件(分页更改,向下滚动等),您将触发一个将检索其他记录的ajax调用,依此类推。
答案 1 :(得分:1)
不推荐使用mysql扩展,最好切换到mysqli或pdo。但是因为无论api /模块都是同样的问题,现在让我们坚持使用mysql_ * ....
调用mysql_query(...)
时,只有在完整的结果集从MySQL服务器传输到php进程的内存后,函数才会返回。
请改用mysql_unbuffered_query(...)
:
<?php
$result = mysql_unbuffered_query("SELECT title, model, description FROM products WHERE price > 500");
while($row = mysql_fetch_array($result)):
...
// output
// maybe flush() or ob_flush() here...
endwhile;
解释了差异
您还必须牢记潜在的输出缓冲区:http://docs.php.net/flush和http://docs.php.net/ob_flush
对于html客户端/浏览器,您必须将部分数据放入可在所有数据发送之前呈现的结构中。所以,例如不固定的表很可能是次优的。见例如https://en.wikipedia.org/wiki/Incremental_rendering
答案 2 :(得分:0)
有很多变量可以达到这样的效果。
首先,php设置应该允许你使用输出缓冲(看一下output_buffering参数,也许是implicit_flush)。之后你应该使用flush()和/或ob_flush()
你应该考虑的另一件事是,浏览器本身并不总是允许你使用输出缓冲,它被称为“问题”。
对于查询本身,您可能想尝试使用mysql_unbuffered_query(或更好的MySQLi / PDO等价物)。
总而言之,在我看来,实现这种效果的最佳方法是使用ajax数据轮询。