0

ユーザーが何千もの電子メール アドレスを貼り付けるために使用できる HTML テキスト領域があります。テキストエリアから重複した電子メール アドレスを削除したい場合は、次の方法の方がコストがかかりません。

  1. すべての電子メール アドレスを MySQL データベースに挿入し、SELECT DISTINCTクエリを実行します。
  2. すべての電子メール アドレスを PHP 配列にロードし、array_unique()?

ありがとう!

4

3 に答える 3

2

任意のレコードを MySQL テーブルに挿入するよりも、リクエストごとにこれを処理する方がよいでしょう。重複するかどうかを知らずに各レコードをテーブルに挿入すると、最終的には重複を削除するスクリプトを作成する必要があります。

例えば:

テキスト領域に、POST 要求の電子メールのコンマ区切りリストが含まれているとします。

$emails = $_POST['email'];
// in real life you will want to validate each string with a regex
$emails = preg_split('/,/', $emails);
// or you could do explode(",", $emails);

// acknowledge possession of an array
$unique_emails = array();

foreach($emails as $key => $value)
{
  $unique_emails[$value] = $value;
}

// unique_emails contains all unique addresses.

これで、一意でないレコードについて心配することなく、これらをテーブルに挿入できます。

于 2013-10-13T02:27:56.037 に答える
0

PHP の方法で状況を処理することをお勧めします。

重複が必要ない場合、なぜデータベースに不要なデータを詰め込む必要があるのでしょうか?

それに加えて、すでにテーブルにはいくつかの冗長なレコードが含まれています。したがって、フィルタリングせずに冗長なレコードを入力するたびに、テーブルのサイズが大きくなり、select distinct操作がより複雑になります。したがって、レコードがデータベースに挿入される前に、サーバー側自体でレコードの冗長性を処理する方が確実に優れています。

また、指定された方法は両方ともtime-complex作成しない方がよいためspace-complexです。

于 2013-10-13T03:37:36.777 に答える
0

次の方法の方がコストがかかりません: すべての電子メール アドレスを PHP 配列にロードして実行しますarray_unique()

それぞれの長さ20,000が char のランダムな文字列と見なされます。10

(これらの20,000ランダムな文字列に16,384は、一意の文字列があります)

Test #1 :
20,000これらのランダムな文字列 で配列を宣言しました上記の配列で実行しました 実行時間:
39604568481秒array_unique
0.141

Test #2 :
20,000これらのランダム文字列 で配列を宣言PDO 準備済みステートメントを使用してデータベース テーブルにランダム文字列を
挿入テーブル から DISTINCT ランダム文字列を取得 実行時間: 27002525 秒20,000

735.758

user-end情報がサーバーに送信される前であっても、 (Javascript などを使用して) テキストエリアから重複を削除することができます。
次に、array_uniqueonserver-endを使用して、重複がないことを確認することもできます。

于 2013-10-13T10:55:59.300 に答える