array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'es', ), 'this' => array ( 0 => 'faq.using.php', 1 => 'Utilizar PHP', ), 'up' => array ( 0 => 'faq.php', 1 => 'FAQ', ), 'prev' => array ( 0 => 'faq.build.php', 1 => 'Problemas de Compilación', ), 'next' => array ( 0 => 'faq.passwords.php', 1 => 'Hash de Contraseñas', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'es', 'path' => 'faq/using.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
Esta sección reúne varios errores comunes a los que se puede enfrentar mientras se escriben scripts de PHP.
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".
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;
}
?>
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.
<?php
function mi_función($argumento)
{
echo $argumento + 10;
}
$variable = 10;
echo "mi_función($variable) = " . mi_función($variable);
?>
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.
<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.
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.
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()
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 .
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.
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
.
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.
Hay algunas alternativas escritas en PHP como » FPDF y » TCPDF.
Las opciones disponibles son K (para Kilobytes), M (para Megabytes) y G (para
Gigabytes). 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().
Observe que el valor numérico se moldea a integer;
por ejemplo, 0.5M
es interpretado como 0
.
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.