Discussion:
[TYPO3-german] prepared statements in Extbase TYPO3 7.6
Alexander Künzl
2016-04-06 16:13:16 UTC
Permalink
Guten Abend an die Liste,

ich habe eine Frage zu Extbase und hoffe, jemand kann mir helfen: Ich
möchte eine direkte SQL-Abfrage schreiben, da die Repository-Methoden in
diesem Fall zu kurz greifen.

Ich möchte die Abfrage als prepared statement abschicken, etwa so (nur
zur Veranschaulichung des Problems, die eigentliche Abfrage ist komplexer):

$suchString = $uebergebenerSuchparameter;
$query = $this->createQuery();
$query->getQuerySettings()->usePreparedStatement(TRUE);
$sql = 'SELECT DISTINCT tabelle.* from tabelle as objekt WHERE
objekt.name LIKE ?'
$query->statement($sql, array("%$suchString%"));
return $query->execute();

Die Verarbeitung des Fragezeichens als Platzhalter funktionert so aber
leider nicht; Ich erhalte einen SQL-Fehler:

You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near '?

Anmerkungen:

1. Die SQL-Syntax (mit Ausnahme des nicht verarbeiteten Fragezeichens)
ist bei allen getesteten Abfragen korrekt: Wenn ich die Variable und die
Begrenzer direkt in die Abfrage schreibe, funktioniert alles.

2. Unter TYPO3 6.2 funktioniert die Abfrage über das prepared statement
noch.

3. Ich habe gesehen, dass ab Version 7.0 für das Binden von Parametern
prepared statements verwendet werden müssen. Heißt dass, dass ich das
entsprechende Kernobjekt selbst bauen muss?

Vielen Dank schonmal fürs Ansehen und einen schönen Abend aus Franken,

Mit freundlichen Grüßen

Alexander Künzl
Alexander Künzl
2016-04-07 11:57:17 UTC
Permalink
Hallo an die Liste,

ich habe eine Frage zu Extbase und hoffe, jemand kann mir helfen: Ich
möchte eine direkte SQL-Abfrage schreiben, da die Repository-Methoden in
diesem Fall zu kurz greifen.

Ich möchte die Abfrage als prepared statement abschicken, etwa so (nur
zur Veranschaulichung des Problems, die eigentliche Abfrage ist komplexer):

$suchString = $uebergebenerSuchparameter;
$query = $this->createQuery();
$query->getQuerySettings()->usePreparedStatement(TRUE);
$sql = 'SELECT DISTINCT tabelle.* from tabelle as objekt WHERE
objekt.name LIKE ?'
$query->statement($sql, array("%$suchString%"));
return $query->execute();

Die Verarbeitung des Fragezeichens als Platzhalter funktionert so aber
leider nicht; Ich erhalte einen SQL-Fehler:

You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near '?

Anmerkungen:

1. Die SQL-Syntax (mit Ausnahme des nicht verarbeiteten Fragezeichens)
ist bei allen getesteten Abfragen korrekt: Wenn ich die Variable und die
Begrenzer direkt in die Abfrage schreibe, funktioniert alles.

2. Unter TYPO3 6.2 funktioniert die Abfrage über das prepared statement
noch.

3. Ich habe gesehen, dass ab Version 7.0 für das Binden von Parametern
prepared statements verwendet werden müssen. Heißt dass, dass ich das
entsprechende Kernobjekt selbst bauen muss?

Vielen Dank schonmal fürs Ansehen und einen schönen Nachmittag aus Franken,

Mit freundlichen Grüßen

Alexander Künzl
Alexander Künzl
2016-04-08 04:39:09 UTC
Permalink
Hallo an die Liste,

ich habe eine Frage zu Extbase und hoffe, jemand kann mir helfen: Ich
möchte eine direkte SQL-Abfrage schreiben, da die Repository-Methoden in
diesem Fall zu kurz greifen.

Ich möchte die Abfrage als prepared statement abschicken, etwa so (nur
zur Veranschaulichung des Problems, die eigentliche Abfrage ist komplexer):

$suchString = $uebergebenerSuchparameter;
$query = $this->createQuery();
$query->getQuerySettings()->usePreparedStatement(TRUE);
$sql = 'SELECT DISTINCT tabelle.* from tabelle as objekt WHERE
objekt.name LIKE ?'
$query->statement($sql, array("%$suchString%"));
return $query->execute();

Die Verarbeitung des Fragezeichens als Platzhalter funktionert so aber
leider nicht; Ich erhalte einen SQL-Fehler:

You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near '?

Anmerkungen:

1. Die SQL-Syntax (mit Ausnahme des nicht verarbeiteten Fragezeichens)
ist bei allen getesteten Abfragen korrekt: Wenn ich die Variable und die
Begrenzer direkt in die Abfrage schreibe, funktioniert alles.

