usan teclado signos signo para niños los interrogacion expresar exclamacion ejemplos php postgresql pdo

php - teclado - ¿Cómo evitar que PDO interprete un signo de interrogación como marcador de posición?



signos de interrogacion ejemplos (3)

Para detectar la existencia de una clave en un hstore , necesito ejecutar una consulta como esta:

SELECT * FROM tbl WHERE hst ? ''foo''

Sin embargo, eso me da una PDOException:

PDOException: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound: SELECT * FROM tbl WHERE hst ? ''foo''

¿Hay alguna forma de escapar del signo de interrogación para que PDO no lo recoja como marcador de posición? He intentado con hasta cuatro barras diagonales inversas, así como un doble signo de interrogación ( ?? ), pero nada parece convencer a PDO de que deje solo el signo de interrogación.


Sugiero que deshabilite la declaración preparada nativa de PDO para que los signos de interrogación se ignoren:

$pdo->setAttribute(/PDO::ATTR_EMULATE_PREPARES, true);


Tuve el mismo problema al buscar datos JSONB. La pregunta completa está aquí

SELECT * FROM post WHERE locations ? :location;

La solución en PostgreSQL 9.5 es similar:

SELECT * FROM post WHERE jsonb_exists(locations, :location);

También abrí un boleto en el sistema de rastreo de fallas de PHP

Actualizar

Como Diabl0 mencionó, la solución propuesta funciona, pero no usa el índice. Probado con:

CREATE INDEX tempidxgin ON post USING GIN (locations);


Use el formulario de llamada de función. De acuerdo con los catálogos del sistema, el hstore ? el operador usa la función exist :

regress=# select oprname, oprcode from pg_operator where oprname = ''?''; oprname | oprcode ---------+--------- ? | exist (1 row)

para que puedas escribir:

SELECT * FROM tbl WHERE exist(hst,''foo'');

(Personalmente, no soy un gran admirador del diseño y la documentación centrados en el operador de hstore, creo que descarta las útiles propiedades de auto-documentación de una interfaz basada en funciones sin ningún beneficio real y usualmente uso sus llamadas de función en lugar de sus operadores. porque puedes definir operadores no significa que debas).