1

mysql に乱数が存在するかどうかをチェックする関数を書こうとしています。

$newEventId = rand(1000, 10000);
EventId($newEventId);

function EventId($gen)
{

  if (mysql_num_rows(mysql_query("SELECT id FROM events WHERE EventID=$gen" )) == 0) 
    break;

  // recall function
  else 
  {
    $newEventId = rand(1000, 10000);
    EventId($newEventId);
  } 
}

//insert into events table
4

2 に答える 2

1

AUTO_INCREMENT「ランダムな」IDを生成しようとする代わりに列を使用しないのはなぜですか? また、EventIdID を選択してデータベースに格納することはアトミックではないため、関数は安全ではなく、別のプロセスが既に同じ ID を使用している可能性があります。

テーブルにSQLevent_idとして作成された列がある場合、次のINT AUTO_INCREMENTようになります。

INSERT INTO foo (event_id, ...) VALUES (<everything EXCEPT event_id>);
event_id = SELECT LAST_INSERT_ID();
于 2013-03-17T02:40:40.447 に答える
0

なぜそれが であるかは述べていませんが、not working私の推測では、//insert into events table以下のコードでは で を使用し$newEventIdINSERTいます。$newEventId(mysql_num_rows(mysql_query("SELECT id FROM events WHERE EventID=$gen" )) == 0)truetrue

の値を返し、break代わりにそれを使用してみてください$newEventId

function EventId($gen)
{

  if (mysql_num_rows(mysql_query("SELECT id FROM events WHERE EventID=$gen" )) == 0) {
  return $gen; // return the number that will be set as $EventId and used in the insert
  break;
  }
  // recall function
  else 
  {
    $newEventId = rand(1000, 10000);
    EventId($newEventId);
  } 
}

$newEventId = rand(1000, 10000);
$EventId = EventId($newEventId);  // set the returned $gen to $EventId to be used in the Insert query

//insert into events table
mysql_query("INSERT INTO events ... EventID=$EventId..");
于 2013-03-16T21:55:48.483 に答える