2010-11-29 7 views
0

現在、エンドユーザーがフォーム上のいくつかのフィールドに記入してデータベースのレコードを更新できるようにするPHPコードがあります。データベースにはsequentialNumberというフィールドがあり、ユーザーは開始番号と終了番号を入力できます。更新クエリは、開始番号と終了番号の間のsequentialNumberを持つすべてのレコードのバックグラウンドで実行されます。これはかなり簡単なクエリです。更新コードを実行する前に既存のレコードを確認する方法は?

最近、人々が存在しないレコードを更新しようとしているいくつかの問題にぶち当たっています。今、これはデータベースの最後の問題ではありませんが、レコードが存在しない場合は通知を受け取り、存在する場合は存在しないレコードに通知します。

これを行うには、私は考えることができる唯一の方法は、ループ内でSELECTクエリを実行することです:

for ($i=$startNum; $i<=$endNum; $i++) { 

//run select query: select sequentialNumber from myTable where sequentialNumber = $startNum; 

} 

問題がある、私たちの共有のホストはスクリプトのタイムアウト制限があり、sequentialNumberバッチの場合十分に大きい場合、スクリプトはタイムアウトします。更新クエリを実行する前に、レコードの存在を確認する良い方法はありますか?

EDIT: ちょうど私がテストの別の種類を行うことができることを私に発生しました:彼らは更新しようとしているレコードの数を取得($ endNum - $ STARTNUM)をした後、カウントクエリを実行します。

select count(sequentialNumber) where sequentialNumber between $startNum and $endNum 

クエリの結果が減算の値と同じでない場合は、すべてのレコードが存在しないことがわかります。そこには何がないのかを私たちに伝えることはできませんが、少なくとも期待していなかったことは分かっています。これは有効な方法ですか?

+0

基本的に同じことです。 mySQLではBetweenを演算子として使用できます。したがって、1つ以上の数値を処理する必要はありません。 – EmmyS

答えて

1

あなたは、これは、その範囲内のすべての既知の数値を返します

select sequentialNumber from myTable where sequentialNumber between $startNum and $endNum 

を試みることができます。次に、array_search関数を使用して、特定の番号がわかっているかどうかを調べることができます。これは、dbに対して多くのクエリを実行するよりも速くなければなりません。

0
var count = mysql_fetch_array(mysql_query('SELECT count(*) FROM x WHERE id>startNum and id<endNum')); 

var modified = mysql_affected_rows(mysql_query('UPDATE x SET col='value' WHERE id>startNum and id<endNum')); 

if (count[0] > modified) { 
    // panic now 
} 
関連する問題