PHP 5.4.36 Released

Usando PHP

Esta sección reune varios errores comunes a los que se puede enfrentar mientras se escriben scripts en PHP.

  1. No puedo recordar el orden de los parámetros de las funciones de PHP, ¿son aleatorias?
  2. Me gustaría escribir un script genérico en PHP que pueda usar datos en cualquier formato. ¿Cómo puedo saber que variables pasadas por el método POST están disponibles?
  3. Necesito convertir todas las comillas simples (') a barras invertidas seguidas de comillas simples (\'). ¿Cómo puedo hacer esto con expresiones regulares? También me gustaría convertir " a \" y \ a \\.
  4. Todas mis " se convirtieron en \" y mis ' en \', ¿cómo puedo deshacerme de todas esas barras no deseadas? ¿Cómo y porqué están ahí?
  5. ¿Cómo afecta la directiva register_globals de PHP?
  6. Cuando hago lo siguiente, la salida se muestra en el orden equivocado: <?php function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable); ?> ¿Qué está pasando?
  7. ¿Hey, qué le pasa a mis líneas nuevas? <pre> <?php echo "Esto debería ser la primer línea."; ?> <?php echo "Esto debería mostrarse después de la línea anterior."; ?> </pre>
  8. Recibo el mensaje 'Warning: Cannot send session cookie - headers already sent...' o 'Cannot add header information - headers already sent...'.
  9. Necesito accesar a información en las solicitudes de encabezados directamente. ¿Cómo puedo hacerlo?
  10. Cuando intento usar autenticación con IIS obtengo 'No Input file specified'. (no hay archivo de entrada especificado).
  11. Windows: No puedo accesar archivos compartidos en otra computadora usando IIS
  12. ¿Cómo se supone que mezclaría XML y PHP? no le parecen mis tags <?xml!
  13. ¿Dónde puedo encontrar una lista completa de variables disponibles en PHP?
  14. ¿Cómo puedo generar archivos PDF sin usar librerías no libres o librerías comerciales como PDFLib? Me gustaría algo que sea libre y no necesite librerías PDF externas.
  15. Estoy intentando accesar a una de las variables estándar CGI (como $DOCUMENT_ROOT o $HTTP_REFERER) en una función definida por el usuario, y parece que no puede encontrarla. ¿Qué está mal?
  16. Algunas directivas de PHP podrían recibir valores en bytes, en lugar de solo valores enteros. Cuales son las opciones de bytes disponibles? Y ¿puedo usarlas fuera de php.ini?
  17. En Windows: Tengo problemas intermitentes para conectar cuando utilizo localhost, "127.0.0.1" funciona?
No puedo recordar el orden de los parámetros de las funciones de PHP, ¿son aleatorias?

PHP es un pegamento que une cientos de librerías externas y esto a veces lo complica. Por eso, una simple regla de oro es la siguiente:

Los parámetros de una función Array están ordenados como "aguja, pajar" mientras que las funciones de Cadena son lo contrario, "pajar, aguja".

Me gustaría escribir un script genérico en PHP que pueda usar datos en cualquier formato. ¿Cómo puedo saber que variables pasadas por el método POST están disponibles?

PHP ofrece muchas variables predefinidas, como la variable superglobal $_POST. Se puede recorrer la variable $_POST como un array ya que es un array asociativo de todos los valores POSTeados. Por ejemplo, vamos a recorrer simplemente con foreach, revisar los valores vacíos(), e mostrarlos todos.

<?php
$empty 
$post = array();
foreach (
$_POST as $varname => $varvalue) {
    if (empty(
$varvalue)) {
        
$empty[$varname] = $varvalue;
    } else {
        
$post[$varname] = $varvalue;
    }
}

print 
"<pre>";
if (empty(
$empty)) {
    print 
"Ninguno de los valores POSTeados esta vacío, se envió:\n";
    
var_dump($post);
} else {
    print 
"Tenemos " count($empty) . " valores vacíos\n";
    print 
"posteados:\n"var_dump($post);
    print 
"Vacíos:\n";  var_dump($empty);
    exit;
}
?>

