#php Escapa caracteres especiales en un string para su uso en una sentencia SQL by chuwiki.chuidiang.org

Fuente: chuwiki.chuidiang.org

Cuando en nuestra página web ponermos un formulario en el que el navegante puede poner texto líbremente, debemos tomar ciertas precauciones.

Escapar las comillas

Si ese texto se va a guardar en base de datos, debemos «escapar» las comillas, ponerles delante el caracter \. Si no lo hacemos así, cuando construyamos la sentencia SQL para el insert o update, esas comillas pueden dar al traste con la operación.

Imagina que el navegante a introducido como texto

digo "Hola"

y esto lo metemos en PHP en una variable $comentario

cuando hagamos el SQL, pondremos algo asi

$query = 'insert into una_tabla values (...,"'.$comentario.'",...);';

que luego, se traduce a

insert into una_tabla values (...,"digo "Hola"",...);

donde las comillas que ha metido el usuario harán que de un error.

La solución consiste en poner delante de las comillas simples y dobles un caracter \, para que la sentencia SQL quede así

insert into una_tabla values (...,"digo \"Hola\"",...);

que sí es correcto.

Si está configurado para ello, PHP puede hacer esto automáticamente con cualquier cadena de texto que nos llegue de un formulario. Para saber si lo está o no haciendo, debemos llamar a la función get_magic_quotes_gpc() que devolverá 1 si ya lo hace automáticamente.

Si no lo está haciendo automáticamente, debemos hacerlo nosotros. PHP nos proporciona la función addslashes() que hace exactamente eso, añadir un \ a todas las comillas.

Entonces, el código para escapar comillas, debería ser

if (get_magic_quotes_gpc()!=1)
   $cadena=addslashes($_POST['comentario']);

donde $_POST[‘comentario’] es el texto que nos llega del formulario y en $cadena obtenemos el texto con las \ puestas delante de las comillas.

Tambien disponemos de otra funcion para la misma tarea mysql_real_escape_string(), aunque en php.net nos advierten que esta obsoleta a partir de la version 5.5 de php

Eliminar tags de html

Si la cadena que ha introducido el usuario se va a presentar luego en nuestra página web, es conveniente quitarle (o al menos revisar) los posibles caracteres especiales de html que haya en dicha cadena.

Si el usuario introduce esto

digo Hola

Cuando lo mostremos, se verá Hola en negrita. Eso no es problematico. Pero si le dejamos meter esto

digo <b>Hola

A partir de ahí saldrá todo el texto en negrita, ya que se ha olvidado de cerrarlo. Y la cosa puede ser peor si además tiene mala intención y se le ocurren cosas como

digo<script type="text/javascript">// <![CDATA[
puñetitas en javascript
// ]]></script>

Se ejecutará el código que el haya querido.

Nuevamente PHP nos pone las cosas fáciles. La función htmlentities() coge todos los caracteres especiales de html y los reemplaza por los equivalentes para que se visualicen. Así, por ejemplo, cambia los < por & lt ;

Con esto, el usuario puede meter lo que quiera, que se verá tal cual lo meta, sin permitir «efectos especiales html».

$nuevacadena = htmlentities($cadena);


Retornos de carro
En un textarea de html el usuario puede meter muchas lineas. Las líneas se cortan automáticamente si son muy largas y otras las corta el usuario introduciendo nueva línea (retorno de carro).

Si dejamos esto así, tal cual, cuando mostremos en pantalla ese texto, saldrá todo seguido, ya que nadie convierte esos retornos de carro del usuario en tags br de html.

Una vez más, PHP nos lo da todo hecho. La función nl2br() nos hace esa conversión, cambiando los \n por <br>

$nuevacadena=nl2br($cadena);

#javascript que realiza la cuenta de los caracteres que se han escrito en un campo de formulario #textarea, al mismo tiempo que se están escribiendo by @desarrolloweb.com

Fuente: desarrolloweb.com

El diseño de este script fue motivado por la necesidad de hacer la típica caja para enviar mensajes SMS desde Internet. El tamaño máximo de un mensaje SMS de móvil es de 160 caracteres, con lo que es muy útil que la propia página te informe sobre el número de caracteres que se llevan escritos en el mensaje, para que el interesado no se pase del máximo permitido.

El funcionamiento es muy sencillo de entender, pero en cualquier caso podemos ver el script en marcha para saber exactamente qué nos proponemos.

El Formulario

La página presentará un formulario con dos campos. El primero con el textarea donde el usuario escribirá el mensaje y el segundo, un campo de texto donde mostraremos en todo momento los caracteres escritos.

El único detalle a tener en cuenta relacionado con Javascript es el par de eventos que tenemos definidos dentro del campo textarea, que sirven para llamar a la función que realiza la cuenta de los caracteres en el momento que el usuario presiona o suelta las teclas. Concretamente se utiliza el evento onKeyDown para definir las acciones a realizar cuando se aprete la tecla y onKeyUp, para definir acciones a ejecutar cuando se suelta la tecla apretada.

<form action="#" method="post">
<table>
<tr>
<td>Texto:</td>
<td><textarea cols="40" rows="5" name="texto" onKeyDown="cuenta()" onKeyUp="cuenta()"></textarea></td>
</tr>
<tr>
<td>Caracteres:</td>
<td><input type="text" name=caracteres size=4></td>
</tr>
</table>
</form>

El script que cuenta caracteres
Con el formulario y el par de eventos introducidos tenemos todo lo necesario para que se cuenten -y recuenten- los caracteres cada vez que el visitante, situado sobre el textarea, pulsa sobre las teclas, es decir, cada vez que se escribe texto en el textarea. Ahora simplemente nos queda definir la función que se encarga de realizar la cuenta propiamente dicha y situarla en el otro campo de texto del formulario.

<script> 
function cuenta(){ 
      	document.forms[0].caracteres.value=document.forms[0].texto.value.length 
} 
</script>

Puede que a muchos haya sorprendido la sencillez del script, pero es que no hace falta más.

La propiedad value del textarea contiene el texto escrito y a su vez, la propiedad length guarda el número de caracteres de dicho texto. Así, document.forms[0].texto.value.length equivale al número de caracteres introducidos dentro del textarea. Este valor se asigna al contenido del campo de texto del formulario donde guardamos el número de caracteres, mediante la propiedad value del campo: document.forms[0].caracteres.value.

Con todo ello, se mostrará en el campo de texto el número de caracteres del textarea. Se puede ver el ejemplo en una página aparte.

Esperamos que este script haya solucionado vuestras necesidades para llevar la cuenta de los caracteres escritos en el textarea. Si deseamos además restringir el textarea para que no se pueda escribir más que un número de caracteres determinado, puedes continuar esta lectura con el artículo Evitar que un textarea sobrepase un número de caracteres permitidos.