В моем php-коде у меня есть запрос Mysql:
SELECT COUNT(*)
чтобы увидеть, если запись уже существует, то, если она не существует, я делаю:
INSERT INTO <etc>
Но если кто-то нажимает перезагрузить с секундой или около того, SELECT COUNT(*)
не видит вставленную запись.
$ssql="SELECT COUNT(*) as counts FROM `points` WHERE `username` LIKE '".$lusername."' AND description LIKE '".$desc."' AND `info` LIKE '".$key."' AND `date` LIKE '".$today."'";
$result = mysql_query($ssql);
$row=mysql_fetch_array($result);
if ($row['counts']==0) // no points for this design before
{
$isql="INSERT INTO `points` (`datetime`,`username`,`ip`,`description`,`points`,`info`, `date`,`uri`) ";
$isql=$isql."VALUES ('".date("Y-m-d H:i:s")."','".$lusername."',";
$isql=$isql."'".$_SERVER['REMOTE_ADDR']."','".$desc."','".$points."',";
$isql=$isql."'".$key."','".$today."','".$_SERVER['REQUEST_URI']."')";
$iresult = mysql_query($isql);
return(true);
}
else
return(false);
Я использовал тип базы данных MyISAM
Вместо запуска двух отдельных запросов просто используйте REPLACE INTO
.
Из документации:
REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE индекса, старая строка удаляется перед вставкой новой строки.
Например, если ваше ключевое поле id
затем:
REPLACE INTO my_table SET id = 4 AND other_field = 'foobar'
будет вставлен, если нет записи с идентификатором 4, или если есть, то заменит значение other_field на foobar.
Других решений пока нет …