Defect #1007

Fehler in Database->prepare()

Added by andreas.schempp 12 months ago. Updated 11 months ago.

Status:Completed Start:
Priority:Normal Due date:
Assigned to:leo % Done:

0%

Category:framework
Target version:2.7.4

Description

Bei einer speziellen Anwendung sind mir heute einige Fehler in der prepare() Funktion der Database Klasse aufgefallen.

Original (2.7.3):

// Replace wildcards
$arrChunks = preg_split("/('[^']*')/", $this->strQuery, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);

Korrigierte Version:

// Replace wildcards
$arrChunks = preg_split("/('[^\\\']*')/s", $this->strQuery, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);

Erklärung:
1: Wenn ein Backslash vor dem Anführungzeichen steht, sollte dieses nicht gesplittet werden (> \\\)
2: Die Regex muss auch Zeilenumbrüche beachten (
> /s)

Aufgefallen ist mir das Problem beim einfügen von Daten in die tl_content, bei der im Feld "text" sehr viel Daten auf mehreren Zeilen waren, welche auch Fragezeichen enthielten. TYPOlight hat diese Fragezeichen dann als Platzhalter interpretiert.

Aus einem noch nicht geklärten Grund wurde dann aber dieses Feld nicht mit Anführungzeichen (' ... ') gesplittet, sondern auch nocht das Komma war enthalten (, ' ... '). Deshalb danach noch folgende Anpassung:

if (in_array(substr($v, 0, 1), array("'", ',')))
{
    continue;
}

(Ich vermute das zweite ist nicht so wirklich verständlich ;-) )

insert.txt (17.6 KB) leo, 09/27/2009 01:16 pm

Database.php (19.2 KB) leo, 09/29/2009 11:56 am


Related issues

related to Defect #1220: Database::replaceWildcards() breaks on wildcarded search terms such as %south% Invalid 11/29/2009

History

Updated by leo 12 months ago

Kannst Du bitte den Text, der das Problem verusacht hat, auch noch posten?

Updated by andreas.schempp 12 months ago

Folgendes versuche ich direkt über $this->Database->execute(...) auszuführen. prepare() wird da automatisch gemacht.

(Siehe Anhang insert.txt)

Updated by leo 12 months ago

Wie kommt es, dass die Anführungszeichen im Text escapet sind? Hast Du magic_quotes aktiviert?

Updated by andreas.schempp 12 months ago

Nein, es handelt sich hierbei um einen SQL-Dump welchen ich dann wieder einlese.

Updated by leo 12 months ago

  • Status changed from New to Accepted

Updated by leo 12 months ago

Updated by leo 12 months ago

Wie genau sieht denn Dein DB-Statement für das Einfügen des Textes aus?

Updated by andreas.schempp 11 months ago

$this->Database->execute($sql);

Wobei $sql dem ganzen entspricht.

Updated by leo 11 months ago

  • Status changed from Accepted to Completed

Ich habe die DB-Klassen um die Funktion query() ergänzt, mit der man Anfragen unverändert an die Datenbank schicken kann. Bitte versuch mal, ob es mit $this->Database->query($sql); klappt (siehe Anhang Database.php).

Updated by leo 11 months ago

Updated by andreas.schempp 11 months ago

Ich werde das bei der Fertigstellung meines entsprechenden Moduls testen.

Also available in: Atom