2016-11-08 2 views
0

Wir stoßen auf ein Problem, bei dem wir PHP verwenden, um eine SQL-Anweisung zu erstellen, und die die Funktion preg_replace verwendet. Ive in der Dokumentation hereBau SQL mit preg_replace?

gefunden, aber ich habe Probleme zu verstehen, was unsere Muster bedeutet (das ist Legacy-Code, die ich nie mit vor gebastelt habe.)

static function buildQuery ($sql, $params) 
{ 
error_log ("1"); 
error_log (print_r($params, true)); 

    foreach ((array) $params as $k => $v) 
    { 
     $v = pg_escape_string ($v); 
    error_log ("2"); 
    error_log ($v); 
     $sql = preg_replace ("/:$k(?=\W|$)/i", "'$v'", $sql); 
    } 

error_log ("3"); 
error_log ($sql); 

    return $sql; 
} 

Das Problem, das wir zu beheben versuchen, ist bevor die preg_replace-Zeile aufgerufen wird, haben wir einen Wert, der in die Anweisung "\ \ test" mit zwei umgekehrten Schrägstrichen geht (musste den Platz hinzufügen, damit er hier angezeigt wird). Nach dieser Zeile haben die beiden Backslashes in "\ test" gewertet und wenn dies von der Datenbank in unseren Client eingelesen wird, wird es zu einem Tab gefolgt von "est" was nicht das ist was wir wollen. Ich verstehe, dass das/i damit zu tun hat, fast jeden Fall zu erkennen. das \ W scheint ein Meta-Zeichen zu sein, um ein Wort zu finden? $ k ist der Schlüssel, den ich für diese Spalte der Tabelle anwende, aber der Rest davon verstehe ich nicht, und ich weiß nicht, warum das dazu führen würde, einen Backslash zu trimmen.

Ich bin so ziemlich ein Anfänger, ich werde weiter durch die Dokumentation schauen und vielleicht wird etwas auf mich zukommen, aber ich könnte Hinweise darauf verwenden, was das bedeutet, wo ich weitere Informationen darüber finden kann, und wie Ich könnte dieses Problem beheben.

Dank

EDIT sein eine Postgres-Datenbank, Version 9.3, wenn diese relevant ist.

+0

Warum gibt es zwei Schrägstriche in den Daten? Und wird das ein INSERT/UPDATE oder SELECT sein? – AbraCadaver

+0

Je nachdem, ob es einen bestehenden Eintrag gibt, wird ein UPDATE- oder INSERT-Aufruf ausgeführt. Ich habe den Eindruck, dass es zwei umgekehrte Schrägstriche gibt, so dass unser Client es wieder korrekt auf einen einzelnen Backslash zurück analysieren kann. Wir brauchen Benutzereingaben, um Backslash-Zeichen einfügen zu können. – TSI25

Antwort

0

Das "\ t" wird wahrscheinlich durch die String-Interpolation von PHP interpretiert. Sie könnten versuchen, eine Zeichenfolge in Anführungszeichen für das Muster zu verwenden (Sie müssen die $ k-Variable darin verketten), aber wenn Sie dies durch eine tatsächliche Parameterbindung ersetzen können, wäre es sicherer und zuverlässiger.

Hier Regex101 ‚s Erklärung dieses Muster, wenn es jede Hilfe ist:

/:test(?=\W|$)/i 
:test matches the characters :test literally (case insensitive) 
Positive Lookahead (?=\W|$) 
Assert that the Regex below matches 
1st Alternative \W 
\W matches any non-word character (equal to [^a-zA-Z0-9_]) 
2nd Alternative $ 
$ asserts position at the end of the string, or before the line terminator 
right at the end of the string (if any) 

Global pattern flags 
i modifier: insensitive. Case insensitive match (ignores case of [a-zA-Z]) 
+0

Kann ich etwas Klarheit darüber bekommen, wie man versucht, eine einzelne Zeichenfolge in Anführungszeichen für das Muster zu verwenden? meinst du sowas wie $ sql = preg_replace ('/:'.'$k'.'(?=\W|$)/i ',' '$ v' ', $ sql); Ich habe wirklich keine Version von diesem zu arbeiten, es bricht nur irgendwie alles, aber ich weiß nur irgendwie, was ich tue. Die Regex-Erklärung ist sehr hilfreich, ich schaue es jetzt mehr um zu sehen, ob ich eine bessere Lösung für das finden kann, was es macht – TSI25

+0

Ja, das ist genau das, was ich bekommen habe. Ich bin mir nicht ganz sicher, ob es das Problem lösen wird, aber "\ t", das zu einem Tab wird, klingt definitiv wie PHP es interpretiert. Nur für den Kontext wäre die Verwendung von PDO und Parameterbindung (einige Beispiele in der Dokumentation: http://php.net/manual/en/pdostatement.bindparam.php) der richtige Weg, um dies zu lösen, aber es klingt wie du sein würdest auf etwas schweres Refactoring schauen. –

+0

Ich habe es nicht funktioniert, aber ich akzeptiere dies als die richtige Antwort, da ich zumindest viel mehr darüber weiß, was los ist und wo ich anfangen kann zu suchen. Vielen Dank – TSI25