Mysql многократное запросы

readerchik

Новичок
Всем привет помогите решить проблему
итак php 5.4
mysql и mysqli стоит на двух разных серверах

проблема есть запрос элементарный

файл test.php

в нем следующий код к примеру

if ($_GET['act'] == '1' && isset($_GET['type'])) {
$type = abs($_GET['type']);

$mess = sql_row("SELECT * FROM `mess` WHERE `id` = 1 LIMIT 1;");
if ($mess['type'] == 0) {
sql_query("UPDATE `mess` SET `type` = ".$type." WHERE `id` = 1 LIMIT 1;");
echo 'save end type = '.$type;
}
}


перейдя по ссылке "test.php?act=1&type=rand(1, 100)"
мы логически запишем в базу 123 в таблицу `mess` НО

если онлайн большой и по этой ссылке перейдут 20 пользователей в одну секунду получится бред в лучшем случаи запишется последний кто нажал на ссылку

Как исправить большой поток к данным
 

AnrDaemon

Продвинутый новичок
Вам не кажется, что у вас очевидное несоответствие поставновки задачи и применённого решения?…
 

Фанат

oncle terrible
Команда форума
получится бред в лучшем случае запишется последний кто нажал на ссылку
бред или не бред - зависит от постановки задачи.
а никакой задачи я здесь не вижу

в общем же случае "записать последнего, кто нажал на ссылку" - это НОРМАЛЬНОЕ поведение
 

readerchik

Новичок
Вам не кажется, что у вас очевидное несоответствие поставновки задачи и применённого решения?…
я не просил меня критиковать
подскажите как сделать правильно поделитесь опытом
бред или не бред - зависит от постановки задачи.
а никакой задачи я здесь не вижу

в общем же случае "записать последнего, кто нажал на ссылку" - это НОРМАЛЬНОЕ поведение
ты не понял
или я не доступно изложил чуть проблемы

проблема в том что нужно при первом клике закрывать роботу данного скрипта и не допустить повторных обращений к нему

к примеру если там будет покупка товара все покликают и все купят ??? по твоему вот и бред
 

Фанат

oncle terrible
Команда форума
К примеру если там будет покупка товара, то первый купит, а остальным напишет, что больше нет.

У тебя какая-то реальная проблема есть или ты просто так, фантазируешь?
Если реальная - то возьми и опиши ее наконец, без всяких "допустим" и "если"
А с фантазиями - это не сюда, это к доктору.
 

readerchik

Новичок
К примеру если там будет покупка товара, то первый купит, а остальным напишет, что больше нет.

У тебя какая-то реальная проблема есть или ты просто так, фантазируешь?
Если реальная - то возьми и опиши ее наконец, без всяких "допустим" и "если"
А с фантазиями - это не сюда, это к доктору.
Я тебе описал проблему
проблема в том что нужно при первом клике закрывать роботу данного скрипта и не допустить повторных обращений к нему

еще раз пишу
есть действие после нажатия на кнопку
при большом онлайне (иногда не всегда) срабатывает это действие два раза хотя стоит 3 проверки и перепроверки на запись ранее в базу данных

вот пример

$test1_id = 1;
$is_zay = sql_row("SELECT `id` FROM `test1` WHERE `id` = '".$test1_id."' AND `start` = 0 LIMIT 1;");
if (!empty($is_zay['id'])) {

sql_query("UPDATE `test1` SET `start` =1 WHERE `id` = '".$test1_id."' LIMIT 1;");

текст скрипта ......

в конце

$is_zay = sql_row("SELECT `id`, start FROM `test1` WHERE `id` = '".$test1_id."' AND `start` = 1 LIMIT 1;");

if (!empty($is_zay['id'])) { return true;
} else {
echo 'ОШИБКА --- ('.$is_zay['id'].') = '.$test1_id.' заявка уже создана создана;
}
}


так вот если много раз этот скрипт нажимают то должно по правилам остановить еще вверху вот тут "if (!empty($is_zay['id'])) { UPDATE `test1` SET `start` =1"
но он в лучшем случаи останавливает тут echo 'ОШИБКА --- ('.$is_zay['id'].') = '. итд
 

readerchik

Новичок
я вот сам написал функцию подскажите хоть оно или нет

/***------------------------------------------
* Блокируем таблицы на время выполнения
*
* sql_lock_tables(false) = очистить блок таблиц
* sql_lock_tables(array('таблица1', 'таблица2')) = поставить блок таблиц
*
**/

function sql_lock_tables($lock_data) {
if ($lock_data == false) sql_query("UNLOCK TABLES;"); else {
$s_losk = ''; foreach ($lock_data as $k => $v_tabl) $s_losk .= ($k>0?', ':'').$v_tabl.' WRITE';
if($s_losk) sql_query("LOCK TABLES ".$s_losk.";");
}
}
 

Фанат

oncle terrible
Команда форума
PHP:
sql_query("UPDATE test1 SET start = 1 WHERE `id` = $test1_id and start =0");
Дальше смотришь, сколько строк обновилось.
если ни одной - значит уже стартовали.
 

Фанат

oncle terrible
Команда форума
Должна, но это может вызвать другие проблемы.
Блокирование таблиц целиком - вещь опасная.

Делать надо так, как описано у меня: из задачи исключается селект, и в итоге становится ненужной явная блокировка
 
Последнее редактирование:
Сверху