1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-26 00:12:06 +01:00
Files
archived-doc-es/faq/using.xml
Pedro Antonio Gil Rodríguez a611f96693 Actualización a la última versión
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@336397 c90b9560-bf6c-de11-be94-00142212c4b1
2015-04-06 15:12:59 +00:00

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>
&note.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>
&note.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>
"?&gt;\n" (donde \n significa una nueva línea). Entonces, en el
En PHP, el fin para un bloque de código es o bien "?&gt;" 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 -&lt;
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 &lt;?xml!
</para>
</question>
<answer>
<para>
Con el fin de integrar directamente &lt;?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>&lt;?php echo '&lt;?xml'; ?&gt;</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>
&note.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
-->