Ребята помогите, может кто сталкивался - периодически не выполняются запросы Update. Для связи с БД используется PDO, причём 99% всех запросов Update выполняется нормально. И даже те запросы, которые в одном цикле не выполнены могут выполниться в следующем цикле через несколько минут. Редко какая-нибудь строка может вообще не выполняться. Ошибок или PDOException не выдаёт. Код вроде правильный, так как в большинстве случаев он выполняется. Что это может быть?
Варианты: Тупо косяк в коде, который ужасен и поэтому ты не хочешь его показывать. Условие where не попадает в строку, хотя синтаксически всё корректно. Запись происходит, но потом перезаписывается чем-то поверх. Запись невозможна из-за блокировки.
обычно для update -> подготовил запрос и в цикле шлешь биндом значения = профит. Еще используя "INSERT… ON DUPLICATE KEY UPDATE"
Код примерно такой: Код (Text): $data = array( 'status' => "READY", ); $update = $db->update($table, $data, array('id' => $id)); public function update($tableName, array $set, array $where) { $arrSet = array_map( function($value) { return $value . '=:' . $value; }, array_keys($set) ); $stmt = $this->pdo->prepare( "UPDATE $tableName SET " . implode(',', $arrSet) . ' WHERE ' . key($where) . '=:' . key($where) . 'Field' ); foreach ($set as $field => $value) { $stmt->bindValue(':' . $field, $value); } $stmt->bindValue(':' . key($where) . 'Field', current($where)); try { $stmt->execute(); return $stmt->rowCount(); } catch (\PDOException $e) { throw new \RuntimeException("[" . $e->getCode() . "] : " . $e->getMessage()); } } Тут основной нюанс, что всё работает нормально для большинства запросов. А как проверить, заблокирована ли таблица в данный момент? Спасибо, попробую. Пока для мест, в которых стабильно возникает проблема UPDATE сделал обновление через mysqli - ошибки обновления возникают, но очень редко.
Тип таблиц итак InnoDB. На данный момент обновлялось через MySQLi в наиболее критических местах, но хотелось бы конечно придумать какое-то красивое решение.