2013-05-18 3 views
-2

나는 외모를 털어 놓고 나가기 위해이 스크립트를 Wordpress.com 블로그에 올릴 수 있습니다. 그러나, 심지어 내가 휴식을 사용하려고 할 때; 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을 반환합니다.

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의 블로그에 게시하고, 다시 루프에서 빠져 나와서 다시 게시하지 않기를 바란다.

유일한 문제는 루프를 종료하지 않는다는 것입니다. 존재 가치가 전달되지 않기 때문입니까?

답변

3

휴식을 사용하지 마십시오. 특히, 그래도 당신 ',

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

개선의 숫자가있다 : 그래서 개선 할 수있는 코드에서 여러 가지있어이

$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을 에게 할당하는 것인데, 항상 if 문장이 실패합니다.

0

사용은 제안으로 아래의 코드를 참조 처리하고자하는 새로운 유효한 기사 각각에 대해 3 개의 쿼리 대신 필요한 모든 행을 반환하기 위해 데이터베이스를 2 번 호출해야합니다.

데이터베이스가 실행 당 수천 개의 행을 반환하는 경우 원래 어느 정도까지 수행하는 것이 더 좋을 수 있지만 매우 작은 쿼리 수백 개를 실행하는 오버 헤드는 내 경험에 따르면, 하나 또는 두 개의 큰 쿼리를 실행하는 것보다 CPU가 많이 듭니다.

(나는 순간에 코드를 테스트 할 수 없습니다 사과 그래서이 일을하거나 바로 밖으로 상자에 꼭 필요한 일을하지 않는 경우)

그것을 희망 도움이 :)

관련 문제