2010-06-24 13 views
10

Estoy aprendiendo las cuerdas con PDO.PDO posicional y parámetros nombrados como parte de la misma consulta preparada?

Aquí está mi sql (la cantidad de parámetros que pueden aparecer en WHERE es variable).

SELECT 
     ID, title 

    FROM 
     table 

    WHERE 
     something = ? 

    ORDER BY 
     :sort :dir 

    LIMIT 
     :start, :results 

Aquí está mi código:

 $query = $conn->prepare($sql); 

     if ($parameters) { 

      $i = 0; 
      foreach ($parameters AS $parameter) { 

       $i++; 
       $query->bindParam($i, $parameter); 

      } 

     } 

     $query->bindParam(':start', $pagination['start'], PDO::PARAM_INT); 
     $query->bindParam(':results', $pagination['results'], PDO::PARAM_INT); 
     $query->bindParam(':sort', $pagination['sort']); 
     $query->bindParam(':dir', $pagination['dir']); 

     $query->execute(); 

... y aquí es la excepción que genera:

Invalid parameter number: mixed named and positional parameters 

Es imposible combinar los parámetros posicionales y nombrados en la misma ¿consulta? ¿O me estoy perdiendo algo?

Gracias!

+0

No estoy seguro de 'LIMIT', pero' ORDER BY' no acepta parámetros, al menos no en la versión de PHP que estoy usando (5.2.9) – jeroen

+0

MySQL no aceptará * valores cotizados * para las cláusulas 'LIMIT' y' ORDER BY', que es lo que sucederá cuando esos marcadores de posición sean sustituidos. No es un problema de PHP ... y hace que tu pregunta sea discutible. – Charles

Respuesta

9

Sí, es imposible.

PDO.prepare

no puede utilizar ambos marcadores de parámetro con nombre y signo de interrogación dentro de la misma instrucción SQL; elija uno u otro estilo de parámetro.

+1

Ok gracias por la información. Teniendo en cuenta que tengo un número variable de parámetros, ¿es imposible vincular variables a las cláusulas ORDER BY y LIMIT? (Según tengo entendido, solo puede hacer esto con parámetros con nombre. Pero los parámetros con nombre no se prestan a situaciones con un número desconocido de parámetros) – Travis

+1

No puede enlazar nombres de columna, por lo que no puede enlazar: ordenar y : dir. Dar nombres a todos los parámetros. – Naktibalda

2

Utilice una función de envoltura, basta con una función de reemplazo ingenua.

if (strpos($sql, ":")) { 
    $i = -1; 
    while (strpos($sql, "?") && isset($parameters[++$i])) { 
     $parameters[":p$i"] = $parameters[$i]; 
     unset($parameters[$i]); 
     $sql = preg_replace("/[?]/", ":p$i", $sql, 1); 
    } 
} 

Mezcla $ sort y $ dir directamente en la consulta $ sql. Estos dos son identificadores de SQL, no datos.

Cuestiones relacionadas