2. Unter TYPO3 6.2 funktioniert die Abfrage über das prepared statement
noch.

3. Ich habe gesehen, dass ab Version 7.0 für das Binden von Parametern
prepared statements verwendet werden müssen. Heißt dass, dass ich das
entsprechende Kernobjekt selbst bauen muss?

Vielen Dank schonmal fürs Ansehen und einen schönen Nachmittag aus Franken,

Mit freundlichen Grüßen

Alexander Künzl
Alexander Künzl
2016-04-08 05:01:34 UTC
Permalink
Hallo an die Liste,

falls dieser Post schonmal in der Liste erschienen sein sollte, bitte ich um Entschuldigung, ich bekomme ihn nicht in meinen Mails angezeigt (diesmal hoffentlich). 
Ich habe eine Frage zu Extbase und hoffe, jemand kann mir helfen: Ich
möchte eine direkte SQL-Abfrage schreiben, da die Repository-Methoden in
diesem Fall zu kurz greifen.

Ich möchte die Abfrage als prepared statement abschicken, etwa so (nur
zur Veranschaulichung des Problems, die eigentliche Abfrage ist komplexer):

$suchString = $uebergebenerSuchparameter;
$query = $this->createQuery();
$query->getQuerySettings()->usePreparedStatement(TRUE);
$sql = 'SELECT DISTINCT tabelle.* from tabelle as objekt WHERE
objekt.name LIKE ?'
$query->statement($sql, array("%$suchString%"));
return $query->execute();

Die Verarbeitung des Fragezeichens als Platzhalter funktioniert so aber
leider nicht; Ich erhalte einen SQL-Fehler:

You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near '?
Beim Debuggen über Extbase zeigt sich ebenfalls, dass das Fragezeichen nicht ersetzt wird.

Anmerkungen:

1. Die SQL-Syntax (mit Ausnahme des nicht verarbeiteten Fragezeichens)
ist bei allen getesteten Abfragen korrekt: Wenn ich die Variable und die
Begrenzer direkt in die Abfrage schreibe, funktioniert alles.

2. Unter TYPO3 6.2 funktioniert die Abfrage über das prepared statement
noch.

3. Ich habe gesehen, dass ab Version 7.0 für das Binden von Parametern
prepared statements verwendet werden müssen. Heißt dass, dass ich das
entsprechende Kernobjekt selbst bauen muss?

Hat jemand eine Idee, wie sich die prepared statements umsetzen lassen? 
Vielen Dank für Tips, 

Mit freundlichen Grüßen

Alexander Künzl
Marco Kuprat
2016-04-08 07:40:55 UTC
Permalink
Hallo Alexander,
Post by Alexander Künzl
Ich möchte die Abfrage als prepared statement abschicken, etwa so (nur
$suchString = $uebergebenerSuchparameter;
$query = $this->createQuery();
$query->getQuerySettings()->usePreparedStatement(TRUE);
$sql = 'SELECT DISTINCT tabelle.* from tabelle as objekt WHERE objekt.name LIKE ?'
$query->statement($sql, array("%$suchString%"));
return $query->execute();
Probier mal ob es so funktioniert (eine ähnliche Abfrage habe ich auf TYPO3 7.6.4 zum Laufen gebracht):


$suchString = $uebergebenerSuchparameter;
$query = $this->createQuery();
$sql = 'SELECT DISTINCT tabelle.* from tabelle as objekt WHERE objekt.name LIKE ?';
$query->statement($this->objectManager->get(\TYPO3\CMS\Core\Database\PreparedStatement::class, $sql, 'tabelle'), array('%'.$suchString.'%'));
return $query->execute();



Viele Grüße

Marco
Alexander Künzl
2016-04-08 08:09:39 UTC
Permalink
Hallo Marco,

vielen Dank für Deine Mail, das hat super funktioniert!

Viele Grüße und schönes Wochenende,

Alexander
Post by Marco Kuprat
Hallo Alexander,
Post by Alexander Künzl
Ich möchte die Abfrage als prepared statement abschicken, etwa so (nur
$suchString = $uebergebenerSuchparameter;
$query = $this->createQuery();
$query->getQuerySettings()->usePreparedStatement(TRUE);
$sql = 'SELECT DISTINCT tabelle.* from tabelle as objekt WHERE objekt.name LIKE ?'
$query->statement($sql, array("%$suchString%"));
return $query->execute();
$suchString = $uebergebenerSuchparameter;
$query = $this->createQuery();
$sql = 'SELECT DISTINCT tabelle.* from tabelle as objekt WHERE objekt.name LIKE ?';
$query->statement($this->objectManager->get(\TYPO3\CMS\Core\Database\PreparedStatement::class, $sql, 'tabelle'), array('%'.$suchString.'%'));
return $query->execute();
Viele Grüße
Marco
Loading...