Есть база данных на MySQL, в ней таблица из 24 полей, обычная, MyISAM, всего лишь 2,628 строки
Через API время от времени делаются запросы к этой таблице через PHP/mysqli, где обычный SELECT по одному полю ищет одну строку
В большинстве случаев происходит два варианта:
На днях поступили жалобы, что клиенты обращаются к этой таблице, и им выдается результат - запись не найдена, я смотрю лог сохраненных запросов, беру оттуда значение поля для поиска, и запись с таким полем нахожу. Причем при создании записи проставляется время, и на момент запроса эта запись в таблице точно была
Запрос к базе делается очень просто:
function element_GetByNumber($number) {
$data = db_query("SELECT * FROM `table` WHERE `number` = '" . db_escape($number) . "' LIMIT 1;");
if ($data && $row = mysqli_fetch_assoc($data)) {
return $row;
}
return NULL;
}
Сама функция db_query
описана еще проще:
function db_query($query) {
if ($GLOBALS['DB_LINK']) {
return mysqli_query($GLOBALS['DB_LINK'], $query);
} else
if (db_connect()) {
return mysqli_query($GLOBALS['DB_LINK'], $query);
}
return false;
}
Подключение к базе в виде db_connect()
открывается в начале работы и закрывается по завершению, то есть отсутствие подключения можно исключить. Линк до базы сохраняется в глобальную переменную и не меняется, база одна
При такой просто те есть нотариально заверенные скриншоты от клиентов и подтверждение в логах, что элемент, который есть в таблице и должен быть найден, возвращает "не найден", то есть NULL
Никак не могу понять, в чем дело, и почему в некоторых случаях обычный SELECT может давать сбой
Возможно с подобным кто-то уже сталкивался, какие могут быть варианты, куда смотреть, что проверять, что исправлять?
На данный момент я добавил лог по результату запроса с выводом самого результата и последней ошибки SQL в надежде, что они прояснят ситуацию. Что еще можно предпринять для отлова этой бяки?
UPD: Лог дал дополнительную информацию. При подключении mysqli_connect выдает false. Похоже, проблема была как раз в отсутствии подключения. Добавил в лог вывод ошибки подключения, жду результата
UPD2: Выяснил, что mysqli_connect выдает false молча, mysqli_connect_error() пустой и mysqli_connect_errno() равен 0 после подключения. Все очень плохо. Добавил временный костыль с 10 подключениями с паузой в 10мс и еще больше логов. В логах MySQL ничего нет, в логах Apache тоже ничего нет. Призрак
Ха-ха, похоже, придется
do {
$res = mysqli_connect();
usleep(...);
...if (...) ... break;
} while (!$res);
Как в клиенте на голых сокетах.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть два (дальше будет больше) запроса, производящих выборку по одной и той же схеме, но с разными входными даннымиВид запроса
Бывает, зажимают ctrl и крутят колесико мыши, благодаря чему меняется zoom браузераКак это ограничить?
Задание в том, что: а) Если отмечен хотя бы один checkbox, то добавить классactive б) Если не отмечено ни одно, то удалить класс
Меню фиксированное при прокрутке закрывает собой верх блокачто в jquery добавить чтобы добавить отступ