2013-05-18 211 views
-2

我試圖退出此外觀,所以我的腳本可以發佈到Wordpress.com博客。但是,即使我嘗試使用break,在if語句中,循環繼續。爲什麼不會退出while循環?

此功能啓動腳本和基本處理髮帖:

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'; 
} 
} 

該函數從數據庫中的每個doesARticleExist時間(抓住文章)返回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.如果是,則返回1.基本上,該腳本基本上從數據庫中獲取文章。獲取文章後,它會檢查該文章/網址組合是否存在於同一數據庫的另一個表中。如果它不存在,我希望它發佈到WordPress的博客,然後打破循環,所以它不會再發布。

唯一的問題是它甚至不會退出循環。是否因爲存在的值沒有被傳遞?

回答

3

不要使用break。 使用此

$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'; 
} 
6

使用==進行比較。你正在做的是將0分配給$exist,這總是會使if語句失敗。

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資源。

(我不能測試此刻的代碼,所以道歉,如果它不工作或做什麼,你就需要正確的開箱)

希望它能幫助:)