Defect #1007
Fehler in Database->prepare()
| 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 (> \\\)> /s)
2: Die Regex muss auch Zeilenumbrüche beachten (
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 ;-) )
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
- File insert.txt added
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
- File Database.php added
Updated by andreas.schempp 11 months ago
Ich werde das bei der Fertigstellung meines entsprechenden Moduls testen.
Also available in: Atom