Guardar texto de un formulario en mysql con acentos y saltos de linea

PHP-MySQLCuando guardamos texto desde un formulario en una base de datos, y luego queremos mostrarlo en otra sección, tenemos que tener en cuenta los saltos de linea, acentos, y demás caracteres. Y si ademas de esto, no sabemos quien introduce este texto, la cosa se complica, ya que tenemos que tratar los datos introducidos. Vamos a ver una forma que funciona correctamente…

Lo primero que tenemos que tener en cuenta, es la codificación de la base de datos donde vamos a guardar los datos. Lo ideal para el lenguaje español es utf8, en una de estos dos conjuntos de caracteres: utf8_spanish_ci o utf8_spanish2_ci. Según la pagina oficial de mysql:

Las colaciones utf8_spanish_ci y utf8_spanish2_ci se corresponden con español moderno y español tradicional respectivamente. En ambas colaciones , ‘ñ’ es una letra independiente, entre ‘n’ y ‘o’. Además, para español tradicional ‘ch’ es una letra, ordenada entre ‘c’ y d, y ‘ll’ es una letra que se coloca entre ‘l’ y ‘m’

Con esto ya sabemos que charset colocar en la base de datos donde se va a guardar.

Ahora vamos con el código. Si el texto no lo insertamos nosotros, hay que comprobar que sea seguro, para evitar sql injection. Para esto utilizamos la función de php mysql_real_escape_string. Para que los datos se guarden con el mismo charset (utf8), tenemos que indicar por código que se utilice este. Esto se hace con la función php mysqli_set_charset. Ahora ya podemos guardar los datos en la base de datos. Si todo iría bien, en la base de datos, deberían aparecer los acentos, eñes y demás correctamente, ademas de los saltos de linea.

Vamos a ver ahora como mostrar este texto guardado en formato HTML. Si sacamos directamente el texto por pantalla, los saltos de linea aparecerán como «\n». Esto lo podemos reemplazar por un salto de linea en HTML, osea un , y para esto tenemos la función nl2br. En el caso de que no podamos cambiar el charset de la base de datos, y los acentos, eñes y demás caracteres no aparezcan correctamente, podemos usar la función htmlentities.

Y que mejor forma de ver esto que con un ejemplo!! pues aquí tenéis el código de una simple pagina que guarda un comentario y un id y los muestra.

<?php
$mysqli = new mysqli("localhost", "root", "root", "pruebas");
$mysqli->set_charset('utf8');

if(isset($_GET['comment'])){

    $comment = $mysqli->real_escape_string($_GET['comment']);

    $mysqli->query("INSERT INTO comments (comment) VALUES ('$comment')");

    if($mysqli->affected_rows > 0){
        echo "Inserccion correcta. <a href='insert.php'>volver</a>";
    }else{
        echo "No se ha podido insertar. <a href='insert.php'>volver</a>";
    }

}else{

    ?>
    <!doctype html>
    <html lang='en'>
    <head>
        <meta charset='UTF-8'>
        <title>Prueba de inserccion de comentarios</title>
        <style>
            table, tr, td{
                border: 1px solid #777;
                border-collapse: collapse;
                border-spacing: 0;
            }
        </style>
    </head>
    <body>
        <form action='insert.php' method='get'>
            <textarea name='comment' cols='100' rows='5'></textarea>
            <input type='submit' value='insertar'>
        </form>
    <?
    $mysqli->multi_query("SELECT * FROM comments");
    $result = $mysqli->store_result();
    echo "<br><br><div><table>";
    while($com = $result->fetch_object()){
        $coment = nl2br($com->comment);
        echo "<tr><td style='width: 60px'>$com->id</td><td>$coment</td></tr>";
    }
    echo "</table></div></body></html>";
    printf("Conjunto de caracteres actual: %s\n", $mysqli->character_set_name());
    $mysqli->close();

}
?>

Y la creación de la base de datos:

CREATE DATABASE `pruebas` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_spanish_ci */
+-------------------------------------------------------+
CREATE TABLE `comments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `comment` varchar(45) COLLATE utf8_spanish_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci

¿Te ha gustado este artículo? ¿te ha servido de ayuda? No dudes en comentarlo o compartirlo!

Saludos, Fran

Deja una respuesta