ScotlandPHP

PHP y HTML

PHP y HTML interactúan mucho: PHP puede generar HTML, y HTML puede pasar información a PHP. Antes de leer esta sección, es importante que aprenda cómo obtener variables desde fuentes externas. La página del manual sobre este tema incluye muchos ejemplos también.

¿Qué codificación/decodificación es necesaria al pasar un valor a través de un formulario/URL?

Existen varios escenarios en los que la codificación es importante. Asumiendo que se tiene un valor $datos de tipo string, el cual contiene la cadena que desea pasar sin codificar, existen los escenarios relevantes:

  • Interpretación de HTML. Para especificar una cadena aleatoria, es necesario incluirla entre comillas dobles, y aplicar htmlspecialchars() sobre el valor completo.

  • URL: Un URL consta de varias partes. Si los datos han de ser interpretados como un elemento, es necesario codificarlo con urlencode().

Ejemplo #1 Un elemento oculto de un formulario HTML

<?php
    
echo '<input type="hidden" value="' htmlspecialchars($datos) . '" />'."\n";
?>

Nota: No es correcto aplicar urlencode() sobre $datos, ya que es responsabilidad de los navegadores codificar los datos. Todos los navegadores populares lo realizan correctamente. Observe que esto ocurrirá independientemente del método (es decir, GET o POST). Aunque solo se observará esto en el caso de una petición GET, ya que las peticiones POST normalmente están ocultas.

Ejemplo #2 Datos a editar por el usuario

<?php
    
echo "<textarea name='misdatos'>\n";
    echo 
htmlspecialchars($datos)."\n";
    echo 
"</textarea>";
?>

Nota: Los datos son mostrados en el navegador como se esperaba, ya que el navegador interpretará los símbolos HTML escapados. Durante el envío, ya sea mediante GET o POST, los datos serán codificados por el navegador para su transferencia, y serán decodificados directamente por PHP. Por lo tanto, no será necesario realizar ninguna codificación/decodificación, todo es manejado automáticamente.

Ejemplo #3 En un URL

<?php
    
echo '<a href="' htmlspecialchars("/siguientepagina.php?etapa=23&datos=" .
        
urlencode($datos)) . '">'."\n";
?>

Nota: De hecho, se está imitando una petición GET de HTML, por lo que no es necesario aplicar urlencode() manualmente a los datos.

Nota: Es necesario usar htmlspecialchars() sobre el URL completo, ya que el URL se da como un valor de un atributo HTML. En este caso, el navegador primero reemplazará los caracteres HTML especiales por los caracteres correctos del valor, y luego pasará el URL. PHP entenderá el URL correctamente, ya que ya se utilizó urlencode() sobre los datos. Se observará que el caracter & en el URL es reemplazado por &amp;. Aunque la mayoría de navegadores entenderán el carácter si se olvida esto, no siempre es posible que ocurra. Así que, incluso si un URL no es dinámico, es necesario usar htmlspecialchars() sobre el URL.

Estoy intentando usar una etiqueta <input type="image">, pero las variables $foo.x y $foo.y no están disponibles. $_GET['foo.x'] tampoco existe. ¿Dónde están?

Cuando se envía un formulario, es posible usar una imagen en lugar del botón de envío estándar con una etiqueta como esta:

<input type="image" src="imagen.gif" name="foo" />
Cuando un usuario pulsa sobre la imagen, el formulario al que pertenece será transmitido al servidor con dos variables adicionales: foo.x y foo.y.

Dado que foo.x y foo.y habrían representado nombres de variable inválidos en PHP, éstas son convertidas automáticamente a foo_x y foo_y. Es decir, los puntos son reemplazados con caracteres de subrayado. Por lo tanto, es posible acceder a estas variables como cualquier otra descrita en la sección sobre la recuperación de variables desde fuentes externas. Por ejemplo, $_GET['foo_x'].

Nota:

Los espacios en nombres de variables de petición son convertidos a caracteres de subrayado.

¿Cómo creo arrays en un <form> de HTML?

