2014-03-12 127 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"]); 
      } 
     } 
    } 
} 

?>