Ich suche nach einer Alternative mysql_real_escape_string()
für SQL Server. Ist addslashes()
meine beste Option oder gibt es eine andere alternative Funktion, die verwendet werden kann?
Eine Alternative für mysql_error()
wäre auch nützlich.
php
sql-server
escaping
input-sanitization
Klicken Sie auf Upvote
quelle
quelle
Antworten:
addslashes()
ist nicht völlig ausreichend, aber das mssql-Paket von PHP bietet keine anständige Alternative. Die hässliche, aber vollständig allgemeine Lösung besteht darin, die Daten als hexadezimalen Test zu codieren, d. H.Abstrahiert wäre das:
mysql_error()
Äquivalent istmssql_get_last_message()
.quelle
SQLSTATE[22007]: Invalid datetime format: 210 [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting datetime from binary/varbinary string.
Ich glaube, diese Methode kann nur korrekt sein, wenn sie mit jedem MSSQL-Datentyp funktioniert.mssql_escape()
Funktion erledigt dies nicht für mich. Die Textanzeige nach einer Auswahl sieht so aus und ist0x4a2761696d65206269656e206c652063686f636f6c6174
daher nicht lesbar.Ein Teil des Codes hier wurde von CodeIgniter abgerissen. Funktioniert gut und ist eine saubere Lösung.
BEARBEITEN: Es gibt viele Probleme mit dem obigen Code-Snippet. Bitte verwenden Sie dies nicht, ohne die Kommentare zu lesen, um zu wissen, um welche es sich handelt. Besser noch, bitte benutze das überhaupt nicht. Parametrisierte Abfragen sind Ihre Freunde: http://php.net/manual/en/pdo.prepared-statements.php
quelle
preg_replace
? Ist das nichtstr_replace
ausreichend?empty($value)
kehrttrue
nicht nur für''
, sondern auch für dienull
,0
und'0'
! In all diesen Fällen würden Sie eine leere Zeichenfolge zurückgeben.Warum sollten Sie sich die Mühe machen, irgendetwas zu entkommen, wenn Sie Parameter in Ihrer Abfrage verwenden können?!
Es funktioniert direkt beim Auswählen, Löschen und Aktualisieren, unabhängig davon, ob Ihre Werteparameter sind
null
oder nicht. Machen Sie eine Grundsatzfrage - Verketten Sie SQL nicht und Sie sind immer sicher und Ihre Abfragen lesen sich viel besser.http://php.net/manual/en/function.sqlsrv-query.php
quelle
Sie können in die PDO-Bibliothek schauen . Sie können vorbereitete Anweisungen mit PDO verwenden, die automatisch alle fehlerhaften Zeichen in Ihren Zeichenfolgen umgehen, wenn Sie die vorbereiteten Anweisungen korrekt ausführen. Dies ist nur für PHP 5, denke ich.
quelle
Eine andere Möglichkeit, einfache und doppelte Anführungszeichen zu verwenden, ist:
quelle
Um einfache und doppelte Anführungszeichen zu vermeiden, müssen Sie sie verdoppeln:
$value = str_replace( '"', '""', $value );
etc...
und Zuordnung: Escape-Zeichen In Microsoft SQL Server 2000
quelle
Nachdem ich stundenlang damit zu kämpfen hatte, habe ich eine Lösung gefunden, die sich fast am besten anfühlt.
Die Antwort von Chaos, Werte in Hexstring zu konvertieren, funktioniert nicht bei jedem Datentyp, insbesondere bei Datetime-Spalten.
Ich verwende PHPs
PDO::quote()
, aber da es mit PHP geliefert wird,PDO::quote()
wird es für MS SQL Server nicht unterstützt und kehrt zurückFALSE
. Die Lösung bestand darin, einige Microsoft-Bundles herunterzuladen:Danach können Sie in PHP mit PDO über einen DSN wie im folgenden Beispiel eine Verbindung herstellen:
Die Verwendung der Parameter
UID
undPWD
im DSN hat nicht funktioniert, daher werden Benutzername und Kennwort beim Erstellen der Verbindung als zweiter und dritter Parameter im PDO-Konstruktor übergeben. Jetzt können Sie PHPs verwendenPDO::quote()
. Genießen.quelle
Eine Antwort von 2009-02-22T121000 vom User Chaos paßt nicht alle Anfragen.
Beispiel: "CREATE LOGIN [0x6f6c6f6c6f] FROM WINDOWS" gibt Ihnen eine Ausnahme.
PS: Sehen Sie sich den SQL Server-Treiber für PHP an: http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx und die Funktion sqlsrv_prepare, mit der Parameter gebunden werden können.
PSS: Was dir auch bei der obigen Abfrage nicht geholfen hat;)
quelle
http://php.net/manual/en/function.mssql-query.php
Beachten Sie für alle, die diese mssql_ * -Funktionen noch verwenden, dass sie ab Version 7.0.0 aus PHP entfernt wurden. Das bedeutet, dass Sie Ihren Modellcode eventuell neu schreiben müssen, um entweder die PDO-Bibliothek, sqlsrv_ * usw. zu verwenden. Wenn Sie etwas mit einer "Quoting / Escape" -Methode suchen, würde ich PDO empfehlen.
quelle
Wenn Sie PDO verwenden, können Sie die
PDO::quote
Methode verwenden.quelle
Es ist besser, auch SQL-reservierte Wörter zu umgehen. Beispielsweise:
quelle
Ich habe dies als Alternative verwendet von
mysql_real_escape_string()
:quelle
Für die Umwandlung der hexadezimalen Werte in SQL zurück in ASCII zu bekommen, hier ist die Lösung , die ich auf diese bekam (über die Funktion von Benutzern Chaos zu kodieren in hexadezimal)
quelle
Sie können Ihre eigene Version von
mysql_real_escape_string
mit dem folgenden regulären Ausdruck rollen (und verbessern) :[\000\010\011\012\015\032\042\047\134\140]
. Dabei werden die folgenden Zeichen berücksichtigt: Null, Rücktaste, horizontale Registerkarte, neue Zeile, Wagenrücklauf, Ersatz, doppeltes Anführungszeichen, einfaches Anführungszeichen, umgekehrter Schrägstrich, schwerwiegender Akzent. Rücktaste und horizontale Registerkarte werden von nicht unterstütztmysql_real_escape_string
.quelle