mirror of
https://github.com/php/doc-es.git
synced 2026-03-26 00:12:06 +01:00
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@336397 c90b9560-bf6c-de11-be94-00142212c4b1
524 lines
18 KiB
XML
524 lines
18 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: fbc4ef92fa953823ed73021e462bd291499dc633 Maintainer: yago Status: ready -->
|
|
<!-- Reviewed: no : -->
|
|
|
|
<chapter xml:id="faq.using" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<title>Usando PHP</title>
|
|
<titleabbrev>Usando PHP</titleabbrev>
|
|
|
|
<para>
|
|
Esta sección reune varios errores comunes a los que se puede enfrentar
|
|
mientras se escriben scripts en PHP.
|
|
</para>
|
|
|
|
<qandaset>
|
|
|
|
<qandaentry xml:id="faq.using.parameterorder">
|
|
<question>
|
|
<para>
|
|
No puedo recordar el orden de los parámetros de las funciones de PHP, ¿son aleatorias?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
PHP es un pegamento que une cientos de librerías externas y esto a veces lo complica.
|
|
Por eso, una simple regla de oro es la siguiente:
|
|
</para>
|
|
<para>
|
|
Los parámetros de una <link linkend="book.array">función Array</link> están ordenados
|
|
como "<emphasis>aguja, pajar</emphasis>" mientras que las
|
|
<link linkend="book.strings">funciones de Cadena</link> son lo contrario,
|
|
"<emphasis>pajar, aguja</emphasis>".
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.anyform">
|
|
<question>
|
|
<para>
|
|
Me gustaría escribir un script genérico en PHP que pueda usar datos
|
|
en cualquier formato. ¿Cómo puedo saber que variables pasadas por
|
|
el método POST están disponibles?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
PHP ofrece muchas <link linkend="language.variables.predefined">
|
|
variables predefinidas</link>, como la variable superglobal <varname>
|
|
$_POST</varname>. Se puede recorrer la variable <varname>$_POST</varname> como un array
|
|
ya que es un array asociativo de todos los valores POSTeados. Por ejemplo,
|
|
vamos a recorrer simplemente con &foreach;, revisar los valores
|
|
<function>vacíos</function>, e mostrarlos todos.
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
$empty = $post = array();
|
|
foreach ($_POST as $varname => $varvalue) {
|
|
if (empty($varvalue)) {
|
|
$empty[$varname] = $varvalue;
|
|
} else {
|
|
$post[$varname] = $varvalue;
|
|
}
|
|
}
|
|
|
|
print "<pre>";
|
|
if (empty($empty)) {
|
|
print "Ninguno de los valores POSTeados esta vacío, se envió:\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;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</para>
|
|
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.addslashes">
|
|
<question>
|
|
<para>
|
|
Necesito convertir todas las comillas simples (') a barras
|
|
invertidas seguidas de comillas simples (\'). ¿Cómo puedo
|
|
hacer esto con expresiones regulares? También me gustaría
|
|
convertir " a \" y \ a \\.
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Asumiendo que esto es para una base de datos, se puede usar el
|
|
mecanismo que viene con ésta. Por ejemplo, usar
|
|
la función <function>mysql_real_escape_string</function> con MYSQL y
|
|
<function>pg_escape_string</function> con PostgreSQL. Hay también
|
|
funciones genéricas como <function>addslashes</function> y <function>stripslashes</function>,
|
|
que son más comunes en código PHP antiguo.
|
|
</para>
|
|
|
|
¬e.magicquotes.gpc;
|
|
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.stripslashes">
|
|
<question>
|
|
<para>
|
|
Todas mis " se convirtieron en \" y mis ' en \', ¿cómo puedo deshacerme
|
|
de todas esas barras no deseadas? ¿Cómo y porqué están ahí?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Lo más probable es que esas barras invertidas existan porque la directiva
|
|
de PHP <link linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link> está activada.
|
|
Esta es una característica antigua de PHP, y debería deshabilitarse y no
|
|
usarse más. Pero, la función <function>stripslashes</function> podría usarse
|
|
para eliminar las barras invertidas de un <type>string</type>.
|
|
</para>
|
|
|
|
¬e.magicquotes.gpc;
|
|
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.register-globals">
|
|
<question>
|
|
<para>
|
|
¿Cómo afecta la directiva register_globals de PHP?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
&warn.deprecated.feature-5-3-0.removed-5-4-0;
|
|
<para>
|
|
En primer lugar, una explicación de lo que hace la configuración ini.
|
|
Digamos que la siguiente URL esta siendo usada:
|
|
<literal>http://example.com/foo.php?animal=cat</literal>
|
|
y en el archivo <filename>foo.php</filename> tuviéramos el siguiente
|
|
código PHP:
|
|
</para>
|
|
<para>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
//Es preferible usar $_GET aqui
|
|
echo $_GET['animal'];
|
|
|
|
// para que la variable $animal exista, register_globlas debe estar en ON
|
|
// NO SE DEBE HACER ESTO
|
|
echo $animal;
|
|
|
|
// Esto aplica a todas las variables, inclusve a las variables $_SERVER
|
|
echo $_SERVER['PHP_SELF'];
|
|
|
|
// de nuevo, para que $PHP_SELF exista, register_globals debe estar en ON
|
|
// NO SE DEBE HACER ESTO
|
|
echo $PHP_SELF;
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</para>
|
|
<para>
|
|
El código anterior demuestra como register_globals crea varias variables.
|
|
Por años este tipo de código ha sido mal visto, y también ha sido
|
|
deshabilitado por defecto. Así que aunque la mayoría de
|
|
hosting deshabilitan register_globals, aun hay artículos
|
|
desactualizados, tutoriales y libros que lo requieren habilitado.
|
|
</para>
|
|
<para>
|
|
Ver también los siguientes recursos para información adicional:
|
|
<simplelist>
|
|
<member>La directiva <link linkend="ini.register-globals">register_globals</link></member>
|
|
<member>El <link linkend="security.globals">capítulo de seguridad acerca de register globals</link></member>
|
|
<member><link linkend="language.variables.external">Manejando variables externas</link></member>
|
|
<member>Usar <link linkend="language.variables.superglobals">superglobals</link> en su lugar</member>
|
|
</simplelist>
|
|
</para>
|
|
<note>
|
|
<para>
|
|
En el ejemplo anterior, usamos una <acronym>URL</acronym> que contiene un
|
|
QUERY_STRING. El paso de la información se hace a través de una solicitud
|
|
HTTP GET, y es esta la razón por la que se usa la variables superglobal
|
|
<varname>$_GET</varname>.
|
|
</para>
|
|
</note>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.wrong-order">
|
|
<question>
|
|
<para>
|
|
Cuando hago lo siguiente, la salida se muestra en
|
|
el orden equivocado:
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
function myfunc($argument)
|
|
{
|
|
echo $argument + 10;
|
|
}
|
|
$variable = 10;
|
|
echo "myfunc($variable) = " . myfunc($variable);
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
¿Qué está pasando?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Para habilitar que las funciones entreguen como resultado expresiones
|
|
(como concatenarse con otras cadenas como en el ejemplo anterior),
|
|
se necesita el valor <function>return</function>, no la función
|
|
<function>echo</function>.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.newlines">
|
|
<question>
|
|
<para>
|
|
¿Hey, qué le pasa a mis líneas nuevas?
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<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>
|
|
]]>
|
|
</programlisting>
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
"?>\n" (donde \n significa una nueva línea). Entonces, en el
|
|
En PHP, el fin para un bloque de código es o bien "?>" o
|
|
ejemplo anterior, las sentencias a las que se les dio el echo
|
|
estarán en una línea, porque PHP omite las líneas nuevas después
|
|
del final de un bloque. Esto significa que se necesita agregar
|
|
una línea extra después de cada bloque de código PHP para lograr
|
|
que se imprima una nueva línea.
|
|
</para>
|
|
<para>
|
|
¿Porqué PHP hace esto? por que cuando se formatea HTML normal, esto
|
|
normalmente hace la vida más fácil por que no se quiere esa nueva
|
|
línea, pero se tendrían que crear líneas extremadamente largas o en
|
|
otro caso hacer el código fuente de la pagina ilegible para que
|
|
tenga efecto.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.headers-sent">
|
|
<question>
|
|
<para>
|
|
Recibo 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 funciones de <link linkend="ref.session">sesión</link> necesitan
|
|
agregar encabezados (headers) a la salida pero los encabezados solo
|
|
pueden enviarse antes que cualquier otro contenido. No deben de haber
|
|
salidas antes de usar esas funciones, salidas como HTML. La función
|
|
<function>headers_sent</function> chequeará si tu script ya ha enviado
|
|
los headers y mirará también las <link linkend="ref.outcontrol">Funciones
|
|
de control de salidas</link>.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.header">
|
|
<question>
|
|
<para>
|
|
Necesito accesar a información en las solicitudes de encabezados
|
|
directamente. ¿Cómo puedo hacerlo?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
La función <function>getallheaders</function> hará esto si se ésta
|
|
ejecutando PHP como un módulo de Apache. Entonces, el siguiente
|
|
código mostrará todas las peticiones a los encabezados:
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
$headers = getallheaders();
|
|
foreach ($headers as $name => $content) {
|
|
echo "headers[$name] = $content<br />\n";
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</para>
|
|
<para>
|
|
Ver 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 autenticación con IIS obtengo 'No Input file specified'.
|
|
(no hay archivo de entrada especificado).
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
El modelo de seguridad de IIS falla aquí. Este es un problema común
|
|
de todos los programas CGI que se ejecutan bajo IIS. Una solución es
|
|
crear un archivo plano HTML (no interpretado por PHP) como la
|
|
página de entrada en el directorio autenticado. Entonces usa el tag
|
|
META para direccionar a la página en PHP, o ten un enlace a la
|
|
página en PHP. Entonces PHP reconocerá la autenticación correctamente.
|
|
Con el módulo ISAPI, esto no es un problema. Esto no debería afectar
|
|
otros servidores web NT. Para más información, ver:
|
|
<link xlink:href="&url.iis;">&url.iis;</link> y la sección del manual
|
|
<link linkend="features.http-auth">Autenticación HTTP</link>.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.iis.sharing">
|
|
<question>
|
|
<para>
|
|
Windows: No puedo accesar archivos compartidos en otra computadora
|
|
usando IIS
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Se tiene que cambiar el <literal>Go to Internet Information Services</literal>.
|
|
Se debe localizar el archivo PHP e ir a sus propiedades. Luego ir
|
|
al tab <literal>Seguridad de Archivos</literal> y, <literal>Editar -<
|
|
Acceso anónimo y control de autenticación</literal>.
|
|
</para>
|
|
<para>
|
|
Se puede corregir el problema ya sea deshabilitando <literal>Acceso
|
|
anónimo</literal> y dejando <literal>Autenticación Integrada de Windows</literal>
|
|
marcado, o, marcando <literal>Acceso anónimo</literal> y editando al
|
|
usuario ya que no tendría que tener acceso.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.mixml">
|
|
<question>
|
|
<para>
|
|
¿Cómo se supone que mezclaría XML y PHP? no le parecen
|
|
mis tags <?xml!
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Con el fin de integrar directamente <?xml en el código PHP, se tiene
|
|
que deshabilitar los tags cortos en la directiva de PHP <link linkend="ini.short-open-tag">short_open_tags</link>
|
|
poniéndolo a <literal>0</literal>. No se puede establecer esta
|
|
directiva con <function>ini_set</function>. Independientemente de que
|
|
<link linkend="ini.short-open-tag">short_open_tags</link> este On u Off,
|
|
se puede hacer algo como: <literal><?php echo '<?xml'; ?></literal>.
|
|
La directiva por defecto es <literal>On</literal>.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.variables">
|
|
<question>
|
|
<para>
|
|
¿Dónde puedo encontrar una lista completa de variables disponibles
|
|
en PHP?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Leer la página del manual <link linkend="language.variables.predefined">
|
|
variables predefinidas</link> el cual incluye una lista parcial de
|
|
variables predefinidas disponibles para tu script. Una lista completa
|
|
de variables disponibles (y mucha mas información) puede ser vista
|
|
llamando a la función <function>phpinfo</function>. Hay que asegurarse
|
|
de leer la sección del manual <link linkend="language.variables.external">variables desde
|
|
fuera de PHP</link> el cuál describe escenarios comunes para variables
|
|
externas, como por ejemplo desde un formulario HTML, una Cookie, y
|
|
una URL.
|
|
</para>
|
|
|
|
¬e.registerglobals;
|
|
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.freepdf">
|
|
<question>
|
|
<para>
|
|
¿Cómo puedo generar archivos PDF sin usar librerías no libres o
|
|
librerías comerciales como <link linkend="ref.pdf">PDFLib</link>?
|
|
Me gustaría algo que sea libre y no necesite librerías 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>
|
|
<para>
|
|
También esta la extensión <link linkend="book.haru">Haru</link>
|
|
que usa la librería externa libHaru.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.cgi-vars">
|
|
<question>
|
|
<para>
|
|
Estoy intentando accesar a una de las variables estándar
|
|
CGI (como <varname>$DOCUMENT_ROOT</varname> o
|
|
<varname>$HTTP_REFERER</varname>) en una función definida
|
|
por el usuario, y parece que no puede encontrarla. ¿Qué
|
|
está mal?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Es importante realizar que la directiva de PHP <link linkend="ini.register-globals">register_globals</link>
|
|
tenga efectos en el servidor y las variables del entorno.
|
|
Cuando register_globals = off (el valor por defecto desde PHP 4.2.0),
|
|
<varname>$DOCUMENT_ROOT</varname> no existe. En su lugar, se debe
|
|
usar <varname>$_SERVER['DOCUMENT_ROOT']</varname>.
|
|
Si register_globals = on entonces las variables <varname>$DOCUMENT_ROOT</varname> y
|
|
<varname>$GLOBALS['DOCUMENT_ROOT']</varname> también existirán.
|
|
</para>
|
|
<para>
|
|
Si se está seguro de que register_globals = on y se pregunta porque
|
|
<varname>$DOCUMENT_ROOT</varname> no esta disponible para las funciones,
|
|
es por que son como las otras variables y requerirán la variable
|
|
<literal>global $DOCUMENT_ROOT</literal> dentro de la función.
|
|
Ver también la página del manual en <link linkend="language.variables.scope">ámbito de las variables</link>.
|
|
Es preferible hacer el código con register_globals = off.
|
|
</para>
|
|
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.shorthandbytes">
|
|
<question>
|
|
<para>
|
|
Algunas directivas de PHP podrían recibir valores en bytes, en lugar de solo
|
|
valores <type>enteros</type>. Cuales son las opciones de bytes disponibles?
|
|
Y ¿puedo usarlas fuera de &php.ini;?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Las opciones disponibles son K (por Kilobytes), M (por Megabytes) y G (por
|
|
Gigabytes; disponibles desde PHP 5.1.0), ellos son sensibles a mayúsculas
|
|
y minúsculas.
|
|
Cualquier otra cosa, asume bytes.
|
|
<literal>1M</literal> es igual a un Megabyte o <literal>1048576</literal>
|
|
bytes. <literal>1K</literal> es igual a un Kilobyte o
|
|
<literal>1024</literal> bytes. No se debería usar esas abreviaciones
|
|
fuera de &php.ini;, en su lugar se usa un valor <type>entero</type> de bytes.
|
|
Ver la documentación de <function>ini_get</function> para ver un ejemplo de
|
|
como convertir esos valores.
|
|
</para>
|
|
<note>
|
|
<title>kilobyte versus kibibyte</title>
|
|
<para>
|
|
La notación de PHP describe que un kilobyte equivale a 1024 bytes, mientras que
|
|
el estándar <acronym>IEC</acronym> considera que debe ser un kibibyte.
|
|
Resumiendo: k y K = 1024 bytes.
|
|
</para>
|
|
</note>
|
|
</answer>
|
|
</qandaentry>
|
|
<qandaentry xml:id="faq.using.windowslocalhostissue">
|
|
<question>
|
|
<para>
|
|
En Windows: Tengo problemas intermitentes para conectar cuando utilizo <literal>localhost</literal>,
|
|
<literal>"127.0.0.1"</literal> funciona?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Antes de PHP 5.3.4, existía un bug en el código de resolución de red dentro de PHP que
|
|
causaba errores usando <literal>localhost</literal> en todas las situaciones relacionadas con streaming si IPv6
|
|
estaba habilitado. Para solucionar este problema se puede usar tanto <literal>"127.0.0.1"</literal>
|
|
como deshabilitar el resolver usando IPv6 en el fichero <filename>hosts</filename>.
|
|
</para>
|
|
</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
|
|
-->
|