PDO 13 üzerinde yer tutucular ile bir açıklama hazırlamak için başarısız

2 Cevap php

bu ben kullanıyorum kodu:

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

$ sorgu ve türleri olduğunda:

//$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
)

Her şey harika çalışıyor, ama bunlar zaman:

//$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
    )

Bu aşağıdaki iletiyle başarısız:

<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 />


Ben eklemek veya çıkarmak önemli değil, hangi alanda, daha fazla 13 tutucular ile her zaman başarısız olur.

2 Cevap

Eğer self::$DB->prepare yöntem aslında PDO::prepare için ikinci bir parametre olarak PDO::prepare , make sure that you don't pass that $types argüman arıyorsa

Değil, her yer tutucu için veri türünü tanımlayan bir dizi - belgelerine bakılırsa, PDO::prepare beklediği ikinci parametre seçenekleri bir dizidir.


And you try to execute this portion of code :

var_dump(PDO::ATTR_STATEMENT_CLASS);

Bu çıktıyı alırsınız:

int 13


Which kind of explains the error :

  • Siz ikinci parametre olarak PDO::prepare ve dizi geçmek için çalışıyoruz
  • PDO::prepare Bu diziyi seçenekler listesini içeren bekliyor
  • Eğer dizideki 13 tuşu ile bir öğe var
  • 13 olan PDO::ATTR_STATEMENT_CLASS
  • PDO::preapre expects something specific for the PDO::ATTR_STATEMENT_CLASS option
    • bir şey hata mesajı bakarsak, array(classname, array(ctor_args)); tekabül gibi
  • Sen integer yerine bunun geçiyoruz
  • Yani bir hata alıyorum.


Not sure how you can specify the types of each bound parameters with the class you are using -- but it seems it's not as a second parameter to prepare ;-)

Için self::$DB gerçekten PDO'nun bir örneği olduğunu ve eğer, ben bir kerede tüm parametrelerin türlerini belirtmek için izin verecek bir yöntem bulmuyorum - bu her türünü belirtmek zorunda gibi görünüyor parametresi, ya aramak her zaman bindParam or bindValue .

Eğer türleri hakkında çok fazla umurumda değil eğer, aşağıdakileri yapabilirsiniz (AFAIK hepsi PDO :: PARAM_STR olacak; siz bindValue / bindParam kullanmadığınız zaman bunları belirtebilirsiniz olamaz):

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

PDOStatement en execute yöntemine bakın.