如何选择启动mysql_fetch_row的位置?

时间:2017-02-19 02:47:43

标签: php mysql

我的目标是查询数据库并在两个文章容器之间平均分配结果。在两个容器中调用该函数并运行一个块(if或else)并输出结果。

该函数使用一个静态计数器,并在其调用结束时递增,以便下一个调用激活第二个部分。

由于我希望两个容器分开接近,我使用mysql_num_rows($ result)来查找总行数,然后将其除以2并将其四舍五入为变量$ halfWay。 for循环在if块中运行,直到增量小于一半。它递增$ counter并结束。

在第二次调用时,运行else块并启动for循环。这是我的问题所在。目前正如

$row = mysql_fetch_row($result)

重新开始。我想知道是否有办法选择提取开始的位置,或者我是否最好完全取出一次然后输出数据?以下是代码。

//This function will attempt to split the faq query into two containers
function faqQuery() {
$query  = "SELECT questionPosition, questionText, answerText
           FROM faqPage
           ORDER BY questionPosition";

$result = mysql_query($query)
or
die ("<b>Query Failed</b><br />$query<br />" . mysql_error());

/ * $ numRows用于捕获查询中的问题/答案对。* /

$numRows    = mysql_num_rows($result);

/ * $ halfWay用于查找问题/答案的中位数

pairs to near evenly split the number between two containers*/
$halfWay    = round($numRows/2);

/ *此静态计数器用于跟踪对函数的调用次数。* /

static $counter = 0;  

//The first IF block generates the FAQ for div 1
if ($counter == 0) {
    for ($i=0; $i<$halfWay; $i++) {
        $row = mysql_fetch_row($result);
        $questionPosition   = $row[0];
        $questionText       = $row[1];
        $answerText     = $row[2];

    echo "<p class=\"faqText\">$questionText<br /><br />\n";
    echo "$answerText</p>\n";
    } //end For
//The ELSE block generates the FAQ for div 2
} else {
    for ($i=$halfWay; $i<$numRows; $i++) {
        $row = mysql_fetch_row($result);
        $questionPosition   = $row[0];
        $questionText       = $row[1];
        $answerText     = $row[2];

    echo "<p class=\"faqText\">$questionText<br /><br />\n";
    echo "$answerText</p>\n";
    } //End for
}//End else
$counter++; //Increment counter at the end of the function.
}//End function faqQuery();

1 个答案:

答案 0 :(得分:0)

您可以将它们全部取出并根据需要进行交错,只要您确信记录始终适合内存,这就很好。如果你不确定可能有多少行,那可能是几千或几百万,你会想要更加谨慎。

增量方法使用SELECT上的LIMITOFFSET子句来更好地确定您想要的范围。例如,要获取前50个匹配项:

SELECT ... FROM ... LIMIT 50

接下来的50:

SELECT ... FROM ... LIMIT 50 OFFSET 50

请记住,非常高的偏移值可能会严重拖累性能,因此请仔细测试,但这是分页的基础。