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í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?
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án vacíos, se envió:\n"; var_dump($post); } else { print "Tenemos " . count($vacio) . " valores vacíos\n"; print "Se envió:\n"; var_dump($post); print "Vací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 \.
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ínea."; ?> <?php echo "Esto debe aparecer después de la nueva lí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...'.
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
() 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 . 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.
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.
|