0

我正在使用一个非常大的数据库,但我还不太习惯。我需要循环浏览 1,400 个结果(定期添加更多结果)并根据每个结果运行函数(如果满足条件)。

这是我的代码的骨架:

$blogs = $wpdb->get_results( 
    "SELECT blog_id,path FROM {$wpdb->blogs} 
    WHERE blog_id != {$wpdb->blogid} 
    AND site_id = '{$wpdb->siteid}' 
    AND spam = '0' 
    AND deleted = '0' 
    AND archived = '0' 
    order by blog_id", ARRAY_A
);

然后我对它们运行一个 foreach 以获取一些数据(特别是博客名称)

foreach( $blogs as $blog ) : 
    switch_to_blog( $blog[ 'blog_id' ] );
    if(strpos(strtolower($blog_details->blogname), strtolower($_GET['squery'])) !== false){
    //Show the site's title and link to the site
}

结束;

基本上,在第一部分中,我获取了所有 1400 个结果,这并没有多大作用,请给我所有活动博客的 ID(这就是该数据库表中的所有内容)。

在第二部分中,我运行一个 wordpress 函数来获取博客的名称并将其显示在列表中,前提是用户查询在博客的名称中。(我逃避输入,不用担心)。

有人说要使用类似的东西:

...
AND archived = '0'
LIMIT {$offset},20
order by blog_id", ARRAY_A
...

这可能有效,但它只返回 20 个结果。如果我需要 end 函数在结果 #17 和 #1,111 上运行,只有 #17 会出现?

所以我的最终问题是:

有没有办法让“20 ~limit”部分循环浏览所有数据库条目?没有限制的内存使用量约为 200MB。如果我可以一次将其限制为 20 个,但会自动循环遍历它们,它(应该??)会大大减少我的内存使用量,对吗?

现在的最终结果是:

  • 得到 1400 个结果,运行函数,在列表中显示 X 博客名称。

我想要的是(除非 PHP-MySQL 有更好的方法来减少内存开销)是:

  • 得到 20 个结果,运行函数,在列表中显示 X 个博客名称。得到 20
  • 更多结果 (21-40),运行函数,在列表中显示 X 博客名称。
  • 再获得 20 个结果 (41-60),运行函数,在 a 中显示 X 博客名称
  • 列表。ETC...

所有这些都不需要用户的更多输入。只是让它们自动循环。

4

2 回答 2

0

您可以简单地更改查询并在其中添加一个带有限制的额外 WHERE 吗?

例如,如果我正确理解您的代码:

$blogs = $wpdb->get_results( 
    "SELECT blog_id,path FROM {$wpdb->blogs} 
    WHERE blog_id != {$wpdb->blogid} 
    AND site_id = '{$wpdb->siteid}' 
    AND spam = '0' 
    AND deleted = '0' 
    AND archived = '0' 
    AND `field containing the blog name` LIKE '%".$_GET['squery']."%'
    LIMIT 20  #you can add the offset if you paginate the results
    order by blog_id", ARRAY_A
);

您可能必须对不同的表执行 JOIN 才能获取博客名称。

不知道您的数据库结构,我只能尝试查询:

$blogs = $wpdb->get_results( 
    "SELECT b.blog_id,b.path
    FROM {$wpdb->blogs} `b`
       LEFT JOIN table_with_blog_name db ON db.id = b.blog_id
    WHERE b.blog_id != {$wpdb->blogid} 
       AND b.site_id = '{$wpdb->siteid}' 
       AND b.spam = '0' 
       AND b.deleted = '0' 
       AND b.archived = '0' 
       AND db.field_with_blog_name LIKE '%".$_GET['squery']."%'
    LIMIT 20  #you can add the offset if you paginate the results
    ORDER BY b.blog_id", ARRAY_A
);

别忘了先$_GET['squery']消毒

于 2013-05-07T22:54:27.113 回答
0

我不太清楚你想做什么,但如果你想做一些事情,比如向用户显示博客列表,但每个请求限制为 20 个条目。您可以使用来自客户端的 AJAX 请求,例如:

客户端加载带有空列表的页面 -> XHR -> 加载前 20 个条目

客户端滚动列表 -> XHR -> 再加载 20 个条目

升级版:

首先,您必须知道最大单个条目大小,例如,如果它是 1MB - 您每次最多可以加载 200 个条目(内存限制为 200MB)。 向客户端刷新数据不是必需的,但是如果您的页面将生成很长时间,它将按部分向客户端发送数据。

像这样的东西:

$i=0;
while(!$end){
  $q = query('
  ...
  AND archived = '0'
  LIMIT {$i*200},{$i*200+200}
  order by blog_id", ARRAY_A
  ...
  ');
  echo fetch_my_query($q); //fetch and echo data
  $i++;
  if(mysql_num_rows($q) != 200)$end = True; //Got all entries in DB
  flush();
}
于 2013-05-07T22:24:43.513 回答