2014-03-12 125 views
0

我有一個工作腳本,用於選擇所有表中的圖像字段並在物理文件不存在時清空它們的值。優化PHP腳本

$query1 = "SELECT table_name,column_name 
      FROM information_schema.columns 
      WHERE table_schema='schemaname' AND column_name like '%image%' or column_name='video'"; 

$result1 = mysql_query($query1) or die(mysql_error() . " -- " . $query1); 

while($row1 = mysql_fetch_row($result1)){ 
    if (!strpos($row1[0],'backup') > 0){ 
      $sql = "Select COLUMN_NAME FROM information_schema.columns WHERE TABLE_NAME = '".$row1[0]."' AND EXTRA = 'auto_increment'"; 
      $resultcol = mysql_query($sql); 
      $rowcol = mysql_fetch_row($resultcol); 

    $query2 = "SELECT " . $row1[1] . ", " .$rowcol[0] . " 
       FROM " . $row1[0] . " 
       WHERE " . $row1[1] . " != '' AND " . $row1[1] . " IS NOT NULL 
       "; 
echo $query2 . "<br>"; 
    $result2 = mysql_query($query2) or die(mysql_error() . " -- " . $query2); 

    while ($rowdb = mysql_fetch_row($result2)){ 

     if (!strpos($rowdb[0],'facebook') > 0 && !file_exists($img_root.'/'.$rowdb[0])){ 


      $sql = "UPDATE ".$row1[0]." SET ". $row1[1] . " = '' WHERE " . $rowcol[0]. "= ".$rowdb[1]; 
      echo $sql . "<br><br>"; 
      $delete_count++; 
      //mysql_query("UPDATE ".$row1[0]." SET ". $row1[1] . " = '' WHERE id = ".$row1["id"]); 
     } 
    } 
    } 
} 

腳本工作正常,但需要時間,雖然,我不知道是否有一個更聰明的方式(更優化),以獲得相同的功能?謝謝

+0

http://codereview.stackexchange.com/ – j08691

+4

這個問題似乎是題外話,因爲它屬於爲http://代碼審查.stackexchange.com/ –

+0

您可以使用JOIN將前兩個查詢合併到一個查詢中。 – Barmar

回答

0

你有幾個選擇。

第一,恕我直言,最好的選擇 - 是使用ORM - 我推薦Idiorm,Doctrine或Propel。

然後,你可以使用通過類似(在idiorm)fetch_all和循環,而不是通過mysql_fetch_row()

其次,你應該切換到mysqli - 您使用的是PHP5.5被棄用的功能

三 - 你可以只使用兩種mysql_fetch_arraymysql_fetch_all(我不知道,但我會在後面)

這裏的關鍵是:

不要循環mysql函數。

0

性能上明智的問題是您正在循環結果集,併爲每一行執行查詢。

但是,您的輸出很難消除這種情況。否則,您可能可以在單個SQL語句中完成整個腳本。

最少清理,只是去掉選擇之一: -

<?php 

$query1 = "SELECT a.table_name, a.column_name, b.COLUMN_NAME AS auto_inc_col 
      FROM information_schema.columns a 
      INNER JOIN information_schema.columns b 
      ON a.table_name = b.table_name AND b.EXTRA = 'auto_increment' 
      WHERE table_schema='schemaname' AND column_name like '%image%' or column_name='video'"; 

$result1 = mysql_query($query1) or die(mysql_error() . " -- " . $query1); 

while($row1 = mysql_fetch_assoc($result1)) 
{ 
    if (!strpos($row1['table_name'],'backup') > 0) 
    { 
     $query2 = "SELECT " . $row1['column_name'] . ", " .$row1['auto_inc_col'] . " 
        FROM " . $row1['table_name'] . " 
        WHERE " . $row1['column_name'] . " != '' AND " . $row1['column_name'] . " IS NOT NULL 
        "; 
     echo $query2 . "<br>"; 
     $result2 = mysql_query($query2) or die(mysql_error() . " -- " . $query2); 

     while ($rowdb = mysql_fetch_row($result2)) 
     { 
      if (!strpos($rowdb[0],'facebook') > 0 && !file_exists($img_root.'/'.$rowdb[0])) 
      { 
       $sql = "UPDATE ".$row1['table_name']." SET ". $row1['column_name'] . " = '' WHERE " . $row1['auto_inc_col']. "= ".$rowdb[1]; 
       echo $sql . "<br><br>"; 
       $delete_count++; 
       //mysql_query("UPDATE ".$row1['table_name']." SET ". $row1['column_name'] . " = '' WHERE id = ".$row1["id"]); 
      } 
     } 
    } 
} 

?>