2011-12-19 9 views
1

新しいクライアントが存在しない場合にのみ挿入しようとしています。 selectvaluesは相互に排他的である、INSERT文でデータを挿入する前に既存のエントリを確認する

$sql = "INSERT INTO clients 
     (`studentEmail`, `studentPassword`, `parentEmail`, `parentPassword`, 
     `studentFirstName`, `studentLastName`, `studentPhone`, `parentFirstName`, 
     `parentLastName`, `parentPhone`, `school`) 
     VALUES ('$studentEmail', '$studentPassword', '$parentEmail', 
     '$parentPassword', '$studentFirstName', '$studentLastName', 
     '$studentPhone', '$parentFirstName', '$parentLastName', '$parentPhone', '$school') 
     SELECT studentEmail 
     FROM clients 
     WHERE not exists (select * from clients where studentEmail == '"$studentEmail"')"; 
+0

具体的なエラーはありますか? –

+1

あなたは値をエスケープする必要があります。 [SQLインジェクション](http://en.wikipedia.org/wiki/SQL_injection)を参照してください。 – Xeoncross

+0

@Xeoncross:あなたは**このクエリで使われる前に変数がどのように処理されたかについては何も知っていません** – zerkms

答えて

2

あなたは電子メールでデータを挿入する前に存在しているかどうかを確認する必要があります。

merge into clients on (select 1 from clients where studentEmail = blabla) 
when not matched then insert blabla 

(MERGE文の構文は、あなたのRDBMSに応じて異なりますので、あなたの特定のRDBMSの実装のためのドキュメントを見ていきます)

+0

私はこのメソッドを最初に試しました。なぜなら、PHPがフレームワークの残りの部分とうまく収まるからです。連結を追加した後($ studentEmail。)、 "mysql_num_rows():エラーが発生しました。リソースは... "任意のIDイージー? – radleybobins

+0

更新されたクエリを試すことはできますか? – Indranil

+0

このクエリは機能しますが、引き続きエラーが発生しています:mysql_num_rows():指定された引数。 studentEmailからSELECTを選択すると、どこのstudentEmail = '{$ studentEmail}'になりますか。それはエラーがこの行で起こっていると言います:\t "if(mysql_num_rows($ check)== 0){" – radleybobins

3

:私は、私はSQL文でと思うが、私はあまりにもPHPのコンテキストを与えたいと思った問題を抱えています。代わりに:

insert table1 (col1, col2, col3, ...) 
values (1, 2, 3, ...) 
select col1 
where not exists (...) 

試してみてください。

insert table1 (col1, col2, col3, ...) 
select 1, 2, 3, ... 
where not exists (...) 
+0

大丈夫、今すぐこれを試してみましょう。 – radleybobins

+0

遅れて申し訳ありません、私はまずPHPのアプローチを試みています。 – radleybobins

+0

これを試していますが、SQLエラーが発生しています...ここに私の更新されたコードは次のとおりです。INSERTクライアント( 'studentEmail'、' studentPassword'、 'parentEmail'、' parentPassword'、 \t \t \t \t \t 'studentFirstName'、' studentLastName'、 'studentPhone'、' parentFirstName'、 \t \t \t \t \t 'parentLastName'、' parentPhone'、 'school') \t \t \t \t SELECT '$ studentEmail'、 '$ studentPassword'、 '$ parentEmail'、 \t \t \t \t \t '$ parentPassword'、「$ studentFirstName '、' $ studentLastN雨 ' \t \t \t \t \t '$ studentPhone'、 '$ parentFirstName'、 '$ parentLastName'、 '$ parentPhone'、' $の学校の存在ではない \t \t \t \tは(studentEmail =クライアントからstudentEmailを選択します' {$ studentEmail} '); – radleybobins

0

電子メールフィールドにユニークなインデックスがある場合は、INSERT IGNORE ...とするだけで、既存の電子メールに対応する挿入物は静かに破棄されます。

+0

残念ながら、mysqlは 'MERGE'をサポートしていません。しかし、それは 'REPLACE'と' INSERT ... ON DUPLIcATE KEY UPDATE'をサポートしています – zerkms

0

をあなた場合:あなたはMERGEステートメントを使用することができます

$check = mysql_query("SELECT studentEmail FROM clients WHERE studentEmail = '{$studentEmail}';"); 

if (mysql_num_rows($check) == 0) { 
    // insert 
} 
関連する問題