Mysql
 sql >> Base de données >  >> RDS >> Mysql

Saisir du texte et des caractères spéciaux et MySQL

Vous avez eu la bonne idée de conserver le texte brut dans la base de données. Je ne sais pas à quoi servent toutes les entités HTML ; vous ne devriez pas avoir besoin de faire cela pour une insertion de base de données.

[La seule raison pour laquelle je peux penser à la raison pour laquelle vous pourriez essayer de décoder les entrées entrantes pour la base de données serait si vous trouvez que vous obtenez des références de caractères comme Š dans votre entrée de soumission de formulaire. Si cela se produit, c'est parce que l'utilisateur saisit des caractères qui n'existent pas dans l'encodage utilisé par la page avec le formulaire. Cette forme d'encodage est totalement fausse car vous ne pouvez alors pas faire la distinction entre l'utilisateur tapant Š et en tapant littéralement Š ! Vous devriez éviter cela en utilisant l'encodage UTF-8 pour toutes vos pages et votre contenu, car tous les caractères possibles tiennent dans cet encodage.]

Les chaînes de votre script doivent toujours être du texte brut sans échappement. Cela signifie que vous ne leur faites rien jusqu'au moment où vous les affichez dans un contexte qui n'est pas en texte brut. Donc pour les mettre dans une chaîne SQL :

$category= trim($_POST['category']);
mysql_query("SELECT * FROM things WHERE category='".mysql_real_escape_string($category)."'");

(ou utilisez des requêtes paramétrées pour éviter d'avoir à y échapper manuellement.) Lors de l'insertion de contenu en HTML :

<input type="text" name="category" value="<?php echo htmlspecialchars($category); ?>" />

(vous pouvez définir une fonction d'assistance avec un nom plus court comme function h($s) { echo htmlspecialchars($s, ENT_QUOTES); } si vous souhaitez réduire la quantité de saisie que vous avez à faire dans les modèles.)

Et c'est à peu près tout. Vous n'avez pas besoin de traiter les chaînes qui sortent de la base de données, car ce sont déjà des chaînes brutes. Vous n'avez pas besoin de traiter les chaînes d'entrée (*), à l'exception de toute validation de champ spécifique à l'application que vous souhaitez effectuer.

* :bien, sauf si magic_quotes_gpc est activé, auquel cas vous devez soit stripslashes() tout ce qui vient de get/post/cookie, ou, mon option préférée, échoue immédiatement :

if (get_magic_quotes_gpc())
    die(
        'Magic quotes are turned on. They are utterly bogus and no-one should use them. '.
        'Turn them off, you idiot, or I refuse to run. So there!'
    );