web-dev-qa-db-fra.com

Mysql + php avec des caractères spéciaux comme '(Apostrophe) et "(guillemet)

Je lutte avec un petit problème depuis un moment. Il existe depuis des années, mais il s’agit simplement d’un problème irritant et non grave; je viens d’y remédier. Mais maintenant, je veux savoir si quelqu'un peut m'aider. J'ai fait des recherches sur Google mais pas de succès.

Si je fais un post de formulaire à partir d'un texte HTML dans un fichier php comme ceci:

<form action="http://action.com" method="post">
<textarea name="text"><a href="http://google.com">google's site</a></textarea>
</form>

et bien sûr il y a un bouton de soumission et ainsi de suite.

La valeur est le problème: <a href="http://google.com">google's site</a> La valeur de la zone de texte a "(guillemet) et '(apostrophe).

Pour enregistrer ceci dans une base de données mysql_, je fais ceci:

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".$_POST['text']."') ") or die(mysql_error());

Et maintenant je reçois l'erreur mysql:

Vous avez une erreur dans votre syntaxe SQL; Consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la syntaxe à utiliser auprès de 's site' 'à la ligne 1.

10

Votre chaîne SQL sera:

INSERT INTO `table` (`row1`) VALUES ('google's site')

Ce qui n'est pas une déclaration valide. Comme Nanne l'a écrit, échappez au moins à la chaîne avec mysql_real_escape_string: http://php.net/manual/en/function.mysql-real-escape-string.php

Et lisez à propos de sql injection http://en.wikipedia.org/wiki/SQL_injection

Pensez un peu: si quelqu'un poste ceci: $_POST['text'] avec la valeur: ');delete from table;....

Vous pouvez dire au revoir à vos données :)

Toujours filtrer/échapper l'entrée!

EDIT: à partir de PHP 5.5.0, mysql_real_escape_string et l'extension mysql sont obsolètes. Merci d'utiliser l'extension mysqli et la fonction mysqli :: escape_string

19
Peter Porfy

Utilisez toujours au moins mysql_real_escape_string lorsque vous ajoutez des valeurs fournies par l'utilisateur à la base de données. Vous devriez examiner les paramètres de liaison ou mysqli pour que votre requête devienne:

INSERT INTO `table` (`row1`) VALUES (?)

Et ? serait remplacé par la valeur réelle après la désinfection de l’entrée.

Dans votre cas, utilisez:

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".mysql_real_escape_string($_POST['text'])."') ") or die(mysql_error());

Lire sur l'injection SQL. Cela vaut la peine de faire les choses aussi vite que possible!

9
methodin
3
Nanne

vous pouvez utiliser la fonction includeslashes (). Il cite une chaîne avec des barres obliques. alors, cela vous sera très utile lorsque vous ajouterez une apostrophe dans votre champ.

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".addslashes($_POST['text'])."') ") or die(mysql_error());
2
Hemi

au lieu d'utiliser les anciennes fonctions mysql *, utilisez PDO et écrivez des requêtes paramétrées - http://php.net/pdo

1
Stephen

Je me débattais également à propos des caractères lorsque je mettais à jour des données dans mysql.

Mais je suis finalement arrivé à une meilleure réponse, voici:

$lastname = "$_POST["lastname"]"; //lastname is : O'Brian, Bran'storm

Et lorsque vous allez mettre à jour votre base de données, le système ne le mettra pas à jour à moins que vous n'utilisiez la chaîne d'échappement MySQL REAL . Ici:

$lastname = mysql_real_escape_string($_POST["lastname"]);  // This Works Always.

Ensuite, votre requête sera mise à jour certainement. 

Example: mysql_query("UPDATE client SET lastname = '$lastname' where clientID = '%"); //This will update your data and provide you with security.

Pour plus d'informations, veuillez vérifier MYSQL_REAL_ESCAPE_STRING

J'espère que cela t'aides

0
Micheal P.