# Usar PHP

Esta sección reúne varios errores que puede encontrar al escribir sus scripts PHP.

1. No recuerdo el orden de los parámetros en las funciones PHP, ¿son aleatorios?
2. Me gustaría escribir un script PHP genérico que pudiera procesar datos de cualquier formulario. ¿Cómo puedo saber qué variables del método POST están disponibles?
3. Necesito convertir todas las comillas simples (') en una barra invertida seguida de una comilla simple (\'). ¿Cómo hacerlo con una expresión regular? También me gustaría convertir " en \" y \ en \\.
4. Cuando hago lo siguiente, la salida se muestra en el orden incorrecto: <?php function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable); ?> ¿Qué está pasando?
5. Hey, ¿dónde están mis nuevas líneas? <pre> <?php echo "Esta es mi primera línea."; ?> <?php echo "Esta debería mostrarse debajo de la primera."; ?> </pre>
6. Obtengo el mensaje 'Warning: Cannot send session cookie - headers already sent...' o 'Cannot add header information - headers already sent...'.
7. Necesito acceder a la información en el encabezado de solicitud directamente. ¿Cómo puedo hacerlo?
8. Cuando intento usar la autenticación con IIS obtengo 'No Input file specified'.
9. Windows: No puedo acceder a los archivos compartidos en otra computadora usando IIS.
10. ¿Cómo mezclar XML y PHP? PHP se queja de mis etiquetas <?xml !
11. ¿Dónde puedo encontrar una lista completa de las variables predefinidas que puedo usar en mis scripts PHP?
12. ¿Cómo puedo generar archivos PDF sin usar las bibliotecas no libres PDFLib? Me gustaría una manera gratuita y que no requiera bibliotecas PDF externas.
13. Algunas directivas PHP pueden tomar nombres literales, y no solo valores int. ¿Cuáles son todas las abreviaturas disponibles?

No recuerdo el orden de los parámetros en las funciones PHP, ¿son aleatorios?

  PHP reúne cientos de bibliotecas externas y a veces puede parecer desconcertante. Sin embargo, una regla simple para recordar:

  Los parámetros relacionados con las funciones de arrays están en el orden "needle, haystack" mientras que los parámetros de las funciones que manejan cadenas son exactamente al revés, "haystack, needle".

  A partir de PHP 8.0, los argumentos con nombre permiten pasar argumentos por nombre de parámetro, haciendo que el orden de los parámetros sea menos importante.

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

  PHP proporciona varias variables predefinidas, como la superglobal $_POST. Puede iterar sobre $_POST ya que es un array asociativo de todos los valores enviados por el método POST. Por ejemplo, podemos iterar sobre él simplemente con `foreach`, verificar los valores vacíos y mostrarlos.

      <?php
      $empty = $post = array();
      foreach ($_POST as $varname => $varvalue) {
          if (empty($varvalue)) {
              $empty[$varname] = $varvalue;
          } else {
              $post[$varname] = $varvalue;
          }
      }

      echo '<pre>';
      if (empty($empty)) {
          print "Ningún valor POST está vacío, valores posteados:\n";
          var_dump($post);
      } else {
          print "Tenemos " . count($empty) . " valores vacíos\n";
          print "Posteados :\n"; var_dump($post);
          print "Vacíos :\n";  var_dump($empty);
          exit;
      }
      echo '</pre>';
      ?>

