2010-03-16 60 views
1

這是我使用的代碼:PDO未能準備語句超過13佔位符

self::$DB->prepare($query, $types); 

當$查詢和類型:

//$query 
UPDATE Permisos 
    SET     
     empleado_id = ?, 
     agregar_mensaje = ?, 
     borrar_mensaje = ?, 
     agregar_noticia = ?, 
     borrar_noticia = ?, 
     agregar_documento = ?, 
     borrar_documento = ?, 
     agregar_usuario = ?, 
     borrar_usuario = ?, 
     agregar_empresa = ?, 
     borrar_empresa = ?, 
     agregar_tarea = ? 
    WHERE 
     id = ? 
//$types 
Array(
    [0] => integer 
    [1] => boolean 
    [2] => boolean 
    [3] => boolean 
    [4] => boolean 
    [5] => boolean 
    [6] => boolean 
    [7] => boolean 
    [8] => boolean 
    [9] => boolean 
    [10] => boolean 
    [11] => boolean 
    [12] => integer 
) 

一切都很正常,但是當它們分別是:

//$query 
UPDATE Permisos SET       
     empleado_id = ?, 
     agregar_mensaje = ?, 
     borrar_mensaje = ?, 
     agregar_noticia = ?, 
     borrar_noticia = ?, 
     agregar_documento = ?, 
     borrar_documento = ?, 
     agregar_usuario = ?, 
     borrar_usuario = ?, 
     agregar_empresa = ?, 
     borrar_empresa = ?, 
     agregar_tarea = ?, 
     borrar_tarea = ? 
    WHERE 
id = ? 
//$types 
Array(
     [0] => integer 
     [1] => boolean 
     [2] => boolean 
     [3] => boolean 
     [4] => boolean 
     [5] => boolean 
     [6] => boolean 
     [7] => boolean 
     [8] => boolean 
     [9] => boolean 
     [10] => boolean 
     [11] => boolean 
     [12] => boolean 
     [13] => integer 
    ) 

它失敗,出現以下消息:

<b>Warning</b>: PDO::prepare() [<a href='pdo.prepare'>pdo.prepare</a>]: SQLSTATE[HY000]: General error: PDO::ATTR_STATEMENT_CLASS requires format array(classname, array(ctor_args)); the classname must be a string specifying an existing class in <b>C:\wamp\www\intratin\JP\includes\empleado\mapper\Permiso.php</b> on line <b>137</b><br /> 


不要緊,我添加哪些領域或刪除時,出現超過13個佔位符每次。

回答

3

如果self::$DB->prepare方法實際調用PDO::prepare,確保你不會將該$types參數作爲第二個參數來PDO::prepare

從文檔,第二個參數判斷PDO::prepare預計是一組選項 - 不是描述每個佔位符的數據類型的數組。


並嘗試執行代碼這一部分:

var_dump(PDO::ATTR_STATEMENT_CLASS); 

你會得到這樣的輸出:

int 13 


哪一種解釋錯誤:

  • 您正試圖通過PDO::prepare和數組作爲第二個參數
  • PDO::prepare預計數組包含一個選項列表
  • 您在陣列
  • 13中具有關鍵13元素是PDO::ATTR_STATEMENT_CLASS
  • PDO::preapre預計具體的PDO::ATTR_STATEMENT_CLASS選項 東西
    • 喜歡的東西對應於array(classname, array(ctor_args));,從你的錯誤信息
  • 你正在通過integer而不是那個
  • 所以你得到一個錯誤。


不知道你如何指定的類型與正在使用的類每個綁定參數的 - 但似乎它不是作爲第二個參數prepare ;-)

而且,如果你的self::$DB確實是PDO的一個實例,我沒有找到一種方法可以讓您一次指定所有參數的類型 - 看起來您必須指定每個參數的類型,每次調用bindParambindValue

+0

非常感謝,我從MDB2遷移,並認爲,酷,相同的語法,因爲它的工作,直到現在︰$ 有什麼辦法將類型傳遞給PDO :: prepare,以便它正確地轉義它們,或者是unnecesary? – 2010-03-16 17:35:56

+0

我不認爲你只能在一次調用中傳遞所有類型......我想說,當你調用'bindParam'或'bindValue'時,你必須一個接一個地傳遞它們:你已經傳遞了使用這兩個值中的一個值 - 他們都可以將該類型作爲一個可選參數;;;如果你知道你的數據的類型,通過它不會傷害^^ – 2010-03-16 17:38:17

0

如果您不太在意類型(AFAIK,它們都將是PDO :: PARAM_STR;當您不使用bindValue/bindParam時不能指定它們),您可以執行以下操作:

$params = array('your', 'params', 'here', '...'); // just the params, not the type 
$stmnt = self::$DB->prepare($query); 
$stmnt->execute($params); 

參見PDOStatement的execute方法。

+0

謝謝,僅供參考有一個PDO語句的錯誤,它引用查詢中的整數:http://bugs.php.net/bug.php?id=44639 即使他們的PHP類型是整數,所以直到這是固定的,你必然要綁定它們:S – 2010-03-18 15:14:28