Capítulo 70. Uso de PHP

Esta sección reúne varios errores comunes que usted puede enfrentar cuando escribe scripts PHP.

1. Quisiera escribir un script PHP genérico que pudiera manejar datos que lleguen desde cualquier formulario. ¿Cómo averiguo qué variables del método POST se encuentran disponibles?
2. Necesito convertir todas las comillas sencillas (') en una barra invertida seguida de una comilla sencilla (\'). ¿Cómo puedo hacer esto con una expresión regular? También me gustaría convertir " en \" y \ en \\.
3. Todos mis caracteres " se convierten en \" y mis ' se convierten en \', ¿cómo me deshago de todas esas barras invertidas indeseadas? ¿Cómo y porqué llegaron allí?
4. Cuando hago lo siguiente, la salida se imprime en el orden equivocado:
<?php
function mi_funcion($argumento)
{
    echo
$argumento + 10;
}
$variable = 10;
echo
"mi_funcion($variable) = " . mi_funcion($variable);
?>
¿qué sucede?
5. ¿Hey, qué ha sucedido con mis saltos de línea?
<pre>
<?php echo "Esta debe ser la primera l&iacute;nea."; ?>
<?php
echo "Esto debe aparecer despu&eacute;s de la nueva l&iacute;nea anterior."; ?>
</pre>
6. Recibo el mensaje 'Warning: Cannot send session cookie - headers already sent...' o 'Cannot add header information - headers already sent...'.
7. Necesito acceder a información directamente de las cabeceras de la petición. ¿Cómo puedo hacer esto?
8. Cuando intento usar autenticación con IIS, recibo el mensaje 'No Input file specified'.
9. Windows: No puedo acceder a archivos compartidos en otra computadora usando IIS
10. Mi script PHP funciona en IE y Lynx, pero en Netscape parte de mi salida está faltando. Cuando acciono "Ver código fuente" veo el contenido en IE pero no en Netscape.
11. ¿Cómo se supone que mezcle XML y PHP? ¡Se queja sobre mis etiquetas <?xml!
12. ¿Cómo puedo usar PHP con FrontPage u otro editor HTML que insiste en mover mi código por todas partes?
13. ¿En dónde puedo encontrar una lista completa de variables disponibles en PHP?
14. ¿Cómo puedo generar archivos PDF sin usar las bibliotecas no-libres y comerciales ClibPDF y PDFLib? Quisiera algo que fuera gratuito y no requiera de bibliotecas PDF externas.
15. Estoy tratando de acceder a una de las variables CGI estándar (como $DOCUMENT_ROOT o $HTTP_REFERER) en una función definida por el usuario, y parece que no la encuentra. ¿Qué está fallando?
16. Algunas directivas de PHP pueden recibir también atajos de valores de bytes, en lugar de recibir sólamente valores de bytes tipo integer. ¿Cuáles son todas las opciones de atajos de valores de byte disponibles? ¿Y puedo usarlos por fuera de php.ini?

1. Quisiera escribir un script PHP genérico que pudiera manejar datos que lleguen desde cualquier formulario. ¿Cómo averiguo qué variables del método POST se encuentran disponibles?

PHP ofrece numerosas variables predefinidas, como la super-global $_POST. Usted podría recorrer $_POST con un ciclo ya que se trata de una matriz asociativa con todos los valores POST. Por ejemplo, puede recorrer la matriz simplemente con foreach, realizar un chequeo por valores empty(), e imprimirlos.
<?php
$vacio
= $post = array();
foreach (
$_POST as $nombre_var => $valor_var) {
    if (empty(
$valor_var)) {
        
$vacio[$nombre_var] = $valor_var;
    } else {
        
$post[$nombre_var] = $valor_var;
    }
}

print
"<pre>";
if (empty(
$vacio)) {
    print
"Ninguno de los valores POST est&aacute;n vac&iacute;os, se envi&oacute;:\n";
    
var_dump($post);
} else {
    print
"Tenemos " . count($vacio) . " valores vac&iacute;os\n";
    print
"Se envi&oacute;:\n"; var_dump($post);
    print
"Vac&iacute;os:\n";  var_dump($vacio);
    exit;
}
?>

Superglobals: Nota de disponibilidad: Desde 4.1.0, están disponibles algunas matrices superglobales tales como $_GET, $_POST, y $_SERVER, etc. Para más información puede consultar la sección superglobals

2. Necesito convertir todas las comillas sencillas (') en una barra invertida seguida de una comilla sencilla (\'). ¿Cómo puedo hacer esto con una expresión regular? También me gustaría convertir " en \" y \ en \\.

La función addslashes() hace esto. Vea también mysql_escape_string(). También puede remover las barras invertidas con stripslashes().

Nota de directiva: magic_quotes_gpc: La directiva PHP magic_quotes_gpc tiene por defecto el valor on. Básicamente ejecuta addslashes() en los datos obtenidos por GET, POST, y COOKIE. Se puede usar stripslashes() para quitarlos.

3. Todos mis caracteres " se convierten en \" y mis ' se convierten en \', ¿cómo me deshago de todas esas barras invertidas indeseadas? ¿Cómo y porqué llegaron allí?

La función de PHP stripslashes() eliminará todas esas barras invertidas de su variable string. Lo más posible es que esas barras invertidas existen mágicamente por que la directiva de PHP magic_quotes_gpc está activa.

Nota de directiva: magic_quotes_gpc: La directiva PHP magic_quotes_gpc tiene por defecto el valor on. Básicamente ejecuta addslashes() en los datos obtenidos por GET, POST, y COOKIE. Se puede usar stripslashes() para quitarlos.

4. Cuando hago lo siguiente, la salida se imprime en el orden equivocado:
<?php
function mi_funcion($argumento)
{
    echo
$argumento + 10;
}
$variable = 10;
echo
"mi_funcion($variable) = " . mi_funcion($variable);
?>
¿qué sucede?

Para poder usar los resultados de su función en una expresión (como ocurre al concatenar con otras cadenas, como en el ejemplo anterior), necesita devolver el valor mediante return(), no imprimirlo con echo().

5. ¿Hey, qué ha sucedido con mis saltos de línea?
<pre>
<?php echo "Esta debe ser la primera l&iacute;nea."; ?>
<?php
echo "Esto debe aparecer despu&eacute;s de la nueva l&iacute;nea anterior."; ?>
</pre>

En PHP, el final de un bloque de código es, o bien "?>" o "?>\n" (en donde \n quiere decir una nueva línea). De modo que en el ejemplo anterior, las sentencias impresas con echo estarán en una línea, puesto que PHP omite los saltos de línea después del final del bloque. Esto quiere decir que usted necesita insertar un salto de línea extra después de cada bloque de código PHP para hacer que imprima una nueva línea.

¿Porqué hace esto PHP? Por que al dar formato a un documento HTML normal, este comportamiento por lo general hace su vida más simple, ya que no desea ese salto de línea, pero tendría que crear líneas extremadamente largas o de otra forma hacer ilegible el código fuente base para lograr ese efecto.

6. Recibo el mensaje 'Warning: Cannot send session cookie - headers already sent...' o 'Cannot add header information - headers already sent...'.

Las funciones header(), setcookie(), y las funciones de sesión necesitan agregar cabeceras a la secuencia de salida, pero las cabeceras sólo pueden ser enviadas antes del resto del contenido. No puede haber salida antes de usar éstas funciones, salida como HTML. La función headers_sent() revisa si su script ya ha enviado las cabeceras, y asimismo consulte las funciones de Control de Salida.

7. Necesito acceder a información directamente de las cabeceras de la petición. ¿Cómo puedo hacer esto?

La función getallheaders() hará esto si está ejecutando PHP como módulo de Apache. Así que, el siguiente segmento de código le mostrará todas las cabeceras de petición:
<?php
$cabeceras
= getallheaders();
foreach (
$cabeceras as $nombre => $contenido) {
    echo
"cabeceras[$nombre] = $contenido<br />\n";
}
?>

Vea también apache_lookup_uri(), apache_response_headers(), y fsockopen()

8. Cuando intento usar autenticación con IIS, recibo el mensaje 'No Input file specified'.

El modelo de seguridad de IIS es la causa del problema aquí. Este es un inconveniente común a todos los programas CGI que corren bajo IIS. Una forma de evitar el problema es crear un archivo HTML plano (no interpretado por PHP) como página de entrada en un directorio autenticado. Luego usar una etiqueta META para redirigir a la página PHP, o tener un enlace hacia la página PHP. PHP reconocerá entonces la autenticación correctamente. Con el módulo ISAPI, esto no es un problema. Este inconveniente no debe afectar otros servidores web NT. Para más información, vea: http://support.microsoft.com/kb/q160422/ y la sección del manual sobre Autenticación HTTP.

9. Windows: No puedo acceder a archivos compartidos en otra computadora usando IIS

Necesita modificar el valor Go to Internet Information Services. Ubique su archivo PHP y diríjase a sus propiedades. Vaya a la pestaña Seguridad de Archivo, Editar -< Acceso anónimo y control de autenticación.

Puede solucionar el problema ya sea deshabilitando Acceso Anónimo y dejando habilitado Autenticación Integrada, o habilitando Acceso Anónimo y editando el usuario ya que éste puede no tener el acceso bien definido.

10. Mi script PHP funciona en IE y Lynx, pero en Netscape parte de mi salida está faltando. Cuando acciono "Ver código fuente" veo el contenido en IE pero no en Netscape.

Netscape es más estricto que IE en cuanto a etiquetas HTML (como tablas) se refiere. Pasar su salida HTML a través de un validador de HTML, como validator.w3.org, puede ser de ayuda. Por ejemplo, una etiqueta </table> faltante puede ser la causa de éste problema.

Asimismo, tanto IE como Lynx ignoran los caracteres NUL (\0) en la secuencia HTML, mientras que Netscape no. La mejor manera de chequear esto es compilar la versión de línea de comandos de PHP (también conocida como la versión CGI) y ejecutar su script desde la línea de comandos. En *nix, envíe la salida a través de un pipe a od -c y busque caracteres \0. Si se encuentra en Windows necesita un editor o algún otro programa que le permita ver archivos binarios. Cuando Netscape ve un NUL en un archivo, típicamente no imprimirá nada más en aquella línea, mientras que tanto IE como Lynx si lo hacen.

11. ¿Cómo se supone que mezcle XML y PHP? ¡Se queja sobre mis etiquetas <?xml!

Para poder embeber etiquetas <?xml directamente en su código PHP, tendrá que deshabilitar las etiquetas cortas, definiendo la directiva PHP short_open_tags como 0. No puede definir esta directiva con ini_set(). Independientemente del valor de short_open_tags, usted puede hacer algo como: <?php echo '<?xml'; ?>. El valor predeterminado para esta directiva es on.

12. ¿Cómo puedo usar PHP con FrontPage u otro editor HTML que insiste en mover mi código por todas partes?

Una de las cosas más fáciles es habilitar el uso de etiquetas ASP en su código PHP. Esto le permite usar el estilo de delimitadores de código ASP <% y %>. Algunos de los editores HTML populares gestionan éstas etiquetas de forma más inteligente (por ahora). Para habilitar las etiquetas estilo-ASP, necesita definir la variable php.ini asp_tags, o usar la directiva de Apache apropiada.

13. ¿En dónde puedo encontrar una lista completa de variables disponibles en PHP?

Consulte la página del manual sobre variables predefinidas, ya que allí se incluye una lista parcial de variables predefinidas disponibles para su script. Una lista completa de variables disponibles (y mucha más información) puede ser consultada al llamar la función phpinfo(). Asegúrese de leer la sección del manual sobre variables externas a PHP ya que allí se describen escenarios comunes para variables externas, como las provenientes de formularios HTML, Cookies y URLs.

register_globals: Nota importante: Desde PHP 4.2.0 el valor por defecto de la directiva register_globals es off. La comunidad PHP anima a todos a no confiar en esta directiva y usar en su lugar superglobals.

14. ¿Cómo puedo generar archivos PDF sin usar las bibliotecas no-libres y comerciales ClibPDF y PDFLib? Quisiera algo que fuera gratuito y no requiera de bibliotecas PDF externas.

Existen algunas pocas alternativas escritas en PHP, como http://www.ros.co.nz/pdf/, http://www.fpdf.org/, http://www.gnuvox.com/pdf4php/, y http://www.potentialtech.com/ppl.php. También existe el módulo Panda.

15. Estoy tratando de acceder a una de las variables CGI estándar (como $DOCUMENT_ROOT o $HTTP_REFERER) en una función definida por el usuario, y parece que no la encuentra. ¿Qué está fallando?

Es importante darse cuenta de que la directiva PHP register_globals también afecta a variables de servidor y de entorno. Cuando register_globals = off (el valor predeterminado es off a partir de PHP 4.2.0), $DOCUMENT_ROOT no existirá. En su lugar, use $_SERVER['DOCUMENT_ROOT']. Si register_globals = on entonces las variables $DOCUMENT_ROOT y $GLOBALS['DOCUMENT_ROOT'] existirán también.

Si está seguro de que register_globals = on y se pregunta porqué $DOCUMENT_ROOT no se encuentra disponible al interior de funciones, es porque éste tipo de variables es como cualquier otra, y requeriría de una sentencia global $DOCUMENT_ROOT al interior de la función. Vea también la página del manual sobre los contextos de variables. Es recomendable escribir código bajo el modelo register_globals = off.

Superglobals: Nota de disponibilidad: Desde 4.1.0, están disponibles algunas matrices superglobales tales como $_GET, $_POST, y $_SERVER, etc. Para más información puede consultar la sección superglobals

16. Algunas directivas de PHP pueden recibir también atajos de valores de bytes, en lugar de recibir sólamente valores de bytes tipo integer. ¿Cuáles son todas las opciones de atajos de valores de byte disponibles? ¿Y puedo usarlos por fuera de php.ini?

Las opciones disponibles son K (para Kilobytes), M (para Megabytes) y G (para Gigabytes; disponible desde PHP 5.1.0), las cuales son insensibles a mayúsculas y minúsculas. Cualquier otro valor asume bytes. 1M es igual a un Megabyte o 1048576 bytes. 1K es igual a un Kilobyte o 1024 bytes. No debería usar éstas notaciones cortas por fuera de php.ini, en su lugar use un valor integer de bytes. Vea la documentación de ini_get() para un ejemplo sobre cómo convertir tales valores.

Hosting by: hurra.com
Generated: 2007-01-26 18:00:38