0

私のテーブルには4つのフィールドがあり、そのうち2つのフィールドは一意です。たとえば、ユーザー名と電子メールです。人々はフロントエンドに登録します。ajaxを使用して登録結果を動的に表示します。

私は単一の挿入クエリを実行しています。エラーが発生した場合は、エラー番号を使用して、1062(重複エントリ)または1064(クエリ文字列エラー)のどちらであるかを確認します。それ以外の場合、ユーザーは正常に登録されています。

ユーザーを登録できなかった場合は、ユーザーフレンドリーな方法で理由を表示します。重複している場合は、ユーザー名がすでに存在するか、電子メールがすでに存在することを表示する必要があります。

ここでのポイントは、selectクエリを使用して、ユーザー名または電子メールがすでに存在するかどうかを確認したくないことです。存在しない場合は、挿入クエリを実行します。

上記のように実行している場合は、2つのクエリを実行する必要があります。クエリを1つだけ実行し、エラー番号とエラーメッセージを使用して、エラーの種類を正確にユーザーに表示したいと思います。

今、問題は重複にあります。

私はそれが重複していることを知りました、そして私はこのようなエラー文字列を持っています

キー「email」の重複エントリ「test@gest.com」またはキー「username」の重複エントリ「testing」

strposを使用してフィールド名を検索し、電子メールがすでに存在するか、ユーザー名がすでに存在することをユーザーに表示できるようにすることを考えました。

しかし、いくつかのサーバーでは私はこのようになります

キー2の重複エントリ'test@gest.com'またはキー3の重複エントリ'testing'

この場合、最後の部分を抽出するために正規表現を実行する必要があります。文字列の場合は、strcmpを実行して、重複するフィールドを細かくし、それに応じてエラーをユーザーに表示します。または、数値である場合は、どのフィールドに重複があるかを細かくするための単純なswitchステートメント。

****

したがって、テーブルにさらに一意のフィールドがある場合に、どのフィールドが重複しているかを取得する他の方法はありますか。

**または、ない場合は、この質問を人々の心に伝えて、すでにギミックを行っている場合は、ここで共有して、私のような人々が利益を得ることができるようにします。ありがとうございました。

4

3 に答える 3

1

strpos()エラー文字列に対して実際の値(some@email.comまたはsome_username)を使用して実行できます。

編集
これを行うことが本当に必要かどうかを自問することもできます。他の方法があります:

  • ユーザー名やメールアドレスがすでに存在することをユーザーに伝えます
  • onblur()適切な入力フィールドを確認してください

このようにして、問題を完全に回避できます。

于 2010-07-30T11:47:54.297 に答える
0

Select Count(*)From TableName where Condition='yourtestcondition'を使用するだけです。count> 0の場合、それ以外の場合は存在しません。

于 2010-07-30T11:41:33.840 に答える
0

まず最初に-クエリに別の問題があります-あなたは1064(クエリ文字列エラー)について言及しています。これは、クエリ構文が正しくない可能性があることを意味します。これは、おそらくユーザー値を十分にフィルタリングしていないことを意味します。このエラーは、サーバーを誤って保護した場合にのみ発生します(AFAIK)。これは、1つではなく2つのSQLを使用するよりもはるかに多くの問題につながります。入力パラメータを正しくエスケープしているかどうかを確認してください。また、次のようなパラメータバインディングを使用する必要があります。

$stmt = mysqli_prepare($link, "INSERT INTO XXX (username, email) VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, 'ss', $user, $email);

詳細については、mysqlページhttp://pl.php.net/manual/en/mysqli-stmt.bind-param.phpを参照してください。

そしてあなたのバグについて:

申し訳ありませんが、あなたが望むことを達成する方法はありません(少なくとも私が知っていることはありません)。挿入物のクエリ番号についてはそれほど気にしないでください。1秒あたり数千のユーザー登録があるわけではないので、別のクエリが実際に害を及ぼすことはありません。

問題は、エラーメッセージがどうなるか本当にわからないということです。これは主にサーバー構成に依存します。別の言語などでエラーメッセージが表示される場合があります。

本当に、SELECTlikeを実行しSELECT username, email FROM database WHERe username=? OR email=?て応答を確認してください。ない場合、重複はありません。

于 2010-08-16T11:18:39.937 に答える