|
|
 |
CapÃtulo 55. 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:
|
<?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
(\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.
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.
oldcheesemonkey at yahoo dot com
19-Jan-2006 12:54
In reference to faq.using:
6. I get the message 'Warning: Cannot send session cookie - headers already sent...' or 'Cannot add header information - headers already sent...'.
This can be caused by starting a session and then calling a class function in a php file that has any whitespace either before the very first or after the very last php tags <?php and ?>.
Make sure there is NO whitespace before the initial tag and after the closing tag.
| |
| | Citas célebres | Qué inapropiado llamar Tierra a este planeta, cuando es evidente que debería llamarse Océano. Arthur Clarke Escritor británico (n. 1914) | | Citas en tu mail | | ©Contenidos Gratis |
| Chiste de... Parejas | | Hablar de matrimonio | Dos amigas están hablando:
- Pues ya he conseguido que mi novio me hable de matrimonio después de haber estado saliendo seis años.
- ¿Si? ¿Y qué te ha dicho?
- Que tiene esposa y tres niños. | | Chistes en tu mail | | ©ContenidosGratis |
| Inicio | Acción | Estrategia | Palabras | Puzzles | Solitarios | Foro Trucos |  | Cake Mania Jugadores: 6835 Categoría del juego: Acción Objetivo del juego: Ayuda a Jill a recuperar la pastelería de su abuela llevando su propia pastelería; consigue clientes y gana dinero. |
|  | Rainbow Web Jugadores: 2199 Categoría del juego: Puzzles Objetivo del juego: Rompe un pegajoso hechizo y salva un reino de fantasía en Rainbow Web. Tendrás toneladas de diversión mientras juegas a este mágico desafío para la mente. |
|  | Mahjongg Fortuna Jugadores: 12462 Categoría del juego: Solitarios Objetivo del juego: Velocidad y habilidad mental son las armas más importantes en esta versión de un antiguo juego asiático. Despeja el tablero lo antes posible haciendo clic en las fichas iguales y gánate la fama eterna de la puntuación más alta. |
|  | Chainz 2 Jugadores: 6955 Categoría del juego: Puzzles Objetivo del juego: Entra en el mundo de las combinaciones con Chainz 2: Relinked, emocionante secuela del exitazo del año pasado, Chainz. Gira eslabones y crea combinaciones de 3 ó más. |
|  | Delicious Jugadores: 4405 Categoría del juego: Acción Objetivo del juego: ¿Eres un as de la multitarea? ¿Quieres que tus clientes estén contentos? ¡Pues Delicious es tu juego! Sacia el apetito de los clientes y tenlos contentos; ¡no te arriesgues! |
|  | Bookworm Jugadores: 4568 Categoría del juego: Palabras Objetivo del juego: Junta las letras para formar palabras. ¡Las palabras más largas valen más puntos! |
|  | Zuma Jugadores: 4976 Categoría del juego: Acción Objetivo del juego: Controla el ídolo de la rana de piedra de los antiguos Zuma en este intrigante enigma de acción. ¡Dispara bolas para formar conjuntos de tres, pero si dejas que lleguen a la calavera dorada morirás! |
|  | Jewel of Atlantis Jugadores: 3798 Categoría del juego: Puzzles Objetivo del juego: Descubre la ciudad hundida de la Atlántida y busca valiosos tesoros. Viaja más allá de las profundidades del mar y vive trepidantes aventuras en Jewel of Atlantis. |
|  | Jewel Quest Jugadores: 3727 Categoría del juego: Puzzles Objetivo del juego: Convierte la arena de la antigua selva en oro tan rápido como puedas juntando grupos de 3 elementos. ¡Los grupos más grandes valen más puntos! |
|  | Bejeweled 2 Jugadores: 3659 Categoría del juego: Puzzles Objetivo del juego: Con cuatro modos de juego únicos y fascinantes, nuevas piezas de juego explosivas e imponentes fondos planetarios, Bejeweled 2 es mucho más adictivo que nunca. |
|
|