簡體   English   中英

加快此代碼的技巧

[英]Tips for speeding up this code

任何人都可以提出一些提示或修改意見,以使此代碼更簡潔,更快捷嗎? 這是我想到在星期五晚上做這件事的唯一方法,但是我敢肯定,必須有一種更有效的做事方法...

我知道正則表達式效率不高,但是我不能誠實地看到我還能如何做到這一點,特別是如果郵政編碼數據可以來自以下任何內容:

e1 2be e1ebe e10ebe e10 ebe ex1 ebe ex1ebe

等等...

非常感謝您提供任何編碼技巧,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);

您將其發布為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'.....

結果是更改的行數,可以直接將其分配給$ counter。

一件可能效率不高但看起來更干凈的東西,可以使用IN MySQL運算符:

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

該示例代碼看起來等同於單個查詢:

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.";
}

您可以嘗試匹配補碼,然后在不匹配的所有內容上設置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");

您不需要每次遇到匹配項時都更新數據庫。 只要執行一次就足夠了:

$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 == 0true )才更新數據庫。 如果$counter值不是0 ,請使用其他變量名。

您還應該只選擇您真正需要的列,在這種情況下,可能是PostcodeEmail

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM