我正试图在外面退出,所以我的脚本可以发布到Wordpress.com博客。但是,即使我尝试使用休息;在if语句中,循环继续。
此功能启动脚本并基本上处理发布:
function getFlogArticle($url, $mail) {
list($id, $title, $content, $tags) = getNewArticle();
while ($id != 0)
{
$start = getTime();
doesArticleExist($url, $id);
if ($exist = 0)
{
wordpress($title, $content, $mail, $tags, $url, $id);
break;
$end = getTime();
echo '<strong>Exist While</strong>: '.round($end - $start,4).' seconds<br />';
}
list($id, $title, $content, $tags) = getNewArticle();
echo 'I cant stop';
}
}
每次doARticleExist()返回1:
时,此函数都会从数据库中获取文章function getNewArticle() {
$start = getTime();
global $db;
$count = $db->query("SELECT * FROM flog_articles");
$count = $count->num_rows;
$offset = mt_rand(0, $count - 1);
$stmt = "SELECT * FROM flog_articles LIMIT 1 OFFSET $offset";
$result = $db->query($stmt);
$post = $result->fetch_array(MYSQLI_ASSOC);
return array($post['article_id'], $post['article_title'], $post['article_content'], $post['article_keyword']);
$end = getTime();
echo '<strong>getNewArticle()</strong>: '.round($end - $start,4).' seconds<br />';
}
此脚本会检查文章是否存在于数据库中。如果没有,则返回0.如果是,则返回1.
function doesArticleExist($url, $id) {
$start = getTime();
global $db;
$count = $db->query("SELECT * FROM flog_posted WHERE http = $url AND article_id = $id");
$count = $count->num_rows;
if ($count > 0) {
$exist = 1;
return $exist;
} else{
$exist = 0;
return $exist;
}
$end = getTime();
echo '<strong>doesArticleExist()</strong>: '.round($end - $start,4).' seconds<br />';
}
基本上,脚本从数据库中获取文章。获得文章后,它会检查该文章/ url组合是否存在于同一数据库的另一个表中。如果它不存在,我希望它发布到wordpress博客,然后突破循环,所以它不会再发布。
唯一的问题是它甚至不会退出循环。是因为存在的价值没有通过吗?
答案 0 :(得分:6)
使用==
进行比较。您正在做的是将0
分配给$exist
,这将始终使if
语句失败。
答案 1 :(得分:3)
不要使用休息。 使用此
$willStop=false;
while (($id != 0)&&(!$willStop))
{
$start = getTime();
doesArticleExist($url, $id);
if ($exist == 0)
{
wordpress($title, $content, $mail, $tags, $url, $id);
$willStop=true;
$end = getTime();
echo '<strong>Exist While</strong>: '.round($end - $start,4).' seconds<br />';
}
list($id, $title, $content, $tags) = getNewArticle();
echo 'I cant stop';
}
答案 2 :(得分:0)
因此,您的代码中有许多内容可以改进,请参阅下面的代码作为建议:
function getFlogArticles($url, $mail) {
$list = getNewArticles();
foreach($list as $article_id => $article) {
wordpress($article['title'],$article['content'],$mail,$article['tags'],$url,$article_id);
}
}
function getNewArticles($url) {
global $db;
$stmt = "SELECT article_id AS id,article_title AS title,article_content AS content,article_keyword AS tags FROM flog_articles";
$result = $db->query($stmt);
$articles = array();
while($row = $result->fetch_array(MYSQLI_ASSOC)) {
$articles[$row['id']] = $row;
}
if(empty($articles)) return array();
$idlist = implode(',',array_keys($articles));
//$url should be escaped as per your database type (eg, mysql_real_escape_string)
$exists = array();
$result = $db->query("SELECT article_id AS id FROM flog_posted WHERE http = '$url' AND article_id IN ($idlist)");
while($row = $result->fetch_array(MYSQLI_ASSOC)) {
$exists[$row['id']] = 1;
}
$articles = array_intersect_key($articles,$exists);
return $articles;
}
有许多改进,特别是,您只需要对数据库进行2次调用即可返回所需的所有行,而不是针对您希望处理的每个新有效文章进行3次查询。
如果你的数据库每次运行返回数千行,那么你最好在某种程度上按照原来的方式进行操作,但根据我的经验,运行数百个非常小的查询的开销更多CPU比运行一两个更大的查询要贵。
(我目前无法测试代码,如果它不起作用或者你需要它完全按照开箱即用的方式表示道歉)
希望有所帮助:)