2009-11-20 29 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."; 
}