我正在尝试编写一个函数来检查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
答案 0 :(得分:1)
为什么不使用AUTO_INCREMENT
列而不是尝试生成“随机”ID?此外,EventId
函数不安全,因为选择id并将其存储在数据库中不是原子的,因此另一个进程可能已经使用了相同的id。
如果表的event_id
列创建为INT AUTO_INCREMENT
,则SQL应如下所示:
INSERT INTO foo (event_id, ...) VALUES (<everything EXCEPT event_id>);
event_id = SELECT LAST_INSERT_ID();
答案 1 :(得分:0)
你没有说明为什么它是not working
,但我的猜测是你//insert into events table
以下的代码正在使用$newEventId
中的INSERT
,它运行正常如果初始$newEventId
导致(mysql_num_rows(mysql_query("SELECT id FROM events WHERE EventID=$gen" )) == 0)
返回true
,但如果它在递归函数上返回true
则不会。
尝试返回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..");