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.
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.
addslashes()
n'est pas totalement adapté, mais le paquetage mssql de PHP ne fournit pas d'alternative décente. La solution laide mais tout à fait générale est d'encoder les données comme un bytestring hexadécimal, c'est-à-dire
$unpacked = unpack('H*hex', $data);
mssql_query('
INSERT INTO sometable (somecolumn)
VALUES (0x' . $unpacked['hex'] . ')
');
Abstrait, ce serait :
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()
L'équivalent est mssql_get_last_message()
.
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;
}
Une partie du code ici a été arrachée à CodeIgniter. Il fonctionne bien et constitue une solution propre.
EDIT : Il y a beaucoup de problèmes avec le bout de code ci-dessus. Merci de ne pas l'utiliser sans avoir lu les commentaires pour savoir ce qu'il en est. Mieux encore, ne l'utilisez pas du tout. Les requêtes paramétrées sont vos amies : http://php.net/manual/en/pdo.prepared-statements.php
Gabe : Le preg_replace dans ce cas était pour me permettre d'utiliser les plages qui me sont offertes dans les classes de caractères des expressions régulières. Sinon, il y aurait eu beaucoup plus de remplacements de chaînes dans ce cas.
-1. Il n'incombe pas à une fonction de citation de manipuler les données - elle doit simplement s'assurer que la chaîne est dans un format tel qu'elle peut être ajoutée à une instruction SQL et survivre sans être modifiée.
Pourquoi s'embêter à échapper quoi que ce soit quand on peut utiliser des paramètres dans sa requête !
sqlsrv_query(
$connection,
'UPDATE some_table SET some_field = ? WHERE other_field = ?',
array($_REQUEST['some_field'], $_REQUEST['id'])
)
Il fonctionne bien dans les sélections, les suppressions, les mises à jour, que vos paramètres de valeurs soient null
ou non. Par principe, ne concaténer pas le SQL, vous êtes toujours en sécurité et vos requêtes se lisent beaucoup mieux.
Vous pourriez vous pencher sur le Bibliothèque PDO . Vous pouvez utiliser des instructions préparées avec PDO, qui échappera automatiquement les mauvais caractères dans vos chaînes de caractères si vous faites les instructions préparées correctement. Je pense que c'est seulement pour PHP 5.
Avec certains des comportements débiles que j'ai vus avec PDO, je devrais faire des tests sérieux avant de lui faire confiance pour échapper correctement à toutes les données.
Ce à quoi je pensais, c'est au problème que ce type a eu hier avec PDO. Un problème de transaction sans rapport, mais peu impressionnant. Combinez cela avec toute l'histoire de l'échappement inadéquat des données en PHP (php.net disant aux gens d'utiliser addslashes() !) et je deviens très suspicieux.
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.
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é.
0 votes
Fonction mysql_real_escape_string() était déprécié en PHP 5.5.0 et a été supprimé en PHP 7.0.0. .