Forum und email

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: <?phpfunction 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ínea."; ?><?php echo "Esto debe aparecer después de la nueva lí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?
  17. 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;
    }
    ?>

    Note: 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

    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().

    Note: 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.

    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.

    Note: 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.

    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().

    ¿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.

    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.

    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()

    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: » https://support.microsoft.com/kb/q160422/ y la sección del manual sobre Autenticación HTTP.

    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.

    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.

    ¿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