Php 加速此代码的提示
有人能提出一些建议或修改,使代码更干净、更快吗?这是我能想到的在周五晚上做这件事的唯一方法,但我相信一定有更有效的方法做这件事 我知道正则表达式效率不高,但我真的看不出还有什么其他方法可以做到这一点,特别是如果邮政编码数据可以是: e12be e1ebe e10ebe e10 ebe ex1 ebe ex1ebe 等等 非常感谢您提供的编码技巧, HPhp 加速此代码的提示,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(
有一件事可能不会更有效,但看起来更干净,您可以在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.";
}