Para hacer que el resultado de <form> sea enviado como un array a un script de PHP, se deben nombrar los elementos <input>, <select> o <textarea> de esta forma:

<input name="MiArray[]" />
<input name="MiArray[]" />
<input name="MiArray[]" />
<input name="MiArray[]" />
Observe los corchetes después del nombre de la variable; ellos son los que la convierten en un array. Es posible agrupar los elementos en diferentes arrays asignando el mismo nombre a elementos diferentes:
<input name="MiArray[]" />
<input name="MiArray[]" />
<input name="MiOtroArray[]" />
<input name="MiOtroArray[]" />
Esto produce dos array, MiArray y MiOtroArray, que son enviados al script PHP. También es posible asignar claves específicas a los arrays:
<input name="OtroArray[]" />
<input name="OtroArray[]" />
<input name="OtroArray[email]" />
<input name="OtroArray[telefono]" />
El array OtroArray ahora tendrá las claves 0, 1, email y telefono.

Nota:

La especificación de claves de arrays es opcional en HTML. Si no se especifican las claves, el array será rellenado en el orden en que aparecen los elementos en el formulario. Nuestro primer ejemplo contendrá las claves 0, 1, 2 y 3.

Véase también Funciones de arrays y Variables desde fuentes externas.

¿Cómo obtengo todos los resultados de una etiqueta de selección múltiple en HTML?

La etiqueta de selección múltiple en una construcción HTML permite a los usuarios elegir varios elementos de una lista. Estos elementos son pasados entonces al gestor de la acción del formulario. El problema es que todos son pasados con el mismo nombre de control. Es decir,

<select name="var" multiple="yes">
Cada opción elegida llegará al gestor de la acción como:
      var=opcion1
      var=opcion2
      var=opcion3
     
Cada opción sobrescribirá el contenido de la variable $var anterior. La solución es usar la característica "array desde un elemento de formulario" de PHP. Debería usarse la siguiente forma:
<select name="var[]" multiple="yes">
Esto le indica a PHP que debe tratar $var como un array y que cada asignación de un valor a var[] añade un elemento al array. El primer elemento se convierte en $var[0], el siguiente en $var[1], etc. La función count() puede usarse para determinar cuántas opciones fueron seleccionadas, y la función sort() puede usarse para ordenar el array de opciones si fuera necesario.

Observe que si se está usando JavaScript, los caracteres [] en el nombre del elemento podrían causar problemas al intentar referirse al elemento por su nombre. Use el ID numérico del elemento del formulario en su lugar, o encierre el nombre de la variable entre comillas simples y úselo como índice del array de elementos, por ejemplo:

      variable = document.forms[0].elements['var[]'];
     

¿Cómo puedo pasar una variable de Javascript a PHP?

Ya que Javascript es una tecnología (usualmente) del lado del cliente, y PHP es (usualmente) una tecnología del lado del servidor, y dado que HTTP es un protocolo "sin estados", los dos lenguajes no pueden compartir variables directamente.

Sin embargo, es posible pasar variables entre los dos. Una forma de hacerlo es generar código Javascript con PHP, y hacer que el navegador se refresque a sí mismo, volviendo a pasar variables específicas al script de PHP. El ejemplo de abajo muestra precisamente cómo hacer esto; permite que el código de PHP capture el alto y el ancho de la pantalla, algo que normalmente sólo es posible en el lado del cliente.

Ejemplo #4 Generación de Javascript con PHP

<?php
if (isset($_GET['ancho']) AND isset($_GET['alto'])) {
  
// imprimir las variables de geometría
  
echo "El ancho de la pantalla es: "$_GET['ancho'] ."<br />\n";
  echo 
"El alto de la pantalla es: "$_GET['alto'] ."<br />\n";
} else {
  
// pasar las variables de geometría
  // (preservar la cadena de consulta original
  //   -- las variables post deberán ser manejadas de otra forma)

  
echo "<script language='javascript'>\n";
  echo 
"  location.href=\"${_SERVER['SCRIPT_NAME']}?${_SERVER['QUERY_STRING']}"
            
"&ancho=\" + screen.width + \"&alto=\" + screen.height;\n";
  echo 
"</script>\n";
  exit();
}
?>