Nota: Nota de disponibilidad de Superglobals

Los arrays Superglobal como $_GET, $_POST y $_SERVER, etc. están disponibles desde PHP 4.1.0. Para más información, lea la sección del manual en superglobals

Necesito convertir todas las comillas simples (') a barras invertidas seguidas de comillas simples (\'). ¿Cómo puedo hacer esto con expresiones regulares? También me gustaría convertir " a \" y \ a \\.

Asumiendo que esto es para una base de datos, se puede usar el mecanismo que viene con ésta. Por ejemplo, usar la función mysql_real_escape_string() con MYSQL y pg_escape_string() con PostgreSQL. Hay también funciones genéricas como addslashes() y stripslashes(), que son más comunes en código PHP antiguo.

Nota: Nota de la 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.

Todas mis " se convirtieron en \" y mis ' en \', ¿cómo puedo deshacerme de todas esas barras no deseadas? ¿Cómo y porqué están ahí?

Lo más probable es que esas barras invertidas existan porque la directiva de PHP magic_quotes_gpc está activada. Esta es una característica antigua de PHP, y debería deshabilitarse y no usarse más. Pero, la función stripslashes() podría usarse para eliminar las barras invertidas de un string.

Nota: Nota de la 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.

¿Cómo afecta la directiva register_globals de PHP?
Advertencia

Esta característica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP 5.4.0.

En primer lugar, una explicación de lo que hace la configuración ini. Digamos que la siguiente URL esta siendo usada: http://example.com/foo.php?animal=cat y en el archivo foo.php tuviéramos el siguiente código PHP:

<?php
//Es preferible usar $_GET aqui
echo $_GET['animal'];

// para que la variable $animal exista, register_globlas debe estar en ON 
// NO SE DEBE HACER ESTO
echo $animal;

// Esto aplica a todas las variables, inclusve a las variables $_SERVER
echo $_SERVER['PHP_SELF'];

// de nuevo, para que $PHP_SELF exista, register_globals debe estar en ON
// NO SE DEBE HACER ESTO
echo $PHP_SELF;
?>

El código anterior demuestra como register_globals crea varias variables. Por años este tipo de código ha sido mal visto, y también ha sido deshabilitado por defecto. Así que aunque la mayoría de hosting deshabilitan register_globals, aun hay artículos desactualizados, tutoriales y libros que lo requieren habilitado.

Ver también los siguientes recursos para información adicional:

Nota:

En el ejemplo anterior, usamos una URL que contiene un QUERY_STRING. El paso de la información se hace a través de una solicitud HTTP GET, y es esta la razón por la que se usa la variables superglobal $_GET.

Cuando hago lo siguiente, la salida se muestra en el orden equivocado:
<?php
function myfunc($argument)
{
    echo 
$argument 10;
}
$variable 10;
echo 
"myfunc($variable) = " myfunc($variable);
?>
¿Qué está pasando?

Para habilitar que las funciones entreguen como resultado expresiones (como concatenarse con otras cadenas como en el ejemplo anterior), se necesita el valor return, no la función echo.

¿Hey, qué le pasa a mis líneas nuevas?
<pre>
<?php echo "Esto debería ser la primer línea."?>
<?php 
echo "Esto debería mostrarse después de la línea anterior."?>
</pre>

"?>\n" (donde \n significa una nueva línea). Entonces, en el En PHP, el fin para un bloque de código es o bien "?>" o ejemplo anterior, las sentencias a las que se les dio el echo estarán en una línea, porque PHP omite las líneas nuevas después del final de un bloque. Esto significa que se necesita agregar una línea extra después de cada bloque de código PHP para lograr que se imprima una nueva línea.

¿Porqué PHP hace esto? por que cuando se formatea HTML normal, esto normalmente hace la vida más fácil por que no se quiere esa nueva línea, pero se tendrían que crear líneas extremadamente largas o en otro caso hacer el código fuente de la pagina ilegible para que tenga 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 encabezados (headers) a la salida pero los encabezados solo pueden enviarse antes que cualquier otro contenido. No deben de haber salidas antes de usar esas funciones, salidas como HTML. La función headers_sent() chequeará si tu script ya ha enviado los headers y mirará también las Funciones de control de salidas.

Necesito accesar a información en las solicitudes de encabezados directamente. ¿Cómo puedo hacerlo?

La función getallheaders() hará esto si se ésta ejecutando PHP como un módulo de Apache. Entonces, el siguiente código mostrará todas las peticiones a los encabezados:

<?php
$headers 
getallheaders();
foreach (
$headers as $name => $content) {
    echo 
"headers[$name] = $content<br />\n";
}
?>

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

Cuando intento usar autenticación con IIS obtengo 'No Input file specified'. (no hay archivo de entrada especificado).

El modelo de seguridad de IIS falla aquí. Este es un problema común de todos los programas CGI que se ejecutan bajo IIS. Una solución es crear un archivo plano HTML (no interpretado por PHP) como la página de entrada en el directorio autenticado. Entonces usa el tag META para direccionar a la página en PHP, o ten un enlace a la página en PHP. Entonces PHP reconocerá la autenticación correctamente. Con el módulo ISAPI, esto no es un problema. Esto no debería afectar otros servidores web NT. Para más información, ver: » http://support.microsoft.com/kb/q160422/ y la sección del manual Autenticación HTTP.

Windows: No puedo accesar archivos compartidos en otra computadora usando IIS

Se tiene que cambiar el Go to Internet Information Services. Se debe localizar el archivo PHP e ir a sus propiedades. Luego ir al tab Seguridad de Archivos y, Editar -< Acceso anónimo y control de autenticación.

Se puede corregir el problema ya sea deshabilitando Acceso anónimo y dejando Autenticación Integrada de Windows marcado, o, marcando Acceso anónimo y editando al usuario ya que no tendría que tener acceso.

¿Cómo se supone que mezclaría XML y PHP? no le parecen mis tags <?xml!

Con el fin de integrar directamente <?xml en el código PHP, se tiene que deshabilitar los tags cortos en la directiva de PHP short_open_tags poniéndolo a 0. No se puede establecer esta directiva con ini_set(). Independientemente de que short_open_tags este On u Off, se puede hacer algo como: <?php echo '<?xml'; ?>. La directiva por defecto es On.

¿Dónde puedo encontrar una lista completa de variables disponibles en PHP?

Leer la página del manual variables predefinidas el cual incluye una lista parcial de variables predefinidas disponibles para tu script. Una lista completa de variables disponibles (y mucha mas información) puede ser vista llamando a la función phpinfo(). Hay que asegurarse de leer la sección del manual variables desde fuera de PHP el cuál describe escenarios comunes para variables externas, como por ejemplo desde un formulario HTML, una Cookie, y una URL.

Nota: register_globals: Observación importante

Desde PHP 4.2.0, el valor por defecto de la directiva register_globals es off. La comunidad de PHP desaconseja el uso de esta directiva y sugiere el uso de otras formas como superglobals.

¿Cómo puedo generar archivos PDF sin usar librerías no libres o librerías comerciales como PDFLib? Me gustaría algo que sea libre y no necesite librerías PDF externas.

Hay algunas alternativas escritas en PHP como » FPDF y » TCPDF.

También esta la extensión Haru que usa la librería externa libHaru.

Estoy intentando accesar a una de las variables estándar CGI (como $DOCUMENT_ROOT o $HTTP_REFERER) en una función definida por el usuario, y parece que no puede encontrarla. ¿Qué está mal?

Es importante realizar que la directiva de PHP register_globals tenga efectos en el servidor y las variables del entorno. Cuando register_globals = off (el valor por defecto desde PHP 4.2.0), $DOCUMENT_ROOT no existe. En su lugar, se debe usar $_SERVER['DOCUMENT_ROOT']. Si register_globals = on entonces las variables $DOCUMENT_ROOT y $GLOBALS['DOCUMENT_ROOT'] también existirán.

Si se está seguro de que register_globals = on y se pregunta porque $DOCUMENT_ROOT no esta disponible para las funciones, es por que son como las otras variables y requerirán la variable global $DOCUMENT_ROOT dentro de la función. Ver también la página del manual en ámbito de las variables. Es preferible hacer el código con register_globals = off.

Nota: Nota de disponibilidad de Superglobals

Los arrays Superglobal como $_GET, $_POST y $_SERVER, etc. están disponibles desde PHP 4.1.0. Para más información, lea la sección del manual en superglobals

Algunas directivas de PHP podrían recibir valores en bytes, en lugar de solo valores enteros. Cuales son las opciones de bytes disponibles? Y ¿puedo usarlas fuera de php.ini?

Las opciones disponibles son K (por Kilobytes), M (por Megabytes) y G (por Gigabytes; disponibles desde PHP 5.1.0), ellos son sensibles a mayúsculas y minúsculas. Cualquier otra cosa, asume bytes. 1M es igual a un Megabyte o 1048576 bytes. 1K es igual a un Kilobyte o 1024 bytes. No se debería usar esas abreviaciones fuera de php.ini, en su lugar se usa un valor entero de bytes. Ver la documentación de ini_get() para ver un ejemplo de como convertir esos valores.

Nota: kilobyte versus kibibyte

La notación de PHP describe que un kilobyte equivale a 1024 bytes, mientras que el estándar IEC considera que debe ser un kibibyte. Resumiendo: k y K = 1024 bytes.

En Windows: Tengo problemas intermitentes para conectar cuando utilizo localhost, "127.0.0.1" funciona?

Antes de PHP 5.3.4, existía un bug en el código de resolución de red dentro de PHP que causaba errores usando localhost en todas las situaciones relacionadas con streaming si IPv6 estaba habilitado. Para solucionar este problema se puede usar tanto "127.0.0.1" como deshabilitar el resolver usando IPv6 en el fichero hosts.

add a note add a note

User Contributed Notes 3 notes

up
2
greenie2600 at yahoo dot com
7 years ago
Here's a simple function that will convert the shorthand values described in point 64.16 to a number of bytes.

I use this to display the maximum size of file uploads to the user, so they don't waste time uploading a huge file only to find that it's too big. (I've been unable to find any browsers that actually support the MAX_FILE_SIZE technique described in chapter 38, and it's certainly not part of any W3C spec, so this is the next best thing.)

Here's how you'd use my function for that purpose (though you might want to abstract this to a function of its own):

<?php
echo 'Maximum file size: ' . convertBytes( ini_get( 'upload_max_filesize' ) ) / 1048576 . 'MB';
?>

And here's the function:

<?php
/**
* Convert a shorthand byte value from a PHP configuration directive to an integer value
* @param    string   $value
* @return   int
*/
function convertBytes( $value ) {
    if (
is_numeric( $value ) ) {
        return
$value;
    } else {
       
$value_length = strlen( $value );
       
$qty = substr( $value, 0, $value_length - 1 );
       
$unit = strtolower( substr( $value, $value_length - 1 ) );
        switch (
$unit ) {
            case
'k':
               
$qty *= 1024;
                break;
            case
'm':
               
$qty *= 1048576;
                break;
            case
'g':
               
$qty *= 1073741824;
                break;
        }
        return
$qty;
    }
}
?>
up
2
kjn
7 years ago
64.16 Byte Values

The number that precedes K, M, or G should be an integer.

E.g. this php.ini directive:
   post_max_size = 0.25M
is interpreted as 0, and thus prevents all POSTs.

It is particularly unhelpful that phpinfo() reports the string value assigned to post_max_size (0.25M), and not the numerical value that PHP extracts from that string (0M).
up
0
info at zankmusic dot com
5 years ago
Just spent a couple days on this one...
As previously posted, if you set
upload_max_filesize = 0.25M, the value reads correctly in phpinfo(), BUT it is effectively ZERO when implemented.

Note that the following also give ZERO bytes:

upload_max_filesize =  10M  (note the two white spaces before 10M), but the phpinfo() reads '10M' and everything looks ok.

I removed all white spaces in my php.ini file and viola...working fine again.
To Top