PHP 5.6.29 Released

Utilizar PHP

Esta sección reúne varios errores comunes a los que se puede enfrentar mientras se escriben scripts de PHP.

  1. No puedo recordar el orden de los parámetros de las funciones de PHP, ¿son aleatorios?
  2. Me gustaría escribir un script genérico en PHP que pueda manejar datos provenientes de cualquier formulario. ¿Cómo puedo saber qué variables del método POST están disponibles?
  3. Necesito convertir todas las comillas simples (') en barras invertidas seguidas de comillas simples (\'). ¿Cómo puedo hacer esto con expresiones regulares? También me gustaría convertir " en \" y \ en \\.
  4. Todas mis " se convirtieron en \" y mis ' en \', ¿cómo puedo deshacerme de todas esas barras no deseadas? ¿Cómo y por qué están ahí?
  5. ¿Cómo me afecta la directiva register_globals de PHP?
  6. Cuando hago lo siguiente, la salida se muestra en el orden equivocado: <?php function mi_función($argumento) { echo $argumento + 10; } $variable = 10; echo "mi_función($variable) = " . mi_función($variable); ?> ¿Qué está pasando?
  7. ¡Eh!, ¿qué les pasa a mis nuevas líneas? <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 acceder directamente a información de las cabeceras de una petición. ¿Cómo puedo hacerlo?
  10. Cuando intento usar la autenticación con IIS obtengo el mensaje 'No Input file specified'.
  11. Windows: No puedo acceder a ficheros compartidos en otra computadora usando IIS
  12. ¿Cómo se supone que mezclo XML y PHP? ¡A este no le gustan mis etiquetas <?xml!
  13. ¿Dónde puedo encontrar un listado completo de las variables disponibles de PHP?
  14. ¿Cómo puedo generar ficheros PDF sin usar bibliotecas no gratuitas o comerciales como PDFLib? Me gustaría algo que sea gratis y no requiera bibliotecas de PDF externas.
  15. Estoy intentando acceder a una de las variables estándar de 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 pueden también tomar una abreviatura de valores de bytes, en lugar de solo valores de bytes integer. ¿Cuáles son todas las opciones de abreviaturas de bytes disponibles?
  17. Windows: Mis conexiones caducan al utilizar localhost, mientras que "127.0.0.1" funciona.
No puedo recordar el orden de los parámetros de las funciones de PHP, ¿son aleatorios?

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

Los parámetros de las funciones de Array están ordenados como "aguja, pajar", mientras que sucede lo contrario con las funciones de String, esto es, "pajar, aguja".

Me gustaría escribir un script genérico en PHP que pueda manejar datos provenientes de cualquier formulario. ¿Cómo puedo saber qué variables del método POST están disponibles?

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

<?php
$vacío 
$post = array();
foreach (
$_POST as $nombre_variable => $nombre_valor) {
    if (empty(
$nombre_valor)) {
        
$vacío[$nombre_variable] = $nombre_valor;
    } else {
        
$post[$nombre_variable] = $nombre_valor;
    }
}

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

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

Asumiendo que esto es para una base de datos, utilice el mecanismo de escape que viene con esta. Por ejemplo, emplee la función mysql_real_escape_string() con MYSQL y pg_escape_string() con PostgreSQL. Existen también las funciones genéricas addslashes() y stripslashes(), las cuales son más comunes en código PHP antiguo.

Nota: Sobre de la directiva: magic_quotes_gpc

La directiva de 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 por qué 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 que debería deshabilitarse y no usarse más. También se puede utilizar la función stripslashes() para eliminar las barras invertidas de un string.

Nota: Sobre de la directiva: magic_quotes_gpc

La directiva de 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 me 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 este ajuste ini. Digamos que se está utilizando el siguiente URL: http://example.com/foo.php?animal=cat y en el fichero foo.php tuviéramos el siguiente código PHP:

<?php
// Aquí es preferible usar $_GET
echo $_GET['animal'];

// Para que $animal exista, register_globlas debe estar activado
// NO HAGA ESTO
echo $animal;

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

// De nuevo, para que $PHP_SELF exista, register_globals debe estar activado
// NO HAGA ESTO
echo $PHP_SELF;
?>

El código anterior demuestra cómo register_globals crea muchas variables. Durante años, este tipo de código ha sido mal visto, y durante años ha estado deshabilitado por defecto. Así que, aunque la mayoría de alojamientos web deshabilitan register_globals, aun existen artículos, tutoriales y libros desactualizados que requieren que esté habilitado. Actúe en consecuencia.

Véase también los siguientes recursos para más información:

Nota:

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

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

Para poder usar los resultados de funciones en una expresión (como la concatenación con otras cadenas del ejemplo anterior), es necesario devolver el valor con return; no utilzar echo.

¡Eh!, ¿qué les pasa a mis nuevas líneas?
<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>

En PHP, la terminación de un bloque de código se realiza bien con "?>" o con "?>\n" (donde \n significa una nueva línea). Con el ejemplo anterior, las sentencias de 'echo' estarán en una línea debido a que PHP omite las nuevas líneas después del final de un bloque. Esto significa que es necesario agregar una nueva línea extra después de cada bloque de código PHP para poder imprimir una nueva línea.

¿Por qué PHP hace esto? Porque cuando se formatea HTML normal, esto hace la vida más fácil ya que normalmente no se desea esa nueva línea, pero se tendrían que crear líneas extremadamente largas o, de lo contrario, hacer el código fuente de la pagina ilegible para obtener tal 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 al flujo de salida, pero las cabeceras solo pueden enviarse antes de cualquier otro contenido. No puede haber ninguna salida antes de usar esas funciones, salidas como HTML. La función headers_sent() comprobará si un script ya ha enviado las cabeceras. Véase también las funciones de control de salida.

Necesito acceder directamente a información de las cabeceras de una petición. ¿Cómo puedo hacerlo?

La función getallheaders() lo hará si se está ejecutando PHP como un módulo de Apache. El siguiente trozo de código mostrará todas las cabeceras de la petición:

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

Véae también apache_lookup_uri(), apache_response_headers(), y fsockopen()

Cuando intento usar la autenticación con IIS obtengo el mensaje 'No Input file specified'.

El modelo de seguridad de IIS es el culpable en este caso. Es un problema común a todos los programas CGI que se ejecutan bajo IIS. Una solución es crear un fichero de HTML plano (no analizado por PHP) como la página de entrada en un directorio autenticado. Se debe utilizar entonces una etiqueta META para redirigir a la página de PHP, o tener un enlace a dicha página. PHP reconocerá así la autenticación correctamente. Con el módulo ISAPI, esto no es un problema. Esto no debería afectar a otros servidores web NT. Para más información, véase: » http://support.microsoft.com/kb/q160422/ y la sección del manual sobre Autenticación HTTP .

Windows: No puedo acceder a ficheros compartidos en otra computadora usando IIS

Ha de cambiar Ir a los Servicios de Información de Internet. Localice su fichero PHP y vaya a sus propiedades. Luego vaya a la pestaña Seguridad de Archivos, Editar -< Acceso anónimo y control de autenticación.

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

¿Cómo se supone que mezclo XML y PHP? ¡A este no le gustan mis etiquetas <?xml!

Con el fin de integrar directamente <?xml en código de PHP, se han de desactivar las etiquetas abreviadas estableciendo la directiva de PHP short_open_tags a 0. Esta directiva no se puede establecer con ini_set(). Independientemente de que short_open_tags esté activada o no, se puede hacer algo como: <?php echo '<?xml'; ?>. El valor predeterminado de esta directiva es On.

¿Dónde puedo encontrar un listado completo de las variables disponibles de PHP?

Lea la página del manual sobre variables predefinidas, que incluye un listado parcial de variables predefinidas disponibles para su script. Se pude ver un listado completo de las variables disponibles (y mucha mas información) llamando a la función phpinfo(). Asegúrese de leer la sección del manual sobre variables desde fuentes externas a PHP, la cual describe escenarios comunes para variables externas, como desde un formulario HTML, una cookie, y un 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 ficheros PDF sin usar bibliotecas no gratuitas o comerciales como PDFLib? Me gustaría algo que sea gratis y no requiera bibliotecas de PDF externas.

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

También esta la extensión Haru que utiliza la biblioteca externa libHaru gratuita.

Estoy intentando acceder a una de las variables estándar de 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 saber que la directiva de PHP register_globals también afecta a variables de servidor y de entorno. Cuando register_globals = off (el valor por defecto desde PHP 4.2.0), $DOCUMENT_ROOT no existirá. En su lugar, se debe usar $_SERVER['DOCUMENT_ROOT'] . Si register_globals = on, las variables $DOCUMENT_ROOT y $GLOBALS['DOCUMENT_ROOT'] también existirán.

Si se está seguro de que register_globals = on y se pregunta por qué $DOCUMENT_ROOT no está disponible dentro de las funciones, es porque son como las demás variables, requiriendo dentro de la función global $DOCUMENT_ROOT. Véase también la página del manual sobre ámbito de las variables. Es preferible codificar con register_globals = off.

Algunas directivas de PHP pueden también tomar una abreviatura de valores de bytes, en lugar de solo valores de bytes integer. ¿Cuáles son todas las opciones de abreviaturas de bytes disponibles?

Las opciones disponibles son K (para Kilobytes), M (para Megabytes) y G (para Gigabytes; disponible desde PHP 5.1.0). Ninguna considera las mayúsculas/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. Estas notaciones abreviadas pueden utlizarse en php.ini y en la función ini_set().

Nota: kilobyte contra 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.

Windows: Mis conexiones caducan al utilizar localhost, mientras que "127.0.0.1" funciona.

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

add a note add a note

User Contributed Notes 6 notes

up
3
info at zankmusic dot com
7 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.
up
1
kjn
9 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
robjbrain at gmail dot com
1 month ago
There is no error message given if you accidentally use KB, MB or GB instead of K, M or G. From what I can tell the alphabetic characters will be ignored and it will be treated as bytes, so 1GB actually equals 1 Byte. phpinfo() and ini_get() will report what you have written e.g. 1GB, so it will not be clear that there is anything wrong with your setting even though there is.
up
-3
greenie2600 at yahoo dot com
9 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
forlfa at aol dot com
11 months ago
/*Array function parameters are ordered as "needle, haystack" whereas String functions are the opposite, so "haystack, needle".*/

I'm putting that at the top of every .php file I own.
up
-3
thierrybo
1 year ago
Using php 5.4.27 memory_limit = -1 does not give unlimited memory but actually 10485760 bytes (or 10M)
To Top