sql >> Base de Datos >  >> RDS >> Mysql

Introducir texto y caracteres especiales y MySQL

Tiene la idea correcta de mantener el texto en la base de datos sin formato. No estoy seguro de para qué sirven todas las cosas de la entidad HTML; no debería necesitar hacer eso para una inserción de base de datos.

[La única razón por la que puedo pensar por qué podría intentar decodificar la entrada entrante de la entidad para la base de datos sería si encuentra que está obteniendo referencias de caracteres como Š en la entrada de envío de su formulario. Si eso sucede, es porque el usuario está ingresando caracteres que no existen en la codificación utilizada por la página con el formulario. Esta forma de codificación es totalmente falsa porque no se puede distinguir entre el usuario que escribe Š y literalmente escribiendo Š ! Debe evitar esto utilizando la codificación UTF-8 para todas sus páginas y contenido, ya que todos los caracteres posibles caben en esta codificación.]

Las cadenas en su secuencia de comandos siempre deben ser texto sin formato sin escape. Eso significa que no les hace nada hasta el momento en que los envía a un contexto que no es texto sin formato. Entonces, para ponerlos en una cadena SQL:

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

(o use consultas parametrizadas para evitar tener que escapar manualmente). Al poner contenido en HTML:

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

(puede definir una función auxiliar con un nombre más corto como function h($s) { echo htmlspecialchars($s, ENT_QUOTES); } si desea reducir la cantidad de escritura que tiene que hacer en las plantillas).

Y... eso es más o menos. No necesita procesar cadenas que salen de la base de datos, ya que ya son cadenas sin formato. No necesita procesar cadenas de entrada (*), aparte de cualquier validación de campo específica de la aplicación que desee hacer.

*:bueno, excepto si magic_quotes_gpc está activado, en cuyo caso necesita stripslashes() todo lo que viene de get/post/cookie, o, mi opción favorita, falla inmediatamente:

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