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.
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.
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.
$unpacked = unpack('H*hex', $data);
mssql_query('
INSERT INTO sometable (somecolumn)
VALUES (0x' . $unpacked['hex'] . ')
');
Abstrahiert wäre das:
function mssql_escape($data) {
if(is_numeric($data))
return $data;
$unpacked = unpack('H*hex', $data);
return '0x' . $unpacked['hex'];
}
mssql_query('
INSERT INTO sometable (somecolumn)
VALUES (' . mssql_escape($somevalue) . ')
');
mysql_error()
Äquivalent ist mssql_get_last_message()
.
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 ist 0x4a2761696d65206269656e206c652063686f636f6c6174
daher nicht lesbar.
function ms_escape_string($data) {
if ( !isset($data) or empty($data) ) return '';
if ( is_numeric($data) ) return $data;
$non_displayables = array(
'/%0[0-8bcef]/', // url encoded 00-08, 11, 12, 14, 15
'/%1[0-9a-f]/', // url encoded 16-31
'/[\x00-\x08]/', // 00-08
'/\x0b/', // 11
'/\x0c/', // 12
'/[\x0e-\x1f]/' // 14-31
);
foreach ( $non_displayables as $regex )
$data = preg_replace( $regex, '', $data );
$data = str_replace("'", "''", $data );
return $data;
}
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
preg_replace
? Ist das nicht str_replace
ausreichend?
empty($value)
kehrt true
nicht nur für ''
, sondern auch für die null
, 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?!
sqlsrv_query(
$connection,
'UPDATE some_table SET some_field = ? WHERE other_field = ?',
array($_REQUEST['some_field'], $_REQUEST['id'])
)
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.
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.
Eine andere Möglichkeit, einfache und doppelte Anführungszeichen zu verwenden, ist:
function mssql_escape($str)
{
if(get_magic_quotes_gpc())
{
$str = stripslashes($str);
}
return str_replace("'", "''", $str);
}
Um einfache und doppelte Anführungszeichen zu vermeiden, müssen Sie sie verdoppeln:
$value = 'This is a quote, "I said, 'Hi'"';
$value = str_replace( "'", "''", $value );
$value = str_replace( '"', '""', $value );
$query = "INSERT INTO TableName ( TextFieldName ) VALUES ( '$value' ) ";
etc...
und Zuordnung: Escape-Zeichen In Microsoft SQL Server 2000
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ück FALSE
. 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:
sqlsrv:Server=192.168.0.25; Database=My_Database;
Die Verwendung der Parameter UID
und PWD
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 verwenden PDO::quote()
. Genießen.
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;)
Warnung: Diese Funktion wurde in PHP 7.0.0 ENTFERNT.
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.
Alternativen zu dieser Funktion sind: PDO :: query (), sqlsrv_query () und odbc_exec ()
Wenn Sie PDO verwenden, können Sie die PDO::quote
Methode verwenden.
Es ist besser, auch SQL-reservierte Wörter zu umgehen. Beispielsweise:
function ms_escape_string($data) {
if (!isset($data) or empty($data))
return '';
if (is_numeric($data))
return $data;
$non_displayables = array(
'/%0[0-8bcef]/', // URL encoded 00-08, 11, 12, 14, 15
'/%1[0-9a-f]/', // url encoded 16-31
'/[\x00-\x08]/', // 00-08
'/\x0b/', // 11
'/\x0c/', // 12
'/[\x0e-\x1f]/', // 14-31
'/\27/'
);
foreach ($non_displayables as $regex)
$data = preg_replace( $regex, '', $data);
$reemplazar = array('"', "'", '=');
$data = str_replace($reemplazar, "*", $data);
return $data;
}
Ich habe dies als Alternative verwendet von mysql_real_escape_string()
:
function htmlsan($htmlsanitize){
return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}
$data = "Whatever the value's is";
$data = stripslashes(htmlsan($data));
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)
function hexEncode($data) {
if(is_numeric($data))
return $data;
$unpacked = unpack('H*hex', $data);
return '0x' . $unpacked['hex'];
}
function hexDecode($hex) {
$str = '';
for ($i=0; $i<strlen($hex); $i += 2)
$str .= chr(hexdec(substr($hex, $i, 2)));
return $str;
}
$stringHex = hexEncode('Test String');
var_dump($stringHex);
$stringAscii = hexDecode($stringHex);
var_dump($stringAscii);
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ützt mysql_real_escape_string
.