2004/01/15

Excelente tip de PHP, por Harry Fuecks

Harry Fuecks, de phpPatterns, esta trabajando en SitePoint en la redacción de un libro sobre PHP, llamado The PHP Anthology, con soluciones prácticas para problemas comunes. El libro parece ser muy interesante, Harry es uno de mis autores favoritos en lo relativo a PHP, y los capitulos de ejemplo del libro parecen muy interesante.

Y ahora llego a lo que queria, al bajar los ejemplos tuve que suscribirme a una lista de correo. Pues bien, me llego un email con el titulo How to write portable PHP code!, donde estaba un tip fantastico, y es tan simple que me pregunto como no se me ocurrio antes. Quienes hayan programado en PHP deben estar al tanto de las malditas magic_quotes_gpc, que para los neofitos, les cuento que es un mecanismo automático para escapar todas las comillas que lleguen via GET, POST o COOKIE. No vamos a discutir si es bueno o malo eso, sino que no en todos lados esta configurado igual, y a veces tenemos que lidiar con ellas, como escapar las comillas o desescapar las comillas en cada variable, como en este ejemplo:

<?php
echo get_magic_quotes_gpc();        // 1
echo $_POST['lastname'];            // O\'reilly
echo addslashes($_POST['lastname']); // O\\\'reilly

if (!get_magic_quotes_gpc()) {
   $lastname = addslashes($_POST['lastname']);
} else {
   $lastname = $_POST['lastname'];
}

echo $lastname; // O\'reilly
$sql = "INSERT INTO lastnames (lastname) VALUES ('$lastname')";
?>

Yo prefiero trabajar sin las magic_quotes activas, dado que para trabajar con bases de datos utilizo el modulo PEAR::DB, que realiza este trabajo por mi. Y me molesta que en mi servidor de desarrollo no tengo que llamar a stripslashes porque tengo configurado que no utilice esta característica, pero en producción muchas veces si esta, entonces tengo que modificar el código. Y aquí es donde le agradezco a Harry por este snippet que me llego por mail:

<?php
/**
 * Checks for magic_quotes_gpc = On and strips them from incoming
 * requests if necessary
 */
if(get_magic_quotes_gpc()) {
  $_GET    = array_map('stripslashes', $_GET);
  $_POST   = array_map('stripslashes', $_POST);
  $_COOKIE = array_map('stripslashes', $_COOKIE);
}
?<

Ya lo estoy agregando al inicio de mis archivos de configuracón de proyecto, y nunca más tendre que lidiar con addslashes y stripslashes!!!.

[ inkel | | ]