2010-10-19 53 views
1

我具有類似於下面的代碼:的Postgres/PHP PDO :: PDOStatement-> bindParam()以字符(1)字段

$data['someField'] = (isset($_POST['someField'])) ? 'Y' : 'N'; 
$stmt = $db->prepare("INSERT INTO public.someTable (someField) VALUES (':someField');"); 
$stmt->bindParam(':someField', ($data['someField']), PDO::PARAM_STR, 1); 
$db->beginTransaction(); 
$stmt->execute(); 
$db->commit(); 

該字段是一個字符(1),其中包含Y或N(我寧願使用bool/int(1),但我不能改變這種情況)。正如你所看到的,這將從HTML表單獲取POST數據,並根據複選框設置Y或N.當我回應它時,該變量看起來正確設置。查詢工作,如果我手動把一個「Y」或「N」到語句,但使用bindParam()我收到以下錯誤時:

SQLSTATE[22001]: String data, right truncated: 7 ERROR: value too long for type character(1) 

真正奇怪的是,即使我做這樣的事情:

$stmt->bindParam(':someField', substr($data['someField'], -1), PDO::PARAM_STR, 1); 

我仍然得到錯誤。從在php.net功能頁面上的用戶評論:

Steve M 19-Nov-2009 07:28 Note that when using PDOStatement::bindParam an integer is changed to a string value upon PDOStatement::execute(). (Tested with MySQL).

還有就是這個沒有再提起,或者對如何避開任何事情。我假設這是問題的根源。我也嘗試過使用bindValue()而沒有任何改變。

回答

1

發現這個問題在這裏的答案:String encoding problem on PdoStatement->bindParam()?

基本上PDO將自動躲避參數給你,所以當我做了我的查詢:

"INSERT INTO public.someTable (someField) VALUES (':someField');" 

一旦PDO是用它做它結束了這樣看:

"INSERT INTO public.someTable (someField) VALUES (''Y'');" 

正確使用準備()函數的是:

$stmt = $db->prepare("INSERT INTO public.someTable (someField) VALUES (:someField);");