0

数字以外のすべての電話番号を削除した後、データベース内の電話番号を更新するこの非常に非効率的な方法があります。

$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レコードの後でタイムアウトが発生します。私が何か間違ったことをしているのは明らかなので、私を学校に通わせるときは優しくしてください。;)

4

3 に答える 3

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);
于 2012-12-04T00:44:05.863 に答える
1

まず、非推奨mysql_になっている関数の使用を停止します。代わりにまたは関数を使用してください。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置換するデータを含む一時テーブルです。

実際に見てください

于 2012-12-04T00:47:44.023 に答える
0

ええと、あなたのデータベースへの複数の呼び出しはスピードヒットを招きます、そして(私の経験では)それは苦痛なものです。データベースへの2回のトリップでさえ、1回を超える顕著な遅延につながる可能性があります。

これを回避するには、データベースへの呼び出しを最小限に抑える必要があります。つまり、1回の呼び出しでできるだけ多くのことを実行します。このために、置換ロジックがSQL自体にある単一のSQL更新としてこれを書き直してみてください。これは、データベースへの1回のアクセスと、大幅な速度の向上を意味します。

言うのは簡単です。前回チェックして以来、MySQLには正規表現の文字列置換関数がありませんでした。回避策を試すか、UDFのいくつかについて確認することができます。別の回答は、1つのリンクを提供しました。私はそれを調べることをお勧めします。

于 2012-12-04T00:40:36.690 に答える