<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.variables.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'language.variables.external.php',
    1 => 'Variables desde fuentes externas',
    2 => 'Variables desde fuentes externas',
  ),
  'up' => 
  array (
    0 => 'language.variables.php',
    1 => 'Variables',
  ),
  'prev' => 
  array (
    0 => 'language.variables.variable.php',
    1 => 'Variables variables',
  ),
  'next' => 
  array (
    0 => 'language.constants.php',
    1 => 'Constantes',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'language/variables.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.variables.external" class="sect1">
  <h2 class="title">Variables desde fuentes externas</h2>

  <div class="sect2" id="language.variables.external.form">
   <h3 class="title">Formularios HTML (GET y POST)</h3>

   <p class="simpara">
    Cuando se envía un formulario a un script de PHP, la información de dicho
    formulario pasa a estar automáticamente disponible en el script. Existen
    algunas formas de acceder a esta información, por ejemplo:
   </p>

   <p class="para">
    <div class="example" id="example-1">
     <p><strong>Ejemplo #1 Un formulario HTML sencillo</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">&lt;form action="foo.php" method="post"&gt;<br />    Nombre usuario: &lt;input type="text" name="username" /&gt;&lt;br /&gt;<br />    Email:  &lt;input type="text" name="email" /&gt;&lt;br /&gt;<br />    &lt;input type="submit" name="submit" value="¡Enviarme!" /&gt;<br />&lt;/form&gt;</span></code></div>
     </div>

    </div>
   </p>

   <p class="para">
    Solamente existen dos maneras de acceder a datos desde formularios HTML.
    Los métodos disponibles actualmente se enumeran a continuación:
   </p>

   <p class="para">
    <div class="example" id="example-2">
     <p><strong>Ejemplo #2 Acceso a datos de un formulario HTML sencillo con POST</strong></p>
     <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;?php
echo $_POST[&#039;username&#039;];
echo $_REQUEST[&#039;username&#039;];
?&gt;</pre>
</div>
     </div>

    </div>
   </p>

   <p class="para">
    Usar un formulario con GET es similar excepto en el uso de variables
    predefinidas, que en este caso serán del tipo GET. GET también se usa
    con <code class="literal">QUERY_STRING</code> (la información despues del símbolo &#039;?&#039; en una URL).
    Por ejemplo <code class="literal">http://www.example.com/test.php?id=3</code>
    contiene datos GET que son accesibles con
    <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET['id']</a></var>.
    Véase también <var class="varname"><a href="reserved.variables.request.php" class="classname">$_REQUEST</a></var>.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     Puntos y espacios en nombres de variables son convertidos a guiones bajos.
     Por ejemplo <code class="literal">&lt;input name=&quot;a.b&quot; /&gt;</code> se convierte en
     <code class="literal">$_REQUEST[&quot;a_b&quot;]</code>.
    </p>
   </p></blockquote>

   <p class="simpara">
    PHP también entiende arrays en el contexto de variables de
    formularios (vea la <a href="faq.html.php" class="link">faq relacionada</a>).
    Se puede, por ejemplo, agrupar juntas variables relacionadas o usar esta
    característica para obtener valores de una entrada &quot;select&quot; múltiple.
    Por ejemplo, vamos a mandar un formulario a sí mismo y a presentar los
    datos cuando se reciban:
   </p>
   <p class="para">
    <div class="example" id="example-3">
     <p><strong>Ejemplo #3 Variables de formulario más complejas</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">'&lt;pre&gt;'</span><span style="color: #007700">;<br />    echo </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">));<br />    echo </span><span style="color: #DD0000">'&lt;/pre&gt;'</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;<br /></span>&lt;form action="" method="post"&gt;<br />    Nombre:  &lt;input type="text" name="personal[nombre]" /&gt;&lt;br /&gt;<br />    Email:   &lt;input type="text" name="personal[email]" /&gt;&lt;br /&gt;<br />    Cerveza: &lt;br /&gt;<br />    &lt;select multiple name="cerveza[]"&gt;<br />        &lt;option value="warthog"&gt;Warthog&lt;/option&gt;<br />        &lt;option value="guinness"&gt;Guinness&lt;/option&gt;<br />        &lt;option value="stuttgarter"&gt;Stuttgarter Schwabenbräu&lt;/option&gt;<br />    &lt;/select&gt;&lt;br /&gt;<br />    &lt;input type="submit" value="¡enviarme!" /&gt;<br />&lt;/form&gt;</span></code></div>
     </div>

    </div>
   </p>

    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <span class="simpara">
      Si una variable externa comienza con una sintaxis de array válida,
      Los caracteres finales se ignoran en silencio. Por ejemplo,
      <code class="literal">&lt;input name=&quot;foo[bar]baz&quot;&gt;</code>
      se convierte en <code class="literal">$_REQUEST[&#039;foo&#039;][&#039;bar&#039;]</code>.
     </span>
    </p></blockquote>

    <div class="sect3" id="language.variables.external.form.submit">
     <h4 class="title">Nombres de variables tipo IMAGE SUBMIT</h4>

     <p class="simpara">
      Cuando se envía un formulario, es posible usar una imagen en vez
      del botón estándar &quot;submit&quot;:
     </p>

     <div class="informalexample">
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;input type=&quot;image&quot; src=&quot;image.gif&quot; name=&quot;sub&quot; /&gt;</pre>
</div>
      </div>

     </div>

     <p class="simpara">
      Cuando el usuario hace click en cualquier parte de la imagen, el
      formulario que la acompaña se transmitirá al servidor con dos variables
      adicionales, <var class="varname">sub_x</var> y <var class="varname">sub_y</var>. Éstas contienen las coordenadas del  clic
      del usuario dentro de la imagen.  Los más experimentados puede notar
      que los nombres de variable enviados por el navegador contienen un
      guión en vez de un subrayado (guión bajo), pero PHP convierte el guión
      en subrayado automáticamente.
     </p>
    </div>

   </div>

   <div class="sect2" id="language.variables.external.cookies">
    <h3 class="title">Cookies HTTP</h3>

    <p class="simpara">
     PHP soporta cookies de HTTP de forma transparente tal y como están
     definidas en <a href="https://datatracker.ietf.org/doc/html/rfc6265" class="link external">&raquo;&nbsp;RFC 6265</a>. Las cookies son un
     mecanismo para almacenar datos en el navegador y así
     rastrear o identificar a usuarios que vuelven. Se pueden
     crear cookies usando la función <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span>. Las
     cookies son parte de la cabecera HTTP, así que se debe llamar a la
     función SetCookie antes de que se envíe cualquier salida al navegador.
     Es la misma restricción que para la función <span class="function"><a href="function.header.php" class="function">header()</a></span>.
     Los datos de una cookie están disponibles en el array de datos de la
     cookies apropiada, tal como <var class="varname"><a href="reserved.variables.cookies.php" class="classname">$_COOKIE</a></var> y <var class="varname"><a href="reserved.variables.request.php" class="classname">$_REQUEST</a></var>.
     Véase la página de <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span> del manual para más
     detalles y ejemplos.
    </p>

    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <span class="simpara">
      A partir de PHP 7.2.34, 7.3.23 y 7.4.11, respectivamente, los
      <em>nombres</em> de las cookies entrantes ya no son con url-decoded
      por razones de seguridad.
     </span>
    </p></blockquote>

   <p class="simpara">
    Si se quieren asignar múltiples valores a una sola cookie, basta con
    asignarlo como un array. Por ejemplo:
   </p>

    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />  setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"MiCookie[foo]"</span><span style="color: #007700">, </span><span style="color: #DD0000">'Prueba 1'</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br />  </span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"MiCookie[bar]"</span><span style="color: #007700">, </span><span style="color: #DD0000">'Prueba 2'</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

    <p class="simpara">
     Esto creará dos cookies separadas aunque <var class="varname">MiCookie</var> será un array simple
     en el script. Si se quiere definir una sola cookie con valores
     múltiples, considere el uso de la función <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span>
     o <span class="function"><a href="function.explode.php" class="function">explode()</a></span> primero en el valor.
    </p>

    <p class="simpara">
     Nótese que una cookie reemplazará a una cookie anterior que tuviese el
     mismo nombre en el navegador a menos que la ruta o el dominio
     fuesen diferentes. Así, para una aplicación de carrito de compras se
     podría querer mantener un contador e ir pasándolo. Es decir:
    </p>

    <div class="example" id="example-4">
     <p><strong>Ejemplo #4 Un ejemplo de <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span></strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">if (isset(</span><span style="color: #0000BB">$_COOKIE</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">])) {<br />    </span><span style="color: #0000BB">$count </span><span style="color: #007700">= </span><span style="color: #0000BB">$_COOKIE</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">] + </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />} else {<br />    </span><span style="color: #0000BB">$count </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">'conteo'</span><span style="color: #007700">, </span><span style="color: #0000BB">$count</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"Carrito[</span><span style="color: #0000BB">$count</span><span style="color: #DD0000">]"</span><span style="color: #007700">, </span><span style="color: #0000BB">$item</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

   </div>

   <div class="sect2" id="language.variables.external.dot-in-names">
    <h3 class="title">Puntos en los nombres de variables de entrada</h3>

    <p class="para">
     Típicamente, PHP no altera los nombres de las variables cuando se pasan
     a un script. Sin embargo, hay que notar que el punto no es un
     carácter válido en el nombre de una variable PHP. Para conocer la razón,
     considere el siguiente ejemplo:
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$varname</span><span style="color: #007700">.</span><span style="color: #0000BB">ext</span><span style="color: #007700">;  </span><span style="color: #FF8000">/* nombre de variable inválido */<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     Lo que el intérprete vé es el nombre de una variable <var class="varname">$varname</var>, seguido
     por el operador de concatenación, y seguido por la cadena pura (es
     decir, una cadena sin entrecomillar que no coincide con ninguna palabra
     clave o reservada conocida) &#039;ext&#039;. Obviamente, no se pretendía que fuese
     éste el resultado.
    </p>

    <p class="para">
     Por esta razón, es importante hacer notar que PHP reemplazará
     automáticamente cualquier punto en los nombres de variables de entrada
     por guiones bajos (subrayados).
    </p>

   </div>

   <div class="sect2" id="language.variables.determining-type-of">
    <h3 class="title">Determinación de los tipos de variables</h3>

    <p class="para">
     Dado que PHP determina los tipos de las variables y los convierte
     (generalmente) según lo que necesita, no siempre resulta obvio de qué tipo
     es una variable dada en un momento concreto. PHP incluye varias
     funciones que descubren de qué tipo es una variable:
     <span class="function"><a href="function.gettype.php" class="function">gettype()</a></span>, <span class="function"><a href="function.is-array.php" class="function">is_array()</a></span>,
     <span class="function"><a href="function.is-float.php" class="function">is_float()</a></span>, <span class="function"><a href="function.is-int.php" class="function">is_int()</a></span>,
     <span class="function"><a href="function.is-object.php" class="function">is_object()</a></span>, y <span class="function"><a href="function.is-string.php" class="function">is_string()</a></span>.  Vea
     también el capítulo sobre <a href="language.types.php" class="link">Tipos</a>.
    </p>
    <p class="para">
     Dado que HTTP es un protocolo de texto, la mayoría, si no todo, el contenido que llega en
     <a href="language.variables.superglobals.php" class="link">arrays superglobales</a>,
     como <var class="varname"><a href="reserved.variables.post.php" class="classname">$_POST</a></var> y <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET</a></var>, permanecerá
     como cadenas de texto. PHP no intentará convertir los valores a un tipo específico.
     En el ejemplo siguiente, <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET["var1"]</a></var> contendrá la
     cadena &quot;null&quot; y <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET["var2"]</a></var>, la cadena &quot;123&quot;.
     <div class="example-contents">
<div class="cdata"><pre>
/index.php?var1=null&amp;var2=123
</pre></div>
      </div>

    </p>
   </div>

   <div class="sect2" id="language.variables.external.changelog">
    <h3 class="title">Historial de cambios</h3>

    <p class="para">
     <table class="doctable informaltable">
      
       <thead>
        <tr>
         <th>Versión</th>
         <th>Descripción</th>
        </tr>

       </thead>

       <tbody class="tbody">
        <tr>
         <td>7.2.34, 7.3.23, 7.4.11</td>
         <td>
          Los <em>nombres</em> de las cookies entrantes ya no son con url-decoded
          por razones de seguridad.
         </td>
        </tr>

       </tbody>
      
     </table>

    </p>
   </div>

  </div><?php manual_footer($setup); ?>