#php #mysql
#php #mysql
Вопрос:
У меня есть этот PHP-код, который должен проверять статистику сайта и регистрирует все посещения. Все работает хорошо, но я случайно узнал, что была одна двойная вставка, и я потерял дар речи, с тем же IP и датой.
$ip = $_SERVER['REMOTE_ADDR'];
$date = date("Y-m-d");
$time = time();
$stmt = mysqli_prepare($dbconnect, "SELECT id FROM traffic WHERE ip=? amp;amp; date=? LIMIT 1");
mysqli_stmt_bind_param($stmt, 'ss', $ip, $date);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$res=mysqli_stmt_num_rows($stmt);
if ($res == 0) {
$inser = mysqli_prepare($dbconnect, "INSERT INTO traffic (ip,date,time) VALUES (?, ?, ?)");
mysqli_stmt_bind_param($insert, 'ssi', $ip, $date, $time);
mysqli_stmt_execute($insert);
mysqli_stmt_close($insert);
}else {
mysqli_stmt_bind_result($stmt, $id);
mysqli_stmt_fetch($stmt);
$update = mysqli_prepare($dbconnect, "UPDATE traffic SET pages=pages 1, time=? WHERE id=? LIMIT 1");
mysqli_stmt_bind_param($update, 'ii', $id, $time);
mysqli_stmt_execute($update);
mysqli_stmt_close($update);
}
mysqli_stmt_close($stmt);
сделано более точным
Комментарии:
1. вы должны использовать уникальные индексы в таблице, а не выбирать, чтобы остановить дубликаты
2. Да:
ALTER TABLE traffic ADD UNIQUE INDEX (ip, date)
и затем учитывайте ошибки в вашем PHP-коде или используйтеON DUPLICATE UPDATE
запрос.3. по более широкой схеме вещей, IP!= user так что вы на самом деле не считаете, кем вы себя считаете, это отличные аналитические инструменты, если вы действительно хотите понять своих посетителей.
4. На этот вопрос невозможно ответить. Может быть, вы использовали другой код, может быть, в базе данных была тестовая запись, кто знает ?!
5. Мне нужно больше думать об уникальных индексах. На самом деле это упрощенная версия более сложного скрипта.
Ответ №1:
Ваш код можно вызвать дважды подряд и запустить 1-й select, получить 0 результатов и вставить запись. 2-й select выполняется параллельно непосредственно перед вставкой 1-й записи, поэтому также получает 0 результатов, поэтому он запускает вставку — теперь у вас есть 2 записи с одинаковыми данными.
Комментарии:
1. Другими словами, «условие гонки». Веб-серверы многопоточны, поэтому одновременно может выполняться несколько копий кода скрипта страницы.