Duplicata possible:
mysql_escape_string VS mysql_real_escape_string
J'ai besoin de faire entrer company_name (donné par l'utilisateur via un formulaire) dans ma base de données mysql. Quand j'utilise
$company = mysqli_real_escape_string($_POST['company_name'])
Je reçois une erreur
Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in /opt/lampp/htdocs/Abacus-Version-2/admin/Company/insert_company.php on line 58
Mais tout semble bien se passer lors de l'utilisation
$company = mysql_real_escape_string($_POST['company_name'])
Que puis-je faire dans de tels cas?
Celui à utiliser dépend de si vous utilisez l'extension MySQLi
ou l'extension MySQL
// procedural mysqli
$db = new mysqli;
$sql = sprintf("INSERT INTO table (id,name,email,comment) VALUES (NULL,'%s','%s','%s')",
mysqli_real_escape_string($db,$name),
mysqli_real_escape_string($db,$email),
mysqli_real_escape_string($db,$comment) );
// mysql
$conn = mysql_connect();
$sql = sprintf("INSERT INTO table (id,name,email,comment) VALUES (NULL,'%s','%s','%s')",
mysql_real_escape_string($name,$conn),
mysql_real_escape_string($email,$conn),
mysql_real_escape_string($comment,$conn) );
mysql_real_escape_string()
est conçu pour sécuriser les données à insérer dans la base de données sans erreurs. (IE comme échapper les barres obliques afin qu'il ne casse pas votre code).
Tu devrais utiliser mysql_
ou mysqli_
fonctions correspondant à votre chaîne de connexion. "mysqli" est l'implémentation orientée objet de l'ensemble de fonctions mysql, donc les fonctions sont appelées dans le style orienté objet. "mysql" est procédural. Je suggère de passer à "mysqli" car je pense qu'il a été question de déprécier les fonctions "mysql" dans les futures versions.
Si votre chaîne de connexion est:
mysql_connect()
puis utilisez:
mysql_real_escape_string($_POST[''])
Si c'est:
$mysqli = new mysqli();
puis utilisez:
$mysqli->real_escape_string($_POST[''])
Les deux fonctions n'ont rien à voir avec les données du formulaire.
Ils doivent être utilisés pour formater littéraux de chaîne insérés dans la requête SQL niquement.
Cette fonction appartient à la requête SQL et non à quelque forme que ce soit. Et même à une partie très limitée de la requête - un littéral de chaîne.
Ainsi, chaque fois que vous allez insérer dans la requête un littéral de chaîne (franchement, une partie des données entre guillemets), cette fonction doit être utilisée sans condition.
Pour tout autre cas, il ne devrait pas être utilisé du tout.
Quant à l'erreur que vous obtenez - c'est assez explicite: cette fonction attend 2 paramètres, pas un. Passez simplement les paramètres appropriés comme indiqué dans la page de manuel de cette fonction, et tout ira bien
Les deux variantes sont très bien * (Veuillez consulter ma mise à jour).
Lorsque vous utilisez un mysql_connect
, Vous devez vous en tenir à mysql_real_escape_string()
et également passer la poignée de connexion.
Lorsque vous utilisez un mysqli_connect
, Vous devez vous en tenir à mysqli_real_escape_string()
.
[~ # ~] mise à jour [~ # ~]
Comme l'a souligné Jeffrey dans les commentaires, l'utilisation des fonctions mysql_
Est [~ # ~] pas [~ # ~] très bien. Je suis d'accord avec ça. Je viens de souligner que vous devez utiliser la fonction utilisée par l'extension MySQL que vous utilisez.
Il m'est venu à l'esprit que ce n'était pas la question de savoir quelle extension MySQL utiliser, mais quelle fonction pour échapper les données.
Si tu me demandes:
mysqli
ou PDO
, car mysql
n'est pas recommandé et déconseillé.Comme toute l'extension MySQL
est obsolète , il vaut mieux utiliser les méthodes MySQLi
à la place, c'est plus à l'épreuve du temps.
Cela devrait être le cas si vous utilisez un style procédural:
$city = mysqli_real_escape_string($link, $city);
où le lien est la connexion
ou ceci lorsque vous utilisez un style orienté objet:
$city = $mysqli->real_escape_string($city);
Consultez le manuel php: http://php.net/manual/en/mysqli.real-escape-string.php