2010-03-11 98 views
0

什麼是導致我的PHP代碼凍結?我知道這是while循環的原因,但我有$ max_threads--;最後它不應該這樣做。爲什麼我的PHP腳本被凍結?

<html> 
    <head> 
     <?php 
      $db = mysql_connect("host","name","pass") or die("Can't connect to host"); 
      mysql_select_db("dbname",$db) or die("Can't connect to DB"); 

      $sql_result = mysql_query("SELECT MAX(Thread) FROM test_posts", $db); 

      $rs = mysql_fetch_row($sql_result); 

      $max_threads = $rs[0]; 

      $board = $_GET['board']; 
     ?> 



    </head> 

    <body> 


     <?php 


      While($max_threads >= 0) 
      { 
       $sql_result = mysql_query("SELECT MIN(ID) FROM test_posts WHERE Thread=".$max_threads."", $db); 
       $rs = mysql_fetch_row($sql_result); 

       $sql_result = mysql_query("SELECT post FROM test_posts WHERE ID=".$rs[0]."", $db); 
       $post = mysql_fetch_row($sql_result); 

       $sql_result = mysql_query("SELECT name FROM test_posts WHERE ID=".$rs[0]."", $db); 
       $name = mysql_fetch_row($sql_result); 

       $sql_result = mysql_query("SELECT trip FROM test_posts WHERE ID=".$rs[0]."", $db); 
       $trip = mysql_fetch_row($sql_result); 

       if(!empty($post)) 
        echo'<div class="postbox"><h4>'.$name[0].'['.$trip[0].']</h4><hr />' . $post[0] . '<br /><hr />[<a href="http://prime.programming-designs.com/test_forum/viewthread.php?thread='.$max_threads.'">Reply</a>]</div>'; 

       $max_threads--; 
      } 

     ?> 
    </body> 
</html> 
+3

只是調試或回聲$ max_threads的前後循環內進行確認或排除它導致問題的原因。 – 2010-03-11 17:06:55

+1

呃,兩點建議你:1。使用'LIMIT'在SQL語句和2.不要做4'SELECT'那時你可以做一個。因爲它的頁面加載之前崩潰 – Felix 2010-03-11 17:08:44

+0

不能呼應max_threads的。 – William 2010-03-11 17:21:38

回答

1

我在想這是因爲你每次循環觸及sql數據庫4次。有什麼辦法可以一次全部訪問它,然後解析來自那裏的傳入數據?

$dbsql = 'SELECT * FROM my_database'; 
$result = mysql_query($dbsql); 

while($row = mysql_fetch_array($result)) { 
    // Parse information here, rather than 
    // accessing the database for individual variables... 
} 

就是這樣的。

更新:

比我已經說過其他(和你被解僱)我看到的是一些在這裏&有編碼的怪癖:

這部分沒有迴音之間的空間和字符串。 'hr'元素沒有起始括號。

echo '<div class="postbox"><h4>'.$name[0].'['.$trip[0].']</h4><hr>' . $post[0] . '<br /><hr />[<a href="http://prime.programming-designs.com/test_forum/viewthread.php?thread='.$max_threads.'">Reply</a>]</div>'; 

'while'不應該大寫。

while($max_threads >= 0) 

同樣,乾淨的代碼是一個很好的開始,但這就是我親身所見。最近我剛剛清理了自己的網站,這個網站正在崩潰IE(而沒有其他瀏覽器),只是因爲它有太多的標記錯誤。希望能幫助到你。

+0

也許這會在以後出現問題,但現在它只有兩個線程完全凍結。 – William 2010-03-11 17:04:34

+2

@William:真的,這是一個問題,現在,即使它不是凍結的原因。當你只需要一個查詢時發出4個查詢是矯枉過正的,並且使代碼更不可讀。 – DisgruntledGoat 2010-03-11 17:10:31

+0

不,這不是一個問題,因爲現在它並不重要,如果那該死的東西被凍結和加載頁面的瀏覽器崩潰,咄。 – William 2010-03-11 17:21:10

0

也許你可以驅散調用在揭掉代碼這個簡單的功能:

function of($required) 
{ 
    $args = func_get_args(); 
    var_dump($args); 
    ob_flush(); 
    flush(); 
} 
of(__LINE__, $max_threads); 

您也可以使用這樣的事情對於你的查詢:

function mydb_query($query, $db = null) 
{ 
    $args = func_get_args(); 
    $result = call_user_func_array('mysql_query', $args); 
    if (!$result) { 
     of(array(__FUNCTION__), mysql_error(), $sql); 
     //return something else? 
    } 
    return $result; 
} 
$result = mydb_query("SELECT post, name, trip FROM test_posts WHERE ID = (SELECT MIN(ID) FROM test_posts WHERE Thread={$max_threads})", $db); 

您使用mysqli/PDO /框架支持準備好的陳述。

2

首先,我建議完全擺脫無關的HTML位。然後,逐行建立你的代碼,看看你是否能找到違規行。因此,編寫一個只連接到數據庫的腳本,看看會發生什麼。

如果發現例如,該代碼...

<?php 
    $db = mysql_connect("host","name","pass") or die("Can't connect to host"); 
    mysql_select_db("dbname",$db) or die("Can't connect to DB"); 
?> 

...導致自身凍結,那麼就可以很容易地與MySQL服務器的問題。

但是,如果瀏覽器本身崩潰,這聽起來像你的系統,而不是東西,PHP或MySQL正在做的一個問題...

2

嘗試,而不是那些1 +(4這1個SQL查詢* N)查詢:

SELECT MIN(ID), post, name, trip FROM test_posts GROUP BY Thread 

也許LIMIT 50(或任何最大線程數在年底返回),以及排名,這可能是大量的數據。

您可以通過while ($row = mysql_fetch_row($sql_result)) { /* echo(...); */ }來遍歷此查詢的結果而不是$max_threads和所有額外的數據庫調用。

不知道這是究竟是是否與你想要獲取但不知道更多關於數據(獲取論壇中每個線程的根帖?)相同,但它應該非常接近。

(PS:如果這是一個線程化的2ch風格的論壇協議,我不確定這是一個理想的db設計,親子adjacency list可能比維護每個線程的數量要好。 )

相關問題