MySQL обычный SELECT завершается неудачей

199
04 апреля 2018, 09:33

Есть база данных на 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 тоже ничего нет. Призрак

Answer 1

Ха-ха, похоже, придется

do {
  $res = mysqli_connect();
  usleep(...);
  ...if (...) ... break;
} while (!$res);

Как в клиенте на голых сокетах.

READ ALSO
Объединение двух и более запросов

Объединение двух и более запросов

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

232
Как запретить изменять zoom на своем сайте?

Как запретить изменять zoom на своем сайте?

Бывает, зажимают ctrl и крутят колесико мыши, благодаря чему меняется zoom браузераКак это ограничить?

216
Проверка на все checkbox

Проверка на все checkbox

Задание в том, что: а) Если отмечен хотя бы один checkbox, то добавить классactive б) Если не отмечено ни одно, то удалить класс

279
Плавная прокрутка к блоку jquery

Плавная прокрутка к блоку jquery

Меню фиксированное при прокрутке закрывает собой верх блокачто в jquery добавить чтобы добавить отступ

266