1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-23 23:12:09 +01:00
Files
archived-doc-es/faq/using.xml

371 lines
13 KiB
XML
Executable File

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 1709768e97fce7848c62aa2bf988419527bd1e8e Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="faq.using" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Usar PHP</title>
<titleabbrev>Usar PHP</titleabbrev>
<para>
Esta sección reúne varios errores que puede encontrar
al escribir sus scripts PHP.
</para>
<qandaset>
<qandaentry xml:id="faq.using.parameterorder">
<question>
<para>
No recuerdo el orden de los parámetros en las funciones PHP,
¿son aleatorios?
</para>
</question>
<answer>
<para>
PHP reúne cientos de bibliotecas externas y a veces puede parecer
desconcertante. Sin embargo, una regla simple para recordar:
</para>
<para>
Los parámetros relacionados con las
<link linkend="book.array">funciones de arrays</link> están en el orden
"<emphasis>needle, haystack</emphasis>" mientras que los parámetros de las
<link linkend="book.strings">funciones que manejan cadenas</link>
son exactamente al revés,
"<emphasis>haystack, needle</emphasis>".
</para>
<para>
A partir de PHP 8.0, los <link linkend="functions.named-arguments">argumentos con nombre</link>
permiten pasar argumentos por nombre de parámetro, haciendo que el orden de los parámetros sea menos importante.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.anyform">
<question>
<para>
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?
</para>
</question>
<answer>
<para>
PHP proporciona varias <link linkend="language.variables.predefined">
variables predefinidas</link>, como la superglobal <varname>$_POST</varname>.
Puede iterar sobre <varname>$_POST</varname>
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.
<programlisting role="php">
<![CDATA[
<?php
$empty = $post = array();
foreach ($_POST as $nomvar => $valeurvar) {
if (empty($varvalue)) {
$empty[$nomvar] = $valeurvar;
} else {
$post[$nomvar] = $valeurvar;
}
}
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>';
?>
]]>
</programlisting>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.addslashes">
<question>
<para>
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 \\.
</para>
</question>
<answer>
<para>
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
<function>mysql_real_escape_string</function> con MySQL y
<function>pg_escape_string</function> con PostgreSQL.
También hay funciones genéricas como
<function>addslashes</function> y <function>stripslashes</function>,
que son más comunes con el antiguo código PHP.
</para>
<para>
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.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.wrong-order">
<question>
<para>
Cuando hago lo siguiente, la salida se muestra en el orden incorrecto:
<programlisting role="php">
<![CDATA[
<?php
function mafonction($argument)
{
echo $argument + 10;
}
$variable = 10;
echo "mafonction($variable) = " . mafonction($variable);
?>
]]>
</programlisting>
¿Qué está pasando?
</para>
</question>
<answer>
<para>
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 <function>return</function>,
y no imprimirlo con <function>echo</function>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.newlines">
<question>
<para>
Hey, ¿dónde están mis nuevas líneas?
<programlisting role="php">
<![CDATA[
<pre>
<?php echo "Esta es mi primera línea."; ?>
<?php echo "Esta debería mostrarse debajo de la primera."; ?>
</pre>
]]>
</programlisting>
</para>
</question>
<answer>
<para>
En PHP, el final de un bloque de código es "?&gt;" o
"?&gt;\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.
</para>
<para>
¿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.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.headers-sent">
<question>
<para>
Obtengo el mensaje 'Warning: Cannot send session cookie - headers already
sent...' o 'Cannot add header information - headers already sent...'.
</para>
</question>
<answer>
<para>
Las funciones <function>header</function>, <function>setcookie</function>,
y las <link linkend="ref.session">funciones de sesión</link>
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 <function>headers_sent</function> verificará si
su script ya ha enviado encabezados. Vea también
<link linkend="ref.outcontrol">las funciones de almacenamiento en búfer de salida</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.header">
<question>
<para>
Necesito acceder a la información en el encabezado de solicitud
directamente. ¿Cómo puedo hacerlo?
</para>
</question>
<answer>
<para>
La función <function>getallheaders</function> lo hará si está ejecutando
PHP como un módulo de Apache. El siguiente código le mostrará todos los encabezados de solicitud:
<programlisting role="php">
<![CDATA[
<?php
$headers = getallheaders();
foreach ($headers as $nom => $contenu) {
echo "headers[$nom] = $contenu<br />\n";
}
?>
]]>
</programlisting>
</para>
<para>
Vea también
<function>apache_lookup_uri</function>,
<function>apache_response_headers</function> y
<function>fsockopen</function>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.authentication">
<question>
<para>
Cuando intento usar la autenticación con IIS obtengo
<literal>'No Input file specified'</literal>.
</para>
</question>
<answer>
<para>
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:
<link xlink:href="&url.iis;">&url.iis;</link> y la sección del manual
sobre la <link linkend="features.http-auth">autenticación HTTP</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.iis.sharing">
<question>
<para>
Windows: No puedo acceder a los archivos compartidos en otra computadora
usando IIS.
</para>
</question>
<answer>
<para>
Debe modificar el servicio <literal>Ir a Servicios de Internet
Information</literal>. Localice su archivo PHP y edite sus propiedades.
Vaya a la pestaña <literal>Seguridad del archivo</literal>, <literal>Editar -&lt;
Control de acceso anónimo y autenticación</literal>.
</para>
<para>
Puede resolver este problema desmarcando la casilla <literal>Acceso anónimo</literal> y dejando la casilla <literal>Autenticación integrada de Windows</literal> marcada, o marcando la casilla <literal>Acceso anónimo</literal> y editando el usuario que no debe tener los derechos de acceso.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.mixml">
<question>
<para>
¿Cómo mezclar XML y PHP? PHP se queja de mis etiquetas &lt;?xml !
</para>
</question>
<answer>
<para>
Para incluir &lt;?xml en su código PHP, deberá desactivar las
etiquetas cortas configurando la directiva PHP
<link linkend="ini.short-open-tag">short_open_tags</link> a
<literal>0</literal>. No puede cambiar esta directiva con
<function>ini_set</function>. Ya sea que <link linkend="ini.short-open-tag">
short_open_tags</link> esté activado o desactivado, siempre puede hacer esto:
<literal>&lt;?php echo '&lt;?xml'; ?&gt;</literal>. El valor predeterminado para esta directiva es <literal>On</literal>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.variables">
<question>
<para>
¿Dónde puedo encontrar una lista completa de las variables predefinidas que puedo usar en mis scripts PHP?
</para>
</question>
<answer>
<para>
Lea la página del manual que trata sobre las <link linkend="language.variables.predefined">
variables predefinidas</link> 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 <function>phpinfo</function>.
Lea la sección del manual que trata sobre las
<link linkend="language.variables.external">variables no provenientes
de PHP</link>, que describe escenarios comunes para las variables
externas, como las provenientes de un formulario HTML, una cookie y la URL.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.freepdf">
<question>
<para>
¿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.
</para>
</question>
<answer>
<para>
Hay algunas alternativas escritas en PHP como
<link xlink:href="&url.pdf.fpdf;">FPDF</link> y
<link xlink:href="&url.pdf.tcpdf;">TCPDF</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.shorthandbytes">
<question>
<para>
Algunas directivas PHP pueden tomar nombres literales,
y no solo valores &integer;.
¿Cuáles son todas las abreviaturas disponibles?
</para>
</question>
<answer>
<para>
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.
<literal>1M</literal> equivale a un megabyte o <literal>1048576</literal>
bytes. <literal>1K</literal> equivale a un kilobyte o
<literal>1024</literal> bytes. Estas notaciones abreviadas pueden usarse en el archivo &php.ini; y en la función <function>ini_set</function>.
Tenga en cuenta que el valor numérico se convierte en &integer; ;
por ejemplo, <literal>0.5M</literal> se interpreta como <literal>0</literal>.
</para>
<note>
<title>kilobyte versus kibibyte</title>
<para>
La notación PHP describe un kilobyte como igual a 1024 bytes, mientras que
el estándar <acronym>IEC</acronym> lo considera un kibibyte (kibibyte).
En resumen: k y K = 1024 bytes.
</para>
</note>
</answer>
</qandaentry>
</qandaset>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->