94 votes

Comment échapper les chaînes de caractères dans le serveur SQL en utilisant PHP ?

Je cherche l'alternative de mysql_real_escape_string() pour SQL Server. Est-ce que addslashes() ma meilleure option ou y a-t-il une autre fonction alternative qui peut être utilisée ?

Une alternative pour mysql_error() serait également utile.

3 votes

Pour moi, il ne s'agit pas d'une question redondante car elle concerne le cas spécifique de MSSQL qui n'a pas de PDO officiel associé.

3voto

marklark Points 425

Pour échapper aux guillemets simples et doubles, vous devez les doubler :

$value = 'This is a quote, "I said, 'Hi'"';

$value = str_replace( "'", "''", $value ); 

$value = str_replace( '"', '""', $value );

$query = "INSERT INTO TableName ( TextFieldName ) VALUES ( '$value' ) ";

etc...

et l'attribution : Caractère d'échappement dans Microsoft SQL Server 2000

2voto

Alejandro Iglesias Points 7779

Après avoir lutté contre ce problème pendant des heures, j'ai trouvé une solution qui est presque la meilleure.

La réponse de Chaos, qui consiste à convertir les valeurs en chaînes hexagonales, ne fonctionne pas avec tous les types de données, notamment avec les colonnes de type date.

J'utilise la fonction PDO::quote() mais comme il est livré avec PHP, PDO::quote() n'est pas pris en charge par MS SQL Server et renvoie FALSE . La solution pour que cela fonctionne était de télécharger quelques paquets Microsoft :

Après cela, vous pouvez vous connecter en PHP avec PDO en utilisant un DSN comme dans l'exemple suivant :

sqlsrv:Server=192.168.0.25; Database=My_Database;

Utilisation de la UID et PWD dans le DSN n'a pas fonctionné, donc le nom d'utilisateur et le mot de passe sont passés comme deuxième et troisième paramètres dans le constructeur de PDO lors de la création de la connexion. Vous pouvez maintenant utiliser la fonction PDO::quote() . Profitez-en.

1voto

danechkin Points 878

Une réponse de 2009-02-22T121000 par l'utilisateur chaos ne convient pas à toutes les requêtes.

Par exemple, "CREATE LOGIN [0x6f6c6f6c6f] FROM Windows" vous donnera une exception.

PS : regardez le pilote SQL Server pour PHP, http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx et la fonction sqlsrv_prepare, qui peut lier des paramètres.

PSS : Ce qui ne vous a pas aidé non plus pour la question ci-dessus ;)

1voto

jjwdesign Points 823

Avertissement : Cette fonction a été supprimée en PHP 7.0.0.

http://php.net/manual/en/function.mssql-query.php

Pour ceux qui utilisent encore ces fonctions mssql_*, gardez à l'esprit qu'elles ont été supprimées de PHP à partir de la version 7.0.0. Cela signifie que vous devrez éventuellement réécrire le code de votre modèle pour utiliser la bibliothèque PDO, sqlsrv_*, etc. Si vous cherchez quelque chose avec une méthode de "citation/escaping", je vous recommande PDO.

Les alternatives à cette fonction incluent : PDO::query(), sqlsrv_query() et odbc_exec().

0voto

Bim Points 59

Pour la conversion des valeurs hexadécimales en SQL en ASCII, voici la solution que j'ai obtenue (en utilisant la fonction de l'utilisateur chaos pour encoder en hexadécimal)

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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X