[ZF] Vraagteken escapen in query

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 19:04
Normaal gesproken kun je met Zend Framework (1.12) data in je query quoten.

SQL:
1
SELECT * FROM table WHERE col > ?


Nu ben ik met postgresql bezig met een JSONB datatype, deze heeft operators die een vraagteken bevatten. Het uitvoeren van de query gaat dan niet, omdat Zend_Db het vraagteken wil vervangen door een variabele.

Ik wil gewoon iets simpels doen als:

PHP:
1
$db->query('SELECT \'["a","d", "E"}\' ?| \'{"a", "b"}\'');


Bovenstaande code is geldige SQL en zou TRUE moeten teruggeven, omdat één van de elementen uit de rechter array in de json array zitten.

Wat ik heb geprobeerd:
- Dubbel vraagteken (blijft dubbel vraagteken)
- Quoten met dubbele of enkele quotes
- Slashes ervoor (1-3 geprobeerd)
- Dubbelepunt ervoor (in ZF is dat een named param)
- Zend_Db Expr ervan maken

Google is ook niet echt behulpzaam. Ik ben bang dat het niet gaat werken, maar ik heb nog een klein beetje hoop dat hier nog iemand een goed idee heeft!

"Chaos kan niet uit de hand lopen"

Beste antwoord (via storeman op 05-02-2016 15:40)


  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
storeman schreef op vrijdag 05 februari 2016 @ 15:14:
[...]


Interessant, maar dat is ZF2/3, geen 1.
Ah, je had er niet bij verteld dat het ZF1 moest zijn. edit: ah, toch wel. Excuus.
Ik heb echter het antwoord gevonden. Ik kan het "?" vervangen door "{postgres qm}", het lijkt eerder een probleem te zijn met de prepared statements dan met ZF zelf.
Dat klopt, daarom gaf ik je een manier om een "raw" sql-query uit te voeren, die dus niet prepared wordt.
Als dat werkt is dat prima, natuurlijk. Maar dan moet je dus al je queries gaan rewriten.
Ook in ZF1 zou het mogelijk moeten zijn om queries rechtstreeks uit te voeren, non-prepared dus.
Ik heb dit nog gevonden:
Running Other Database Statements
Most PHP database extensions provide a method to execute SQL statements without preparing them. For example, in PDO, this method is exec(). You can access the connection object in the PHP extension directly using getConnection().
[...]
Example #34 Running a Non-Prepared Statement in a PDO Adapter
PHP:
1
$result = $db->getConnection()->exec('DROP TABLE bugs');

[ Voor 16% gewijzigd door HyperioN op 05-02-2016 15:53 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Wat werkt er niet aan Zend_Db_Expr gebruiken? Lijkt mij speciaal hiervoor bedoeld.

Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 19:04
Hmm, zou kunnen:
PHP:
1
$db->query('SELECT \'["a","d", "E"}\' ?| \'{"a", "b"}\'', new Zend_Db_Expr('?'));


Maar eigenlijk slaat dat nergens op natuurlijk.

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
In some cases, you have to execute statements directly. The primary purpose for needing to execute sql instead of prepare and execute a sql statement. [...]
PHP:
1
$db->query('SELECT \'["a","d", "E"}\' ?| \'{"a", "b"}\'', \Zend\Db\Adapter\Adapter::QUERY_MODE_EXECUTE);

[ Voor 24% gewijzigd door HyperioN op 05-02-2016 15:12 ]


Acties:
  • +1 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 19:04
HyperioN schreef op vrijdag 05 februari 2016 @ 15:11:
[...]

PHP:
1
$db->query('SELECT \'["a","d", "E"}\' ?| \'{"a", "b"}\'', \Zend\Db\Adapter\Adapter::QUERY_MODE_EXECUTE);
Interessant, maar dat is ZF2/3, geen 1.

Ik heb echter het antwoord gevonden. Ik kan het "?" vervangen door "{postgres qm}", het lijkt eerder een probleem te zijn met de prepared statements dan met ZF zelf.

Bedankt voor het meedenken!

Uiteindelijk dit gevonden: http://stackoverflow.com/...perator-outside-of-quotes

"Chaos kan niet uit de hand lopen"


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
storeman schreef op vrijdag 05 februari 2016 @ 15:14:
[...]


Interessant, maar dat is ZF2/3, geen 1.
Ah, je had er niet bij verteld dat het ZF1 moest zijn. edit: ah, toch wel. Excuus.
Ik heb echter het antwoord gevonden. Ik kan het "?" vervangen door "{postgres qm}", het lijkt eerder een probleem te zijn met de prepared statements dan met ZF zelf.
Dat klopt, daarom gaf ik je een manier om een "raw" sql-query uit te voeren, die dus niet prepared wordt.
Als dat werkt is dat prima, natuurlijk. Maar dan moet je dus al je queries gaan rewriten.
Ook in ZF1 zou het mogelijk moeten zijn om queries rechtstreeks uit te voeren, non-prepared dus.
Ik heb dit nog gevonden:
Running Other Database Statements
Most PHP database extensions provide a method to execute SQL statements without preparing them. For example, in PDO, this method is exec(). You can access the connection object in the PHP extension directly using getConnection().
[...]
Example #34 Running a Non-Prepared Statement in a PDO Adapter
PHP:
1
$result = $db->getConnection()->exec('DROP TABLE bugs');

[ Voor 16% gewijzigd door HyperioN op 05-02-2016 15:53 ]


Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 19:04
Ik had 1.12 wel in de OT gezet, maar niet heel prominent inderdaad.

Dit lijkt inderdaad te werken! Die {postgres qm} werkte nog niet in een specifiek geval, maar die getConnection()->exec wel. Ik kan dit ook heel eenvoudig ombouwen, het is een db-migratie engine, die wil toch altijd raw-access.

Hartelijk dank!

"Chaos kan niet uit de hand lopen"

Pagina: 1