2009-11-20 50 views
0

任何人都可以提出提示或更改以使此代码更清洁和更快吗?这是我能想到做一个周五晚上的唯一途径,但我敢肯定,必须有这样做的更有效的方法...加速此代码的提示

我知道regexs效率不高,但我不能老实说,看到我还能怎么做到这一点,特别是如果邮政编码数据可以从任何东西:

E1 2BE e1ebe e10ebe E10 EBE EX1 EBE ex1ebe

等等...

非常感谢任何编码ti PS, ^ h

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Amma Gawd! Someone ate our database!'); 
    mysql_select_db($dbname); 
    $result = mysql_query("SELECT * FROM `Consumer` 
      WHERE left(`Postcode`,2) = 'E' 
      OR left(`Postcode`,1) = 'N' 
      OR left(`Postcode`,1) = 'W'"); 
    while($row = mysql_fetch_array($result)) { 
     $email = $row['Email']; 
     if (preg_match("/^[Ee]{1}[0-9]{2}/",$row['Postcode'])) { 
      mysql_query("UPDATE `Consumer` SET `CONYES` = '1' WHERE `Email` = '$email'") or die ("Bugger"); 
      $counter = $counter +1; 
     } elseif (preg_match("/^[Nn]{1}[0-9]{2}/",$row['Postcode'])) { 
      mysql_query("UPDATE `Consumer` SET `CONYES` = '1' WHERE `Email` = '$email'") or die ("Bugger"); 
      $counter = $counter +1;  
     } elseif (preg_match("/^[Ww]{1}[0-9]{2}/",$row['Postcode'])) { 
      mysql_query("UPDATE `Consumer` SET `CONYES` = '1' WHERE `Email` = '$email'") or die ("Bugger"); 
      $counter = $counter +1; 
     } 
    } 

    $result1 = mysql_query("SELECT * FROM `Consumer` 
      WHERE left(`postcode`,2) = 'BR' 
      OR left(`postcode`,2) = 'CR' 
      OR left(`postcode`,2) = 'EC' 
      OR left(`postcode`,2) = 'EN' 
      OR left(`postcode`,2) = 'KT' 
      OR left(`postcode`,2) = 'NW' 
      OR left(`postcode`,2) = 'RM' 
      OR left(`postcode`,2) = 'SE' 
      OR left(`postcode`,2) = 'SM' 
      OR left(`postcode`,2) = 'SW' 
      OR left(`postcode`,2) = 'TW' 
      OR left(`postcode`,2) = 'WC' 
      OR left(`postcode`,2) = 'BD' 
      OR left(`postcode`,2) = 'HG' 
      OR left(`postcode`,2) = 'LS' 
      OR left(`postcode`,2) = 'WF' 
      OR left(`postcode`,2) = 'YO' 
      OR left(`postcode`,2) = 'HD' 
      OR left(`postcode`,2) = 'HX'"); 
    while($row1 = mysql_fetch_array($result1)) { 
     $email = $row1['Email']; 
     mysql_query("UPDATE `Consumer` SET `CONYES` = '1' WHERE `Email` = '$email'") or die ("Bugger"); 
     $counter = $counter +1; 
    } 
    echo $counter; 
    mysql_close($conn); 
+1

左('Postcode' ,2)='E'?没有离开('Postcode',1)='E'? – 2009-11-20 19:06:33

+0

不错或'死'的消息。 – ThisSuitIsBlackNot 2009-11-20 19:07:45

+0

@马克拜尔斯 - 很好发现,是的,这是一个错误! – MrFidge 2009-11-20 19:14:44

回答

6

你张贴作为一个PHP的问题,但我认为最有效的方法是在一个SQL查询中完成所有操作,并让数据库完成这项工作。您可以使用关键字'RLIKE'来让数据库执行正则表达式匹配。你应该对语法读了,让你想要什么,而只是开始你了,你想是这样的:

UPDATE `Consumer` SET `CONYES` = '1' 
    WHERE `Postcode` RLIKE '[EeNnWwBbMm][0-9]{2}' 
    OR LEFT(`postcode`,2) IN ('BR', 'CR', 'EC', 'EN', 'KT', 'NW', 'RM'..... 

结果是行的改变数量,这可以直接分配到$计数器。

2

有一件事可能不是比较有效,但会显得干净,你可以使用IN MySQL的操作:

SELECT * FROM `Consumer` WHERE left(`postcode`,2) IN ('BR', 'CR', 'EC', 'EN', 'KT', 'NW', 'RM'..... 
0

你可以试着补匹配,并设置CONYES =“1”对简化版,比赛的一切。也许这是一个比较容易确定,如:

select * from Consumer where left(postcode, 2) <> 'XX' 

或(伪代码,我不是一个Perl的家伙):

if (!preg_match(complementRegexString, $row['Postcode']) 
    mysql_query("UPDATE `Consumer` SET `CONYES` = '1' WHERE `Email` = '$email'") or die ("Bugger"); 
0

你不需要,你遇到了一个比赛,每次更新数据库。这足以如果你只是做一次:

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Amma Gawd! Someone ate our database!'); 
mysql_select_db($dbname); 
$result = mysql_query(" 
    SELECT `Postcode`, `Email` 
    FROM `Consumer` 
    WHERE LEFT(`Postcode`,1) IN ('E', 'N', 'W'"); 
$counter = 0; 
while ($row = mysql_fetch_array($result)) { 
    if (preg_match("/^[ENB][0-9]{2}/i",$row['Postcode'])) { 
     if (!$counter) { 
      $email = $row['Email']; 
      mysql_query("UPDATE `Consumer` SET `CONYES` = '1' WHERE `Email` = '$email'") or die ("Bugger"); 
     } 
     ++$counter; 
    } 
} 

$result = mysql_query(" 
    SELECT `Postcode`, `Email` 
    FROM `Consumer` 
    WHERE LEFT(`Postcode`, 2) IN ('BR', 'CR', 'EC', 'EN', 'KT', 'NW', 'RM', 'SE', 'SM', 'SW', 'TW', 'WC', 'BD', 'HG', 'LS', 'WF', 'YO', 'HD', 'HX')"); 
while ($row = mysql_fetch_array($result)) { 
    if (!$counter) { 
     $email = $row['Email']; 
     mysql_query("UPDATE `Consumer` SET `CONYES` = '1' WHERE `Email` = '$email'") or die ("Bugger"); 
    } 
    ++$counter; 
} 
echo $counter; 
mysql_close($conn); 

这里的数据库只如果没有更新尚未更新(如果$counter == 0)。如果$counter的值不是0,请使用其他变量名称。

你也应该只选择列,你真正需要的,在这种情况下可能邮编电子邮件

2

示例代码看起来等同于单个查询:

UPDATE `Consumer` SET `CONYES` = 1 
    WHERE Email IS NOT NULL 
    AND Postcode RLIKE '^([NEW][0-9]{2}|B[DR]|CR|E[CN]|H[DGX]|KT|LS|[NT]W|RM|S[EMW]|W[CF]|YO)' 

的RE是比“IN”操作者较少可读的,但是可能是更好的性能。可能有更合适,更宽容和更正确的正则表达式;以上是因为它相当于样本中的内容。你需要做的唯一的另一件事就是让受影响的行数,这是很容易使用PDO做(你应该使用代替旧的MySQL驱动,反正):

try { 
    $db = new PDO("mysql:host=$dbhost,dbname=$dbname", $dbuser, $dbpass); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $count = $db->exec("UPDATE `Consumer` SET `CONYES` = 1 
     WHERE Email IS NOT NULL 
     AND Postcode RLIKE '^([NEW][0-9]{2}|B[DR]|CR|E[CN]|H[DGX]|KT|LS|[NT]W|RM|S[EMW]|W[CF]|YO)'" 
    ); 
    echo $count; 
} catch (PDOException $exc) { 
    // handle exception as you will 
    error_log($exc); 
    echo "I had an internal error. It's been logged, and we'll look into it."; 
}