Добрый день сталкиваемся в последние месяцы с проблемой отправки двойных запросов на изменение в базе данных из за этого возникают ошибки = двойные выполнения одного и того же действия К примеру: При заходе на определенную страницу скриптом идет запрос в базу данных на сравнение с текущим временем Если настоящее время больше чем то что в определенной строке в базе данных происходит некое действие с базой данных Если одновременно в ту же секунду на одну и ту же страницу заходят два разных пользователя и к примеру один зашел на полсекунды раньше, то идет запрос в БД и из за задержки нашего сервера зарез полсекунды заходит другой участник и скрипт не получив ответ от предидущего и не сделав изменения отправляет точно такой же запрос и в итоге они обрабатываются сервером и получается двойные изменения. POST GET - на этой странице нет. Зашел - идет запрос в бд при определенных условиях идут изменения в бд. подключен cloudflare
@crystaltrumpet Добавьте в вашу таблицу еще один столбик который по умолчанию null . И перед тем как произвести какие то там изменения проверяйте его на is_null(). Если true то производите свои изменения и запиши в этот столбик единицу. Второй пользователь перед изменениями тоже проверит этот столбик и если is_null false то уже ничего делать не будет.
Спасибо за ответ но я не представляю как это сделать в плане Вот я зашел Null =true я делаю изменения и тут же ставлю 1, но а что потом? изменения произвел нужно же обратно перевести в NULL так как эта строка еще может много раз меняться за день, так как это отнимаются деньги со счета.... А если я переведу обратно то дублированный запрос тоже пройдет и деньги отнимутся второй раз также
Тогда все еще проще, раз время вы сравнивать умеете, пишите туда вместо единицы время изменения. И условие если время последнего изменения допустим меньше одной минуты то данные не менять.
Чтобы Вы понимали код! Там идет перебор цикла и бывает что изменяется несколько раз цифра за все циклы
видел я уж ваш код, капец =) во первых while можно все тоже написать что и в foreach у вас, во вторых так не делается. Но раз уж вы делаете то можно просто условие написать в цикле. if(дата больше одной минуты) делаем update если нет то не делаем.
А чего гадать то, покажите код... Хотя я честно говоря смысла во всём что написали пока не уловил.. все абстрактно конкретно на пальцах объясните что и зачем вы конкретно меняете в бд... Самый простой пример - типа у нас счётчик просмотра страниц, показали страницу - увеличили счётчик в бд
@ADSoft я что то такое делал по неопытности, update конкретной строки если нужны изменения. В будущем до него дойдет что лучше делать inser и потом доставать одну строчку с последним изменением =) а код он показывал, но потом убрал почему то.
Случайно убрал)) Поэтому и написал в разделе новичков, так как возможно некий умный, опытный человек покажет мне как это можно оптимизировать
ну во первых можно упростить до: PHP: public function CheckTime() { $db = $this->db; $now = time(); $now_time = time() - 60; $sql = "select * from `db_product_time` where `status`=1 and `date_del`<=$now"; $db->Query($sql); $arr = array(); if ($db->NumRows()>0) { while($row = $db->FetchArray()) { if($now_time < $row['date_del']){ $id = $row['id']; $par = $row['name']; $user = $row['id_user']; $sql = "update `db_users_b` set `$par`=`$par`-1 where `id`=$user ; update `db_product_time` set `status`=0, `date_del`=$now where `id`=$id"; $db->Query($sql); } } } } а поидее и это не правильно наверное, но попробуйте.