我正在使用一个非常大的数据库,我还不太习惯。我需要循环1,400个结果(更多是定期添加)并根据每个结果运行函数IF标准。
这是我的代码的骨头:
$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
}
endforeach;
基本上,在第一部分中,我抓住了所有1400个结果,这没有多少购买给我所有活动博客的ID(这是关于该数据库表中的所有内容)。
在第二部分中,我运行一个wordpress函数来获取博客的名称,并仅在用户查询的博客名称中将其显示在列表中。 (我逃避输入,不用担心)。
有人说使用类似的东西:
...
AND archived = '0'
LIMIT {$offset},20
order by blog_id", ARRAY_A
...
这可能有用,但它只返回20个结果。如果我需要在结果#17和#1,111上运行结束函数,那么只有#17会显示?
所以我的终极问题是:
有没有办法让“20~limit”部分循环遍历所有数据库条目?不限制它的内存使用量约为200MB。如果我可以一次将它限制为20,但是所有这些都自动循环,它(应该??)大大减少了我的内存使用量,对吗?
现在的最终结果是:
我喜欢什么(除非在PHP-MySQL中有更好的方法来减少内存开支):
没有来自用户的更多输入。只是让它们自动循环。
答案 0 :(得分:0)
我不太明白你想做什么,但如果你想做一些事情,比如向用户展示博客列表,但每个请求限制20个条目。您可以使用来自客户端的AJAX请求,例如:
客户端加载包含空列表的页面 - > XHR - >加载前20个条目
客户滚动列表 - > XHR - >再加载20个条目
<强> UPD:强>
首先,您必须知道最大单个条目大小,例如如果它是1MB - 每次最多可以加载200个条目(内存限制为200MB)。 Flushing数据到客户端并不是必需的,但如果您的页面会生成很长一段时间,它会将数据发送到客户端。
这样的事情:
$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();
}
答案 1 :(得分: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
);
您可能需要联系另一个表来获取blogname。
不知道您的数据库结构我只能尝试查询:
$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']
第一个