PDO и маленькая проблема placeholder'а и мнимых типов в PHP

В целом, как-то неожиданно и совершенно не вовремя всплыла у меня проблема на пару часов, которые пришлось отвлекаться и разбираться с непонятной «фигней».
Суть проста, вот такой вот незатейливый мой код с использованием 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 и если вы случайно наткнетесь на такие грабли, то вспомните о маленьких заклинаниях «типов»!
  • 0
  • 30 декабря 2009, 00:41
  • MpaK

Комментарии (2)

RSS свернуть / развернуть
+
0
вообще таких проблем не испытывал никогда
юзаю bindParam или bindValue

$query->bindParam(':num',$num,PDO::PARAM_INT);
$query->bindParam(':url',$url,PDO::PARAM_STR);
$query->execute();

см. третий параметр
avatar

xxen

  • 25 января 2010, 08:29
+
0
Ну тут сразу понятно, тип указывается, но мягко говоря я не привержен писать слишком много кода, слишком длинно :)
avatar

MpaK

  • 25 января 2010, 23:56

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.