За последние 24 часа нас посетили 17650 программистов и 1656 роботов. Сейчас ищут 954 программиста ...

PDO:: не срабатывает запрос

Тема в разделе "Прочие вопросы по PHP", создана пользователем xfreewindx, 30 авг 2012.

  1. xfreewindx

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

    С нами с:
    22 фев 2012
    Сообщения:
    55
    Симпатии:
    0
    Здравствуйте!
    ДБ MySQL, столкнулся с проблемой, не вставляются строки в БД.
    Раньше все было нормально пока с датой не стал работать.
    вот к примеру функция, которая записывает id сессии в БД.
    Код (Text):
    1. private function openSession($id_user) {
    2.         // генерируем SID
    3.         $sid = $this->generateStr(20);
    4.  
    5.         // вставляем SID в БД
    6.         $now = date('Y-m-d H:i:s');
    7.         $time_start = $now;
    8.         $time_last = $now;
    9.         $query = "INSERT INTO `sessions` (`id_user`, `sid`, `time_start`, `time_last`)
    10.                   VALUES (:id_user, :sid, :time_start, :time_last)";
    11.         $this->dbDriver->insert($query, array(':id_user' => $id_user, ':sid' => $sid,
    12.             ':time_start' => $time_start, ':time_last' => $time_last));
    13.  
    14.         // регистрируем сессию в PHP сессии
    15.         $_SESSION['sid'] = $sid;
    16.  
    17.         // возвращаем SID
    18.         return $sid;
    19.     }
    В SQL-запросе есть поле дата-тайм. В БД поля time_last и time_start имеют тип datatime.
    Не вставляются у меня записи в БД именно если запрос содержит дату и время.

    Есть у меня драйвер БД, который умеет вставлять, удалять, выбирать и обновлять записи в БД. Использует PDO. Старался сделать его универсальным, чтобы использовать в будущем. Там как раз функция insert реализована.
    Код (Text):
    1.  
    2. class MySQL {
    3.  
    4.     private static $instance;
    5.  
    6.     public static function instanceMySQL() {
    7.         if (self::$instance == NULL)
    8.             self::$instance = new MySQL();
    9.  
    10.         return self::$instance;
    11.     }
    12.  
    13.     /**
    14.      * Функция возвращает экземпляр класса PDO для подключения к базе данных.
    15.      * @return PDO
    16.      * @throws PDOException
    17.      */
    18.     private function dbConnect() {
    19.         // подключаем конфигурацию базы данных
    20.         require_once('m/db_config.php');
    21.  
    22.         // подключаемся к БД
    23.         try {
    24.             $dbh = new PDO("mysql:dbname={$dbname}; host={$hostname}", $username, $password);
    25.             if (empty($dbh))
    26.                 throw new PDOException;
    27.  
    28.             return $dbh;
    29.         } catch (PDOException $e) {
    30.             die('Ошибка соединения с БД: ' . $e->getMessage());
    31.         }
    32.     }
    33.  
    34.     /**
    35.      * Производит связывание параметров для последующей подготовки запроса.
    36.      * @param PDOStatement $stmt - экземпляр PDO.
    37.      * @param array $args - массив с параметрами.
    38.      * @return PDOStatement - ссылка на объект с подготовленными параметрами.
    39.      */
    40.     private function dataBinding(PDOStatement $stmt, array $args) {
    41.         foreach ($args as $key => &$value) {
    42.             $data_type = is_numeric($value) ? PDO::PARAM_INT : PDO::PARAM_STR;
    43.             $stmt->bindParam($key, $value, $data_type);
    44.         }
    45.  
    46.         return $stmt;
    47.     }
    48.  
    49.     /**
    50.      * Функция делает выборку соответствующего запроса из базы данных.
    51.      * @param $query - строка запроса.
    52.      * @param array $args - массив с параметрами SQL-запроса, для сопоставления. Если массив пустой, идет выборка списка статей,
    53.      * если есть параметры, то происходит выборка конкретной статьи.
    54.      * @return array|mixed - возвращает выборку из базы данных.
    55.      */
    56.     public function select($query, $args = array()) {
    57.         $pdo = $this->dbConnect();
    58.  
    59.         if (empty($args)) {
    60.             $stmt = $pdo->prepare($query);
    61.             $stmt->execute();
    62.  
    63.             return $stmt->fetchAll();
    64.         } else {
    65.             $stmt = $pdo->prepare($query);
    66.             $this->dataBinding($stmt, $args);
    67.             $stmt->execute();
    68.  
    69.             return $stmt->fetch();
    70.         }
    71.     }
    72.  
    73.     /**
    74.      * Функция осуществляет вставку статьи в БД.
    75.      * @param $query - строка запроса.
    76.      * @param $args - массив с параметрами SQL-запроса, для сопоставления.
    77.      * @return int - возвращает идентификатор статьи созданной в БД.
    78.      */
    79.     public function insert($query, $args) {
    80.         $pdo = $this->dbConnect();
    81.         $stmt = $pdo->prepare($query);
    82.         $this->dataBinding($stmt, $args);
    83.         $stmt->execute();
    84.  
    85.         return $pdo->lastInsertId();
    86.     }
    87.  
    88.     /**
    89.      * Функция обновляет статью в БД.
    90.      * @param $query - строка запроса.
    91.      * @param $args - массив с параметрами SQL-запроса, для сопоставления.
    92.      * @return int - возвращает идентификатор обновленной статьи в БД.
    93.      */
    94.     public function update($query, $args) {
    95.         $pdo = $this->dbConnect();
    96.         $stmt = $pdo->prepare($query);
    97.         $this->dataBinding($stmt, $args);
    98.         $stmt->execute();
    99.  
    100.         return $stmt->rowCount();
    101.     }
    102.  
    103.     /**
    104.      * Функция удаляет статью из БД.
    105.      * @param $query - строка запроса.
    106.      * @param $args - массив с параметрами SQL-запроса, для сопоставления.
    107.      * @return int - возвращает идентификатор удаленной статьи из БД.
    108.      */
    109.     public function delete($query, $args) {
    110.         $pdo = $this->dbConnect();
    111.         $stmt = $pdo->prepare($query);
    112.         $this->dataBinding($stmt, $args);
    113.         $stmt->execute();
    114.  
    115.         return $stmt->rowCount();
    116.     }
    117.  
    118. }
    Может в нем где-то ошибка?
    Не пойму почему не отрабатывает insert, если фигурируют поля с типом DATETIME.
     
  2. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    вроде бы вместо :id_user надо вставлять знак ?
     
  3. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    это в mysqli "?"

    думаю ошибка в несовпадении типа параметра. дата она такая дата!
    в любом случае, ОШИБКИ ИСПРАВЛЯЮТСЯ ПОСЛЕ ЧТЕНИЯ СООБЩЕНИЙ ОБ ОШИБКАХ. смотри чего там ругаеццо
     
  4. xfreewindx

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

    С нами с:
    22 фев 2012
    Сообщения:
    55
    Симпатии:
    0
    Понятно.
    Да вроде не ругается она, скрипт отрабатывает и привет. Может логи какие глянуть?
    Насчет несовпадения типов я тоже думал. Я использую PDO::pARAM_INT и PDO::pARAM_STR. Это в функции dataBinding драйвера MySQL. А вот конкретно для datatime в PDO никакой константы нет.
     
  5. ваяс

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

    С нами с:
    8 июн 2012
    Сообщения:
    99
    Симпатии:
    0
    Код (Text):
    1. $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
    Можешь попробовать ошибку таким образом отлавить. Или посмотри как дебаг люди используют. Быстро найдешь ошибки.
    И в pdo то же
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    а, ну да. Positional and Named Placeholders.
     
  7. xfreewindx

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

    С нами с:
    22 фев 2012
    Сообщения:
    55
    Симпатии:
    0
    спасибо, буду пробовать.