Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 加速此代码的提示_Php_Mysql_Performance_Query Optimization - Fatal编程技术网

Php 加速此代码的提示

Php 加速此代码的提示,php,mysql,performance,query-optimization,Php,Mysql,Performance,Query Optimization,有人能提出一些建议或修改,使代码更干净、更快吗?这是我能想到的在周五晚上做这件事的唯一方法,但我相信一定有更有效的方法做这件事 我知道正则表达式效率不高,但我真的看不出还有什么其他方法可以做到这一点,特别是如果邮政编码数据可以是: e12be e1ebe e10ebe e10 ebe ex1 ebe ex1ebe 等等 非常感谢您提供的编码技巧, H 有一件事可能不会更有效,但看起来更干净,您可以在MySQL操作符中使用: SELECT * FROM `Consumer` WHERE left(

有人能提出一些建议或修改,使代码更干净、更快吗?这是我能想到的在周五晚上做这件事的唯一方法,但我相信一定有更有效的方法做这件事

我知道正则表达式效率不高,但我真的看不出还有什么其他方法可以做到这一点,特别是如果邮政编码数据可以是:

e12be e1ebe e10ebe e10 ebe ex1 ebe ex1ebe

等等

非常感谢您提供的编码技巧, H


有一件事可能不会更有效,但看起来更干净,您可以在MySQL操作符中使用

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

您将其作为一个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。

您可以尝试匹配补码,并对所有不匹配的行设置CONYES='1'。也许这是一个更容易的决定,比如:

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

不需要每次遇到匹配项时都更新数据库。只要做一次就足够了:

$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
,请使用其他变量名


您还应该只选择您真正需要的列,在本例中可能是邮政编码和电子邮件。

示例代码看起来与单个查询相当:

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”操作符,但可能更高。可能有一个更合适、更宽容、更正确的regexp;选择上面的内容是因为它与样本中的内容相同。您需要做的另一件事是获取受影响行的数量,这很容易使用(无论如何,您应该使用它来代替旧的MySQL驱动程序):


左(
Postcode
,2)='E'?没有留下(
Postcode
,1)='E'?@markbyers-很好地发现了,是的,那是个错误!我认为你的邮政编码以W或B开头也不会被看到,因为它们在最初的查询中无法保存。您缺少两行:或左(
Postcode
,1)=“W”或左(
Postcode
,1)=“B”。很抱歉,这应该是M,而不是W。这正是我不应该在周五晚上7点编码的原因-只需要找到ENW,其他if语句是多余的^^
$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);
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)'
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.";
}