在清除所有非数字后,我有这种非常低效的方式更新数据库中的电话号码。
$san_phone = mysql_query('SELECT * FROM table');
while ($row = mysql_fetch_array($san_phone)) {
$row['phone_clean'] = preg_replace('#[^\d]#', '', $row['phone']);
echo $row['id'] . ' - ' . $row['phone_clean'] . '<br>';
mysql_query("UPDATE table SET phone = " . $row['phone_clean'] . " WHERE id = " . $row['id']);
}
循环的更新部分导致我在2,400条记录中只有大约400条后超时。很明显我做错了所以在上学的时候要温柔。 ;)
答案 0 :(得分:1)
你可以使用类似这个用户定义的函数:
http://www.mysqludf.org/lib_mysqludf_preg/index.php#PREG_REPLACE_SECTION
或https://launchpad.net/mysql-udf-regexp
并将您的查询重写为:
UPDATE table
SET phone = PREG_REPLACE('#[^\d]#', '', phone);
答案 1 :(得分:1)
首先,停止使用mysql_
功能being deprecated。请改用mysqli_
或PDO
函数。
您用于UPDATE
记录的方法效率低下。您应该在单个查询中创建一个临时表INSERT
新记录,最后运行UPDATE
查询来替换数据。
你可以从这开始:
$san_phone = mysql_query('SELECT id, phone FROM table');
$insertArray = array();
while ($row = mysql_fetch_array($san_phone)) {
$phone_clean = preg_replace('#[^\d]#', '', $row['phone']);
echo $row['id'] . ' - ' . $row['phone_clean'] . '<br>';
$insertArray[] = "(" . $row[id] . ", '" . $phone_clean . "')";
}
$insertQuery = "INSERT INTO tempTable (id, phone) VALUES ";
$insertQuery = implode(", ", $insertArray);
mysql_query($insertQuery);
我做了一个快速演示来说明这个过程。 t1
是您的原始表,t2
是包含要替换的数据的临时表。
答案 2 :(得分:0)
好吧,对您的数据库的多次调用会导致速度受到影响,并且(根据我的经验),这是一个痛苦的。即使两次访问数据库也会导致一个明显的延迟。
要解决此问题,您希望最小化对数据库的调用,这意味着尽可能多地在一次调用中执行。为此,尝试将其重写为单个SQL更新,其中替换逻辑在SQL本身中。这意味着只需要一次数据库访问和大幅提升速度。
说起来容易做起来难,自从上次检查以来,MySQL没有正则表达式字符串替换功能。您可以尝试解决方法,或者查看一些UDF。另一个答案提供了一个链接。我建议调查一下。