-2

我正在尝试退出此内容,以便查看,以便我的脚本可以发布到 Wordpress.com 博客。但是,即使我尝试使用 break; 在 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'; 
}
}

每次 dosARticleExist() 返回 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 博客,然后跳出循环,所以它不会再次发布。

唯一的问题是它甚至没有退出循环。是因为没有传递存在的值吗?

4

3 回答 3

6

用于==比较。您正在做的是分配0$exist,这将始终使if语句失败。

于 2013-05-18T14:02:10.943 回答
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'; 
}
于 2013-05-18T14:04:26.647 回答
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 成本比运行一两个更大的查询。

(我目前无法测试代码,所以如果它不起作用或完全按照您的要求开箱即用,请道歉)

希望能帮助到你 :)

于 2013-05-18T15:22:07.387 回答