0

MySQL データベースからランダムなレコード (一意の「トークン」として使用される文字列) を選択する PHP ページを作成したいと考えています。このランダムなレコードを一度だけ選択し、その後二度と選択したくありません。

そのために0、特定のレコードが選択された瞬間にインクリメントされる特別なフィールド (number を含む「numberfield」という名前) をテーブルに追加します。このように0して、numberfield テーブル フィールドの値が のレコードのみを選択できます。ランダム レコードが選択されるとすぐに、numberfield フィールドがインクリメントされ、それ1以上選択できなくなります。次のPHPコードを使用することを考えています:

$result = mysql_query("SELECT token FROM table WHERE numberfield < **1** ORDER BY RAND() LIMIT 0,1");

if (!$result) {
    echo 'Could not run query: ' . mysql_error();
    exit;
}

$row = mysql_fetch_row($result);
echo $row[0];
mysql_query("UPDATE table SET numberfield=numberfield+1 WHERE token=" + $row[0] + "");

これは正しい方法でしょうか?何かご意見は ?

さらに、ページの更新時に別のランダム レコードが選択されるのを避けたいと考えています。「トークン」をキャッシュに保持するための正しくて最も簡単な方法は何ですか? たとえば、ページの更新中に上書きされないセッションに「トークン」を保持することは可能ですか、それとも Ajax などの他の手法を使用する必要がありますか?あなたの助けとコメントは大歓迎です!

4

1 に答える 1

0
  1. mysql_関数は非推奨であるため、使用を中止する必要があります。
  2. ORDER BY RAND()乱数を求めることでオーバーヘッドが発生するため、大きなテーブルでの使用は避ける必要があります。
  3. を達成するSELECT ... UPDATEには、ある種のロックが必要です。行がランダムに 2 回選択される可能性はわずかです。これは、ストアド プロシージャを使用して防ぐことができます。
  4. PHPまたはその一部によって生成されたセッションIDを使用できます。このトピックは、セッション ID の一意性について説明し、さまざまな長さについて説明します。
  5. または、PHP 側でランダムな文字列を作成することもできます。これにより、データベースへの接続のオーバーヘッドを節約できます。
于 2013-01-19T22:03:01.120 に答える