2009-11-20 3 views
0

Может ли кто-нибудь предложить советы или изменения, чтобы сделать этот код более чистым и быстрым? Это был единственный способ, которым я мог придумать это в пятницу вечером, но я уверен, что должен быть более эффективный способ сделать это ...Советы по ускорению этого кода

Я знаю, что регулярные выражения не эффективны, но я не могу честно посмотреть, как еще я могу это сделать, особенно если данные Почтовый индекс может быть что угодно от:

e1 2be e1ebe e10ebe e10 Эбе EX1 Эбе ex1ebe

и так далее ...

Большое спасибо за любое кодирование ti пс, 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'? –

+0

Ницца или смерть. – ThisSuitIsBlackNot

+0

@ Марк Байерс - хорошо заметили, да, это ошибка! – MrFidge

ответ

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' 

или (psuedocode, я не парень 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, используйте другое имя переменной.

Вы также должны выбрать только то, что столбцы вам действительно нужно, в этом случае, вероятно, Почтовый индекс и Email.

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)' 

тростн менее читабельным, чем оператор «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."; 
} 
Смежные вопросы