add a note add a note

User Contributed Notes 5 notes

up
-2
martellare at hotmail dot com
14 years ago
I do not think you are right about not being able to specify something for the value attribute, but I can see where you would have thought it would fail:

A fair warning about testing to see if a variable exists...
when it comes to strings, the values '' and '0' are interpreted as false when tested this way...

<?php
if ($string) { ... }  //false for $string == '' || $string == '0'
?>

The best practice for testing to see if you received a variable from the form (which in the case of a checkbox, only happens when it is checked) is to test using this...

<?php
if ( isSet($string) ) { ... } //true if and only if the variable is set
?>

The function tests to see if the variable has been set, regardless of its contents.

By the way, if anyone's curious, when you do make a checkbox without specifying the value attribute, the value sent from the form for that checkbox becomes 'on'.  (That's for HTML in general, not PHP-specific).
up
-4
jetboy
11 years ago
While previous notes stating that square brackets in the name attribute are valid in HTML 4 are correct, according to this:

http://www.w3.org/TR/xhtml1/#C_8

the type of the name attribute has been changed in XHTML 1.0, meaning that square brackets in XHTML's name attribute are not valid.

Regardless, at the time of writing, the W3C's validator doesn't pick this up on a XHTML document.
up
-8
martellare at hotmail dot com
14 years ago
A JavaScript Note: Using element indexes to reference form elements can cause problems when you want to add new elements to your form; it can shift the indexes of the elements that are already there.

For example, You've got an array of checkboxes that exist at the beginning of a form:
===================

<FORM>
    <INPUT type="checkbox" name="fruits[]" value="apple">apple
    <INPUT type="checkbox" name="fruits[]" value="orange">orange
    <INPUT type="checkbox" name="fruits[]" value="banana">banana
</FORM>

===================
... These elements could be referenced in JavaScript like so:
===================

<SCRIPT language="JavaScript" type="text/javascript">
<!--
    var index = 0; //could be 1 or 2 as well
    alert(document.forms[0].elements[index]);
//-->
</SCRIPT>

===================
However, if you added a new textbox before these elements, the checkboxes indexes become 1 - 3 instead of 0 - 2;  That can mess up what ever code you create depending on those indexes.

Instead, try referencing your html arrays in JavaScript this way.  I know it works in Netscape 4 & IE 6, I hope it to some extent is universal...
===================

<SCRIPT language="JavaScript" type="text/javascript">
<!--
    var message = "";
    for (var i = 0; i < document.forms[0].elements['fruits[]'].length; i++)
    {
        message += "events[" + i + "]: " + document.forms[0].elements['fruits[]'][i].value + "\n";
    }
    alert(message);
//-->
</SCRIPT>

===================
up
-14
davis at risingtiger dot net
13 years ago
I thought this might be useful to fellow PHP heads like myself out there.

I recently came across a need to transfer full fledged mutli-dimensional arrays from PHP to JAVASCRIPT.

So here it is and hopefuly good things come from it.

<?php
function phparray_jscript($array, $jsarray)
{
    function
loop_through($array,$dimen,$localarray)
    {
        foreach(
$array as $key => $value)
        {
            if(
is_array($value))
            {
                echo (
$localarray.$dimen."[\"$key\"] = new Array();\n");
               
loop_through($value,($dimen."[\"".$key."\"]"),$localarray);
            }
            else
            {
                echo (
$localarray.$dimen."[\"$key\"] = \"$value\";\n");
            }
        }
    }

    echo
"<script language=\"Javascript1.1\">\n";
    echo
"var $jsarray = new Array();\n";
   
loop_through($array,"",$jsarray);
    echo
"</script>";
}
?>
up
-14
Jay
3 years ago
If you have a really large form, be sure to check your max_input_vars setting.  Your array[] will get truncated if it exceeds this.  http://www.php.net/manual/en/info.configuration.php#ini.max-input-vars
To Top