# 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. 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?
5. ¡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>
6. Recibo el mensaje 'Warning: Cannot send session cookie - headers already sent...' o 'Cannot add header information - headers already sent...'.
7. Necesito acceder directamente a información de las cabeceras de una petición. ¿Cómo puedo hacerlo?
8. Cuando intento usar la autenticación con IIS obtengo el mensaje 'No Input file specified'.
9. Windows: No puedo acceder a ficheros compartidos en otra computadora usando IIS
10. ¿Cómo se supone que mezclo XML y PHP? ¡A este no le gustan mis etiquetas <?xml!
11. ¿Dónde puedo encontrar un listado completo de las variables disponibles de PHP?
12. ¿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.
13. 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?

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.

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.

¿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.

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). 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.