В целом, как-то неожиданно и совершенно не вовремя всплыла у меня проблема на пару часов, которые пришлось отвлекаться и разбираться с непонятной «фигней».
Суть проста, вот такой вот незатейливый мой код с использованием PDO коннектора к базе MySQL, упорно выдавал на части данных неприятный exception:
«SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'url' cannot be null»
Если гасить ошибки PDO::ERRMODE_SILENT ошибки нет, но и вставка не происходит, из консоли всё замечательно, даже тупо проверил себя написав этот же кусок в Perl (DBI), вставляется как надо и совершенно без проблем.
protected function new_user( &$user ){
try{
$query = $this->db->prepare("INSERT INTO `users`
(name, screen_name, url, location, time_zone, utc_offset) VALUES
(:name, :screen_name, :url, :location, :time_zone, :utc_offset)
");
$res = $query->execute( array(
':name'=>$user['name'], ':screen_name'=>$user['screen_name'],
':url'=>$user['url'], ':location'=>$user['location'],
':time_zone'=>$user['time_zone'], ':utc_offset'=>$user['utc_offset']
));
} catch (PDOException $e) {
echo 'ERROR msg: '.$e->getMessage();
return FALSE;
}
return $this->db->lastInsertId();
}
Сталкивались с такой бедой PDO?
А знаете в чем суть? Глупо, но PHP всё же не так прозрачен для типов язык и потому сложно тем же компонентам как PDO определять действительно ли у нас есть $user['url'], строка ли это или целочисленный тип…
Поэтому проблема решилась, только указав даже пустым значениям тип по принуждению, PDO не понимал типы переменных для экранирования, поставил приведение всех переменных к типу (string) $user['url'] и (integer) где надо, всё прошло удачно…
Удачи и вам в работе с PDO и если вы случайно наткнетесь на такие грабли, то вспомните о маленьких заклинаниях «типов»!
Комментарии (2)
RSS свернуть / развернутьюзаю bindParam или bindValue
см. третий параметр
xxen
MpaK
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.