Necesito convertir todas las comillas simples (') en una barra invertida seguida de una comilla simple (\'). ¿Cómo hacerlo con una expresión regular? También me gustaría convertir " en \" y \ en \\.

  Si asumimos que es para una base de datos, use el mecanismo de escape proporcionado con la base de datos. Por ejemplo, use la función mysql_real_escape_string() con MySQL y pg_escape_string() con PostgreSQL. También hay funciones genéricas como addslashes() y stripslashes(), que son más comunes con el antiguo código PHP.

  Escapar valores manualmente es propenso a errores y depende del contexto. Es preferible utilizar las API de bases de datos que soportan sentencias preparadas y vinculación de parámetros en lugar de construir consultas concatenando cadenas escapadas.

Cuando hago lo siguiente, la salida se muestra en el orden incorrecto:

    <?php
    function myfunc($argument)
    {
        echo $argument + 10;
    }
    $variable = 10;
    echo "myfunc($variable) = " . myfunc($variable);
    ?>

¿Qué está pasando?

  Para poder usar el resultado de su función en una expresión (como concatenarlo con una cadena como en este ejemplo), debe devolver el valor con return, y no imprimirlo con echo.

Hey, ¿dónde están mis nuevas líneas?

    <pre>
    <?php echo "Esta es mi primera línea."; ?>
    <?php echo "Esta debería mostrarse debajo de la primera."; ?>
    </pre>

  En PHP, el final de un bloque de código es "?>" o "?>\n" (donde \n significa una nueva línea). Entonces, en el ejemplo anterior, las frases se mostrarán en una sola línea, porque PHP omite las nuevas líneas después del final del bloque. Esto significa que debe insertar una nueva línea adicional después de cada bloque de código PHP para que se muestre.

  ¿Por qué PHP hace esto? Porque al formatear HTML, esto le facilita la vida, ya que no desea esa nueva línea, pero debe crear líneas muy largas o hacer que el código fuente de la página sea ilegible para lograr este efecto.

Obtengo 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 deben agregar encabezados al flujo de salida, pero estos solo pueden enviarse antes que el resto del contenido. No debe haber ninguna salida antes de usar estas funciones, como HTML, por ejemplo. La función headers_sent() verificará si su script ya ha enviado encabezados. Vea también las funciones de almacenamiento en búfer de salida.

Necesito acceder a la información en el encabezado de solicitud directamente. ¿Cómo puedo hacerlo?

  La función getallheaders() lo hará si está ejecutando PHP como un módulo de Apache. El siguiente código le mostrará todos los encabezados de solicitud:

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

  Vea también apache_lookup_uri(), apache_response_headers() y fsockopen().

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

  El modelo de seguridad de IIS es el culpable. Es un problema común para todos los programas CGI que se ejecutan con IIS. Una alternativa es crear un archivo HTML (no ejecutado por PHP) como página de entrada en el directorio donde se requiere la autenticación. Luego, use una etiqueta META para redirigir a la página PHP, o proporcione un enlace a ella. PHP reconocerá entonces la autenticación correctamente. Esto no debería afectar a otros servidores NT. Para más información, vea: » http://support.microsoft.com/kb/q160422/ y la sección del manual sobre la autenticación HTTP.

Windows: No puedo acceder a los archivos compartidos en otra computadora usando IIS.

  Debe modificar el servicio `Ir a Servicios de Internet Information`. Localice su archivo PHP y edite sus propiedades. Vaya a la pestaña `Seguridad del archivo`, `Editar -< Control de acceso anónimo y autenticación`.

  Puede resolver este problema desmarcando la casilla `Acceso anónimo` y dejando la casilla `Autenticación integrada de Windows` marcada, o marcando la casilla `Acceso anónimo` y editando el usuario que no debe tener los derechos de acceso.

¿Cómo mezclar XML y PHP? PHP se queja de mis etiquetas <?xml !

  Para incluir <?xml en su código PHP, deberá desactivar las etiquetas cortas configurando la directiva PHP short_open_tags a `0`. No puede cambiar esta directiva con ini_set(). Ya sea que short_open_tags esté activado o desactivado, siempre puede hacer esto: `<?php echo '<?xml'; ?>`. El valor predeterminado para esta directiva es `On`.

¿Dónde puedo encontrar una lista completa de las variables predefinidas que puedo usar en mis scripts PHP?

  Lea la página del manual que trata sobre las variables predefinidas ya que presenta una lista parcial de las variables predefinidas disponibles en su script. Una lista completa de las variables disponibles (y mucha información) puede verse llamando a la función phpinfo(). Lea la sección del manual que trata sobre las variables no provenientes de PHP, que describe escenarios comunes para las variables externas, como las provenientes de un formulario HTML, una cookie y la URL.

¿Cómo puedo generar archivos PDF sin usar las bibliotecas no libres PDFLib? Me gustaría una manera gratuita y que no requiera bibliotecas PDF externas.

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

Algunas directivas PHP pueden tomar nombres literales, y no solo valores int. ¿Cuáles son todas las abreviaturas disponibles?

  Las opciones disponibles son K (para kilobytes) y M (para megabyte) y G (para gigabyte), y no distinguen entre mayúsculas y minúsculas. Cualquier otra sintaxis se supone que representa bytes. `1M` equivale a un megabyte o `1048576` bytes. `1K` equivale a un kilobyte o `1024` bytes. Estas notaciones abreviadas pueden usarse en el archivo php.ini y en la función ini_set(). Tenga en cuenta que el valor numérico se convierte en int ; por ejemplo, `0.5M` se interpreta como `0`.

  > Nota: kilobyte versus kibibyte

  > La notación PHP describe un kilobyte como igual a 1024 bytes, mientras que el estándar IEC lo considera un kibibyte (kibibyte). En resumen: k y K = 1024 bytes.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open