За последние 24 часа нас посетили 22807 программистов и 1262 робота. Сейчас ищут 813 программистов ...

Периодически не работает Update через PDO

Тема в разделе "PHP и базы данных", создана пользователем Andreyolex, 7 май 2021.

Метки:
  1. Andreyolex

    Andreyolex Новичок

    С нами с:
    7 май 2021
    Сообщения:
    3
    Симпатии:
    0
    Ребята помогите, может кто сталкивался - периодически не выполняются запросы Update. Для связи с БД используется PDO, причём 99% всех запросов Update выполняется нормально. И даже те запросы, которые в одном цикле не выполнены могут выполниться в следующем цикле через несколько минут. Редко какая-нибудь строка может вообще не выполняться.
    Ошибок или PDOException не выдаёт. Код вроде правильный, так как в большинстве случаев он выполняется. Что это может быть?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Варианты:
    Тупо косяк в коде, который ужасен и поэтому ты не хочешь его показывать.
    Условие where не попадает в строку, хотя синтаксически всё корректно.
    Запись происходит, но потом перезаписывается чем-то поверх.
    Запись невозможна из-за блокировки.
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    обычно для update -> подготовил запрос и в цикле шлешь биндом значения = профит. Еще используя "INSERT… ON DUPLICATE KEY UPDATE"
     
  4. Andreyolex

    Andreyolex Новичок

    С нами с:
    7 май 2021
    Сообщения:
    3
    Симпатии:
    0
    Код примерно такой:
    Код (Text):
    1.    
    2. $data = array(
    3.         'status' => "READY",
    4.     );
    5.     $update = $db->update($table, $data, array('id' => $id));  
    6.    
    7.     public function update($tableName, array $set, array $where) {
    8.         $arrSet = array_map(
    9.                 function($value) {
    10.             return $value . '=:' . $value;
    11.         }, array_keys($set)
    12.         );
    13.  
    14.         $stmt = $this->pdo->prepare(
    15.                 "UPDATE $tableName SET " . implode(',', $arrSet) . ' WHERE ' . key($where) . '=:' . key($where) . 'Field'
    16.         );
    17.  
    18.         foreach ($set as $field => $value) {
    19.             $stmt->bindValue(':' . $field, $value);
    20.         }
    21.         $stmt->bindValue(':' . key($where) . 'Field', current($where));
    22.         try {
    23.             $stmt->execute();
    24.  
    25.             return $stmt->rowCount();
    26.         } catch (\PDOException $e) {
    27.             throw new \RuntimeException("[" . $e->getCode() . "] : " . $e->getMessage());
    28.         }
    29.     }
    Тут основной нюанс, что всё работает нормально для большинства запросов.
    А как проверить, заблокирована ли таблица в данный момент?

    Спасибо, попробую.

    Пока для мест, в которых стабильно возникает проблема UPDATE сделал обновление через mysqli - ошибки обновления возникают, но очень редко.
     
  5. musicman3

    musicman3 Активный пользователь

    С нами с:
    30 июн 2019
    Сообщения:
    144
    Симпатии:
    12
    Адрес:
    Дыра на карте
    Может быть нужно использовать InnoDB вместо MyISAM для MySQL? Транзакции.
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    Некропостер
     
  7. musicman3

    musicman3 Активный пользователь

    С нами с:
    30 июн 2019
    Сообщения:
    144
    Симпатии:
    12
    Адрес:
    Дыра на карте
    Не хороните, может он еще живой ;)
     
  8. Andreyolex

    Andreyolex Новичок

    С нами с:
    7 май 2021
    Сообщения:
    3
    Симпатии:
    0
    Тип таблиц итак InnoDB. На данный момент обновлялось через MySQLi в наиболее критических местах, но хотелось бы конечно придумать какое-то красивое решение.