2010-03-12 15 views
19

En esencia, tengo un valor que tengo que llamar un par de veces en mi consulta SQL. Por lo tanto, ¿es posible reutilizar el mismo marcador de posición nombrado en la declaración, p. SELECT :Param FROM Table WHERE Column = :Param, luego simplemente bindValue (": Param"), y tiene el valor para ambos: ¿Params?PDO Parameterized Query - ¿Reutiliza named placeholders?

+0

¿Por qué no lo intentas? PDO :: prepare dice yes y PDOStatement :: execute dice que puede ser necesario cerrar el cursor db en función del controlador. –

+0

Lo probé, seguí recibiendo un error, pero pensé que estaba haciendo algo diferente. No se pudo encontrar nada en los documentos (estaba buscando en PDO :: bindParam). Lo encontré en PDO :: preparate, ¡gracias por indicarme la dirección correcta! – gamers2000

+0

FYI - esto respondió exactamente mi pregunta también. 1 up para ti :) – meteorainer

Respuesta

18

PDO::prepare indica que "no se puede usar un marcador de parámetro con nombre del mismo nombre dos veces en una declaración preparada", así que supongo que es un no entonces.

+8

Los documentos no son completamente correctos. Si 'PDO :: ATTR_EMULATE_PREPARES' es' true', PDO * SES * admite la reutilización de marcadores de parámetros nombrados. – Mike

+2

Parece que alguien actualizó los documentos. Ahora dice "No se puede usar un marcador de parámetro con nombre del mismo nombre más de una vez en una declaración preparada, a menos que el modo de emulación esté activado". – Mike

+1

Tienes razón en parte. Sin embargo, 'SELECT: Param' es imposible, ya que no puede enlazar tablas/columnas. Consulte http://stackoverflow.com/q/182287/ –

1

Además de la reutilización, el problema principal aquí es que está intentando cambiar dinámicamente los nombres de los cols.

Esta respuesta Publicado por un usuario anónimo en http://php.net/manual/en/pdo.prepare.php:

Para los que se preguntan por qué la adición de cotizaciones a alrededor de un marcador de posición es incorrecta, y por qué no se puede utilizar marcadores de posición para los nombres de tabla o columna:

Existe un error común acerca de cómo funcionan los marcadores de posición en las declaraciones preparados: no se sustituyen simplemente como cadenas escapadas y se ejecuta el SQL resultante. En cambio, un DBMS pedido "preparar" una declaración surge con un plan de consulta completo de cómo ejecutaría esa consulta, incluidas las tablas e índices que usaría , independientemente de cómo se rellene el marcadores de posición.

El plan de "seleccione el nombre desde mi_tabla donde id =: valor" será el mismo lo que sustituto de ": valor", pero el aparentemente similares "seleccione el nombre desde: tabla WHERE id =: valor" no puede planeado, porque el DBMS no tiene idea de qué tabla realmente va a seleccionar.

incluso cuando se utiliza "emulado prepara", PDO no puede dejar de usar marcadores de posición en cualquier lugar, ya que tendría que trabajar en lo que significado: significa "Seleccionar: foo De some_table" media ": foo" va a ser una referencia de columna , o una cadena literal?

Cuando la consulta utiliza una referencia de columna dinámica, debe incluir explícitamente en la lista blanca las columnas que sabe que existen en la tabla, p. Ej. utilizando una instrucción switch con una excepción lanzada en la cláusula default:

1

Puede si establece PDO::ATTR_EMULATE_PREPARES = true.

E.g. $connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);.

Si está utilizando Laravel, puede configurarlo en una matriz options en config/database.php. p.ej. PDO::ATTR_EMULATE_PREPARES => true