Bu kodu hızlandırmak için ipuçları

5 Cevap php

Herkes temiz ve daha hızlı bu kodu yapmak için ipuçları veya değişiklikler önerebilir miyim? Bu bir Cuma akşamı yapıyor düşünebildiğim tek yolu buydu, ama bunu yapmanın daha etkili bir yolu olmalı eminim ...

Ben regexs verimli değil, Posta kodu veri herhangi bir şey olabilir, özellikle eğer dürüstçe, bunu nasıl yapabilirim başka göremiyorum biliyorum:

e1 2be e1ebe e10ebe e10 ebe ex1 ebe ex1ebe

ve böylece ...

Thanks a lot for any coding tips, 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);

5 Cevap

Eğer bir PHP soru olarak yayınlanmıştır, ama en etkili yolu bir SQL sorgusunda her şeyi ve veritabanı işi yapmak almak olduğunu düşünüyorum. Sen düzenli ifade eşleştirmesi gerçekleştirmek için veritabanını almak için anahtar kelime 'RLIKE kullanabilirsiniz. Siz tam olarak ne istediğinizi elde etmek için sözdizimi kadar okumalısınız, ama sadece size başlamak için, böyle bir şey istiyorum:

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

Sonuç $ sayaç doğrudan atanabilir değişti satır sayısıdır.

Daha verimli olmayabilir, ama temiz görünecek bir şey, sen IN MySQL operatörünü kullanabilirsiniz:

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

Örnek kod tek bir sorguya eşdeğer görünüyor:

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" operatörü daha az okunabilir, ancak daha performanslı olabilir. Daha uygun, daha hoşgörülü ve daha doğru sıradanifade olabilir; Bu numunede ne eşdeğerdir çünkü yukarıda seçildi. Yapmanız gereken tek şey PDO (yerine eski MySQL sürücü kullanarak olmalıdır ki, zaten) kullanarak yapmak kolay etkilenen satır sayısını, olsun:

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

Sen tamamlayıcı eşleşen deneyin ve maç does't her şeyi CONYES = '1 'ayarlayabilirsiniz. Belki bunun gibi, daha kolay bir belirleme var:

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

veya (psuedocode, ben bir Perl adam değilim):

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

Sen veritabanını bir maç karşılaştığımız her zaman güncellemeniz gerekmez. Eğer sadece bir kez bunu yapmak eğer yeterlidir:

$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);

Herhangi bir güncelleme yapılmamış olsaydı burada veritabanı yalnızca güncellenir ($counter == 0 ise true). $counter 0, farklı bir değişken adı kullanmak yerine diğer bazı değer varsa.

Ayrıca sütunlar gerçekten ihtiyacınız sadece seçmelisiniz, bu durumda muhtemelen Postcode ve Email.