2011-05-26 32 views
1

我有一個簡單的PHP文件,它從MySQL數據庫中取出行,刪除特定部分的信息並在不同部分吐出。每個數據庫條目都有一個時間戳應用於它,我用它來排序。將時間戳和實際內容放入$ sortholder變量中時,會用「#」字符分隔。經過排序後,我使用strstr刪除無用的時間字符到#,然後用substr刪除#本身。由於某些數據庫條目實際上並沒有時間戳,我想從列表中刪除這些條目。要做到這一點,我只是做了一個臨時變量來保存$ sortholder的substr從0-2,並檢查是否($ temp!=「0#」)。簡單的php條件語句後很長的延遲

該聲明可以正常工作並提供正確的輸出,但由於某種原因,它在處理之前會導致延遲最多1分鐘。如果我刪除了「if($ temp!=」0#「)」,它會立即生效。爲什麼這樣一個簡單的條件會導致如此長的延遲?

<?php 
    include("dbsetup.php"); 
    $result = mysql_list_tables($dbname); 
    $x=0; 

    if (!$result) 
    { 
    echo "DB Error, could not list tables\n"; 
    echo 'MySQL Error: ' . mysql_error(); 
    exit; 
    } 

    while ($row = mysql_fetch_row($result)) 
    { 
    // added code to use the tablename and select all records from that table 
    $sql="select * from " . $row[0]; 
    $result2 = mysql_query($sql) or die ('SQL problem selecting from table'); 
    if (mysql_num_rows($result2) >= 1) 
    { 
     while ($row2 = mysql_fetch_row($result2)) 
     { 
     for ($i=7; $i<mysql_num_fields($result2); $i+=7,$x++) 
     { 
      $sortholder[$x] = $row2[$i+1]."#<b>".$row2[$i-3]. 
          ":</b> <br><br><br>".$row2[$i]."<br><br>"; 
     } 
     } 
     sort($sortholder); 

     while ($x >= 0) 
     { 
     $temp = substr($sortholder[$x], 0, 2); 
     if ($temp != "0#") 
     { 
      $tempstr = strstr($sortholder[$x], "#"); 
      echo substr($tempstr, 1); 
      echo ("<div id=\"bookbar\"></div><br><br>"); 
      $x--; 
     } 
     } 
    } else { 
     echo ("Guest book empty"); 
    } 
    mysql_free_result($result2); 
    } 

    mysql_free_result($result); 
?> 
+3

您知道您正在處理數據庫中* all *表的* all *條目嗎?這本身非常浪費。如果您只想要數據庫的一部分,請使用SQL WHERE語句在數據庫**中過濾**。排序也應該由數據庫來完成,而不是在事後使用PHP。我建議你先閱讀一本關於SQL的書。 – deceze 2011-05-26 08:29:08

+0

你聽說過[數據庫規範化](http://en.wikipedia.org/wiki/Database_normalization) – diEcho 2011-05-26 08:29:49

+0

是的,我意識到這是糟糕的編程......我現在正在閱讀這個主題。至少目前來看,它不像看起來那樣「浪費」。無論如何,只有一張桌子可以解析(而且在那個桌子上還是一個相當小的桌子)。 – 2011-05-26 08:41:44

回答

4

我認爲,這並不是說需要時間的條件本身,但如果temp != "O#"

所以,如果$temp = substr($sortholder[$x], 0, 2);$x--不執行實際上等於"0#",它會在一個無限循環去。

+0

哇,我很棒......當我忽略睡眠時會發生什麼 - 我會在5分鐘內接受答案,一旦它讓我。 – 2011-05-26 08:32:41

+0

我本該期待一個無限循環,而不是很長的延遲。 – 2011-05-26 08:52:30

1

這是因爲這一行 $ x--; 大部分時間都沒有運行。由於程序僅在$ x < 0和$ x只有在存在時間戳時遞減才退出循環。

所以,顯然有很多沒有時間戳的字段,因此程序在實際進入它並遞減循環之前多次評估if語句。