Está en la página 1de 20

INTRODUCCIÓN

PHP es un lenguaje de script, multiplataforma, publicado bajo una licencia libre, que se suele utilizar del lado del servidor para crear páginas web dinámicas. A día de hoy es el tercer lenguaje más popular del mercado según el índice TIOBE, sólo por detrás de Java y C.

Creado por Rasmus Lerdorf en 1995, su nombre es (actualmente) un acrónimo recursivo de “PHP: Hypertext Preprocessor” (Preprocesador de Hipertexto PHP).

La última versión estable a la hora de escribir estas líneas, la cuál se puede descargar desde su página web, es la 5.3.1, de Noviembre de 2009.

Ya explicamos hace tiempo cómo instalar Apache, y cómo instalar PHP y MySQL en Windows. También es posible descargar aplicaciones que instalen las 3 herramientas rápida y fácilmente (no recomendado para entornos de producción), comoWampServer o XAMPP.

PRIMER PROGRAMA EN PHP
Creemos una primera pequeña página web dinámica, que mostrará la fecha y hora actual.
view plaincopy to clipboardprint?

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

<html> <head><title>Fecha y hora</title></head> <body> <?php // Esto imprime la fecha echo "Hoy es ", date("d/n/Y"); echo "<br/>"; // Y esto la hora echo "Son las ", date("h:m:s"); ?> </body>

Además de usando la sintaxis anterior, <?php .... ?>, que es lo más común y recomendable, también se puede insertar código PHP en documentos HTML usando:

  

<script language="php"> .... </script> <? .... ?> si está activada la opción short_open_tag en php.ini <% .... %> si está activada la opción asp_tags en php.ini

Esto no es Python: cada instrucción termina con „;‟ (no es necesario si es la última instrucción).

Para los comentarios se puede utilizar:
view plaincopy to clipboardprint?

1. /* varias 2. lineas */ 3. 4. // una linea 5. 6. # una linea Aunque no es una característica integrada en el lenguaje, para comentarios de documentación se suele utilizar PHPDoc, el equivalente al JavaDoc de Java en PHP.
view plaincopy to clipboardprint?

1. /** 2. * Ejemplo de documentación de una función 3. * @param int $foo un entero cualquiera 4. */ Para imprimir datos por pantalla se puede usar, entre otros, echo, print, printf oprint_r.

A echo se le pasa una cadena que imprimirá. No es necesario utilizar paréntesis porque no es una función. También se le puede pasar varias cadenas, separadas por comas, y este las imprimirá todas unas detrás de otra, sin dejar espacios entre ellas:
view plaincopy to clipboardprint?

1. echo "Hola ", "mundo ", "en PHP";

print funciona de forma similar a echo, pero no puede tomar varios argumentos, y devuelve
un valor de retorno. Debido a esto es algo más lento que echo.
view plaincopy to clipboardprint?

1. print "Hola mundo"; A diferencia de echo y print, printf sí que es una función. Se comporta de manera similar a la función del mismo nombre de C, es decir, se pueden utilizar especificadores de formato. En el siguiente ejemplo $nombre y $edad serían variables con el nombre y la edad de una persona, y

PHP tiene tipado dinámico: al crear una variable no se especifica el tipo. si le pasáramos una matriz. echo gettype($texto). se puede utilizar var_dump($var) . números en coma flotante (float) y cadenas (string). view plaincopy to clipboardprint? 1. view plaincopy to clipboardprint? 1. En PHP tenemos como tipos simples los booleanos (boolean). Para obtener el tipo y otra información sobre la variable.su valor se embebería en la cadena en las posiciones indicadas por %s (especificador de cadena) y %d (especificador de entero). print_r($matriz). Además tenemos un par de tipos especiales: resource. y NULL. $nombre. Por ejemplo. $edad). Su función es la de imprimir variables de forma legible para las personas. printf("%s tiene %d años". 2. el tipo nulo. $texto = "Hola mundo". Para obtener el tipo de una variable se puede utilizar gettype($var) view plaincopy to clipboardprint? 1. sino que el intérprete de PHP lo determina en tiempo de ejecución según el contexto. $texto = "Hola mundo". VARIABLES El nombre de las variables debe comenzar siempre con „$‟. enteros que se usan para referenciar recursos. print_r es una función que podemos utilizar para la depuración. como los valores para un array o las propiedades de un objeto. Como tipos compuestos tenemos matrices (array) y objetos (object). imprimiría sus claves y valores view plaincopy to clipboardprint? 1. números enteros (integer).

echo "Hola ". $variable = 22. como is_bool($var). PI. $variable = "Hola mundo". is_object($var). Como hay un carácter que identifica las variables.14159). 3. is_float($var)… Para comprobar si una variable tiene un valor asociado se puede utilizar la funciónisset($var). 2. y su tipo puede cambiar según el uso que queramos hacer de ellas. view plaincopy to clipboardprint? 1. echo gettype($variable). view plaincopy to clipboardprint? 1. podemos introducirlas directamente en una cadena. El tipo de una variable puede cambiar según el valor que almacenemos en ella. echo var_dump($texto). define("PI". view plaincopy to clipboardprint? 1. 2. no se utiliza el caracter $ al principio.view plaincopy to clipboardprint? 1. echo gettype($variable). Además las variables tienen tipado débil. $texto = "Hola mundo". is_string($var). $usuario". 2. 2. Al no ser variables propiamente dichas. $usuario = "Juan". . 2. 4. Para comprobar si una variable es de un cierto tipo se pueden utilizar las funciones is_tipo. $variable = "22". Para crear constantes se usa la función define. 3. y PHP la sustituirá por su valor. echo $variable / 2. No tenemos por qué hacer algo como view plaincopy to clipboardprint? 1. echo "Pi es ". "<br/>".

echo "Le gustan los {$producto}s". por ejemplo. no sólo en valor. sino también en tipo true si ambos operandos son distintos.sino que podríamos hacer simplemente view plaincopy to clipboardprint? 1. echo "Hola $usuario". view plaincopy to clipboardprint? 1. división (/) y módulo (%).contar()} platos". También se puede utilizar la misma sintaxis para hacer cosas más complejas. En el siguiente código. 2. $producto = "Donut". echo "Ha comprado {$objeto. Si necesitamos indicar el final del nombre de la variable explícitamente se pueden utilizar llaves. como llamar a funciones dentro de la cadena: view plaincopy to clipboardprint? 1. en valor o tipo true si el primer operando es menor que el segundo true si el primer operando es mayor que el segundo true si el primer operando es menor o igual que el segundo true si el primer operando es mayor o igual que el segundo Operadores lógicos . multiplicación (*). $usuario = "Juan". Operadores Los operadores aritméticos son la suma (+). si no utilizáramos llaves el intérprete buscaría una variable de nombre $productos. 2. resta (-). Operadores de comparación Operador == != === !== < > <= >= Descripción true si ambos operandos son iguales true si ambos operandos son distintos true si ambos operandos son iguales.

para crear un diccionario o array asociativo. 1 => "Italia"). "Italia"). o bien 0 si no se ha especificado ningún índice aún: view plaincopy to clipboardprint? 1. un array vacío y NULL. view plaincopy to clipboardprint? 1. También se puede crear una matriz usando los corchetes. una cadena vacía. $codigos = array("España". como una matriz normal. $codigos = array(0 => "España". "IT" => "Italia"). Como clave se pueden usar números. $matriz[0] = "Hola ". view plaincopy to clipboardprint? 1. o cadenas. Arrays Para crear un array se utiliza la función del mismo nombre. Son equivalentes a false el 0. $dias = array(1 => "Lunes". "Miércoles"). $matriz[1] = "mundo". . elemento por elemento: view plaincopy to clipboardprint? 1. 2. "Martes". Si no se especifica una clave se usa el último índice + 1.Operador and / && or / || xor ! Descripción true si se cumplen ambas condiciones true si se cumple una de las condiciones true si se cumple sólo una de las condiciones true si no se cumple la condición Booleanos Las variables de tipo booleano pueden tener como valor true o false. 2. $codigos = array("ES" => "España".

ordena manteniendo la asociación de índices arsort($array). o 0 si no se ha especificado ningún índice todavía: view plaincopy to clipboardprint? 1. $matriz[] = "mundo". se usa el último índice + 1. así que podríamos eliminar la propia matriz haciendo view plaincopy to clipboardprint? 1. $matriz[] = "Hola ". ordena en orden inverso. Para modificar un valor. $matriz[0] = "Hello ". Para ordenar los elementos de la matriz se puede usar       sort($array) rsort($array). unset($matriz[0]). unset es una función que sirve para eliminar una variable dada. Para contar el número de elementos en el array se puede usar la funcióncount($var). 2. también se usan los corchetes: view plaincopy to clipboardprint? 1. para arrays multidimensionales asort($array). manteniendo la asociación de índices ksort($array).Si no se especifica la clave ocurre lo mismo que con la función array. ordena por clave . ordena en orden inverso array_multisort($array). Para eliminar un par clave-valor se puede usar la función unset($var) view plaincopy to clipboardprint? 1. que también se puede usar con los objetos para contar el número de propiedades que tiene. unset($matriz).

echo $mensaje. echo $mensaje. Mantiene la asociación de índices  uasort($array. ordena usando una función definida por el usuario usando las claves  usort($array. así que es mucho más rápido usar esta función que un bucle que compruebe uno por uno. ordena usando una función definida por el usuario Para comprobar si un determinado elemento está dentro de un array se usain_array. ordena usando un algoritmo de “orden natural”. $funcion). Con dobles comillas. view plaincopy to clipboardprint? 1. . 3. $usuario = "Juan".  krsort($array). comillas simples. PHP indexa todos los valores de los arrays. como \n o \t. $funcion). $usuario = "Juan". es decir. $usuarios). 2. y se sustituyen las variables por sus valores: view plaincopy to clipboardprint? 1. in_array("pepe". en cuyo caso se pueden utilizar caracteres especiales. en las que se NO se pueden utilizar caracteres especiales. 3. ni se sustituyen las variables por sus valores. Cadenas Las cadenas se pueden delimitar de 4 formas. Debido a esto dan un rendimiento marginalmente mejor que las dobles comillas: view plaincopy to clipboardprint? 1. $funcion). 2. ordena por clave en orden inverso natsort($array). ordena usando una función definida por el usuario. como ordenaría una persona. mateniendo la asociación de índices  uksort($array. $mensaje = "<pre>Hola\n$usuario</pre>". $mensaje = '<pre>Hola\n$usuario</pre>'.

$cadena[9] = "a". $cadena = "Hola mundo". sintaxis nowdoc. $mensaje = <<< 'IDENTIFICADOR' Ejemplo de cadena que ocupa varias líneas IDENTIFICADOR. similar a heredoc. Se pueden concatenar cadenas con el operador „. se pueden utilizar caracteres especiales y se sustituyen las variables por sus valores.‟: view plaincopy to clipboardprint? 1. 6. Una vez creada se puede acceder a posiciones de la cadena como si de una matriz se tratara view plaincopy to clipboardprint? 1. 3. 2. echo $cadena. echo $cadena[5]. 2. 2. No se necesitan escapar las comillas si queremos imprimirlas.sintaxis heredoc. 4. echo $mensaje. y se puede escribir el texto en varias líneas: view plaincopy to clipboardprint? 1. 2. "mundo". 5. e incluso modificar posiciones de igual forma view plaincopy to clipboardprint? 1. $conc = "Hola " . pero no se sustituyen las variables por sus valores: view plaincopy to clipboardprint? 1. 3. 6. 2. 4. $cadena = "Hola amigo". . en las que. $mensaje = <<< IDENTIFICADOR Ejemplo de cadena que ocupa varias líneas IDENTIFICADOR. 5. 3. echo $mensaje. echo $conc. como en las dobles comillas.

"a". $palabras = explode(" ". 3. 5. $cadena = "Hola mundo". &$ocurrencias) view plaincopy to clipboardprint? 1. $cadena = "Hola mundo". echo substr_replace($cadena. $subcadena. $subcadena = "m". 2. $cadena). 2. Para buscar una subcadena dentro de la cadena se puede utilizar la funciónstrpos($cadena. . $reemplazo. 3). 3). $offset) view plaincopy to clipboardprint? 1. $inicio. Para obtener parte de una cadena se utiliza la función substr($cadena.Para obtener el número de caracteres que tiene una cadena se utiliza la funciónstrlen($cadena). $cadena). $cadena = "Hola mundo". $cadena. $tamanyo) view plaincopy to clipboardprint? 1. print_r($palabras). $inicio. 2. 2. $posicion = strpos($cadena. 3. echo str_replace("o". 5. "Arman". Se puede dividir una cadena en partes utilizando un cierto delimitador con la funciónexplode($delimitador. 2. $cadena. Para reemplazar una subcadena por otra se puede utilizar substr_replace($cadena. Para reemplazar todas las ocurrencias de una cadena por otra se puede utilizar la función str_replace($subcadena. $cadena = "Hola mundo". echo substr($cadena. $reemplazo. $subcadena). $tamanyo) view plaincopy to clipboardprint? 1. $cadena = "Hola mundo". $limite) view plaincopy to clipboardprint? 1.

echo "<strong>$key</strong> = $var<br/><br/>". 3. 4. Falken". 5. foreach ($_SERVER as $key => $var){ 2. que recorre cada valor de la matriz uno por uno. default: 9. case "admin": 3. for ($contador = 0. 11. if ($condicion) { echo "Se cumple la } elseif ($condicion2) echo "No se cumple else { echo "No se cumple } primera condición". } Para recorrer los valores de un array es útil la construcción foreach. 3. $contador++) { 2. break. } . echo "$var<br/><br/>". 7. 3. foreach ($_SERVER as $var){ 2. } También se puede hacer que nos de tanto la clave como el valor: view plaincopy to clipboardprint? 1. $contador < 10. view plaincopy to clipboardprint? 1. 4. 5. } Bucles view plaincopy to clipboardprint? 1. pero sí la segunda". me temo que no puedo hacer eso". 2. 3. break. 6. echo "Bienvenido Dr. 8. ninguna de las 2 condiciones". switch($usuario) { 2. 7. echo "Lo siento Dave. break.CONTROL DE FLUJO Condicionales view plaincopy to clipboardprint? 1. { la primera condición. echo "Hola Raúl". case "zootropo": 6. echo "Contador vale $contador<br/>". 10. incluidos los valores cuya clave asociada no es un número view plaincopy to clipboardprint? 1.

echo "Contador vale $contador<br/>".view plaincopy to clipboardprint? 1. echo "Hola". 4. 3. } Por defecto los parámetros de la función se pasan por valor. . 2. 5. por ejemplo. 2. obtenerCuadrado($valor). 4. echo "Contador vale $contador<br/>". } Para devolver un valor se utiliza return view plaincopy to clipboardprint? 1. 6. view plaincopy to clipboardprint? 1. 5. while ($contador <= 10) { 3. } $valor = 4. 4. 2. y eso haría que se saliera de dos bucles que estuvieran uno dentro del otro. 5. do { 3. Una curiosidad es que se puede usar break 2. 7. $contador = 0. 3. function obtenerCuadrado(&$numero) { $numero = $numero * $numero. return $numero * $numero. function saludar() { 2. FUNCIONES La palabra clave para definir una función en PHP es function. function obtenerCuadrado($numero) { 2. } while ($contador <= 10). 3. Se puede usar continue para continuar con la próxima iteración del bucle y breakpara salir del bucle. Para pasarlos por referencia se añade & antes del nombre de la variable en la lista de argumentos: view plaincopy to clipboardprint? 1. $contador++. echo $valor. } view plaincopy to clipboardprint? 1. $contador = -1. $contador++.

}. 5. function sumar() { 2. echo $lambda(1. foreach(func_get_args() as $param) 4. 3. echo "Hola $nombre". 6. También se pueden crear funciones anónimas: view plaincopy to clipboardprint? 1. 2. func_num_args() para obtener el número de parámetros yfunc_get_arg($num_argumento) para obtener un parámetro a partir de su índice. function saludar($nombre="Raul") { 2. $lambda = function($num1. view plaincopy to clipboardprint? 1. } PHP posee características de los lenguajes funcionales: se puede utilizar las funciones como si de otro tipo de variable cualquiera se tratara. __destruct. view plaincopy to clipboardprint? 1. 3. class MiClase { 2. } El constructor es una función con nombre __construct(). $suma = 0. view plaincopy to clipboardprint? 1. ORIENTACIÓN A OBJETOS Una clase se declara con la palabra clave class seguida del nombre de la clase. class MiClase { . return $suma. y el destructor. $suma += $param. $num2){ return $num1 + $num2. 2).Se puede especificar valores por defecto para argumentos con la sintaxis: view plaincopy to clipboardprint? 1. } Para crear funciones con un número de parámetros variable se deja la lista de argumentos vacía y se usan las funciones func_get_args() para obtener una lista de los parámetros pasados.

3. $this es el equivalente al this de Java o el self de Python. 8. $objeto->saludar(). view plaincopy to clipboardprint? 1. class Persona { function __construct($nombre) { $this->nombre = $nombre. 8. 4. Para acceder a las propiedades y métodos se usa “->” en lugar del típico “. 5. } 5. Además se utiliza self en lugar de $this. 5. 7. } Para instanciar un nuevo objeto a partir de una clase se usa la sentencia new. protected y private. Hay 3 modificadores de acceso: public (por defecto). 2. 6. 10. } function saludar() { echo "Hola<br/>".” view plaincopy to clipboardprint? 1. echo $persona->nombre. 7. 2. } } $objeto = new MiClase(). 11. class MiClase { function __construct() { echo "Dentro del constructor<br/>". Las propiedades y métodos estáticos se crean con la palabra clave static. view plaincopy to clipboardprint? 1. view plaincopy to clipboardprint? . y no $objeto->miembro. 9. echo "Estamos creando un objeto de tipo MiClase<br/>". } } $persona = new Persona("Juan"). 2. 4. Una peculiaridad es que para acceder a los miembros estáticos se utiliza la sintaxis$objeto::$miembro.2. function __construct() { 3. 4. $objeto2 = new MiClase. $objeto = new MiClase(). 3. 6.

No es muy común ver el uso de excepciones en el codigo PHP. $persona = new Persona("Pepe"). como en Java o Python. } 7. 3. 12. se utiliza la palabara clave implements view plaincopy to clipboardprint? 1. view plaincopy to clipboardprint? 1. 6. function calcularArea(). 5. "<br/>". 6. Para heredar de otra clase se usa la palabra clave extends. 3.. 7. 3. 11. y el sistema de reporte de errores del lenguaje. function calcularArea() { 5. class Cuadrado implements Figura { 2. 9. echo $persona::$contador. } para implementar la interfaz. // . 15. sólo se utiliza en el código más moderno que hace uso de la orientación a objetos. 14. echo $persona::$contador. 8. PHP no soporta la herencia múltiple. echo Persona::$contador. "<br/>".. class Empleado extends Persona { 2. self::$contador++. interface Figura { 2. 4. } TRATAMIENTO DE ERRORES En PHP hay dos sistemas de notificación de errores: excepciones.1. 2. 13. "<br/>". } Para crear una interfaz se utiliza la palabra clave interface. . } } $persona = new Persona("Juan"). return $this->lado * $this->lado. 10. 4. function __construct($nombre) { $this->nombre = $nombre. view plaincopy to clipboardprint? 1. class Persona { public static $contador = 0.

podemos lanzar los nuestros propios usando la funcióntrigger_error($mensaje. 10. function dividir($num1.ini y ponerla a Offpara deshabilitarlo. else return $num1 / $num2. 7.1 . En producción se debería modificar la opción display_errors de php. trigger_error("No se pudo conectar a la base de datos". $num2) { if($num2 == 0) throw new Exception('No se puede dividir entre 0'). 9. "\n". 3. utilizando la función set_error_handler. 6. en lugar de PHP.E_USER_WARNING o E_USER_NOTICE view plaincopy to clipboardprint? 1. @. PHP Y MYSQL La mejor forma de utilizar MySQL desde PHP es mediante la interfaz orientada a objetos de la extensión mysqli. una capa de abstracción incluida por defecto desde PHP 5. 12. 8.La captura de excepciones tiene este aspecto: view plaincopy to clipboardprint? 1. } catch (Exception $e) { echo 'Ocurrió una excepción: '. En desarrollo nos interesa mostrar los errores y avisos de PHP en pantalla. También podemos definir nuestro propio manejador para tratar nosotros mismos los errores. } $e->getMessage(). Existe un operador que permite que una cierta sentencia de código no genere errores. $tipo). } try { dividir(5. aunque su uso no está aconsejado. Si no estamos seguros de si vamos a tener que cambiar de base de datos también podemos utilizar la extensión PDO (PHP Data Objects). 4. El tipo de error puede ser E_USER_ERROR. E_USER_ERROR). 0). 5. En el caso de los errores. La opción error_reporting permite configurar qué tipo de errores queremos mostrar. 11. 2.

$bbdd) view plaincopy to clipboardprint? 1. echo "Tabla personas creada". echo "Primas modificadas: ". Este propiedad contiene una cadena describiendo el error que se ha producido. Este devuelve true si se llevó a cabo la consulta correctamente. printf("%s %s<br/>". "root". 4. Para recorrer las tuplas devueltas por un SELECT haríamos algo así view plaincopy to clipboardprint? 1. $empleado->Nombre. 5. exit("Se produjo un error: ". } 5. if (mysqli_connect_errno()) 2. $mysqli->query("UPDATE Empleados SET prima=2000 WHERE ventas > 5000"). o una cadena vacía si no hubo ningún error. while($empleado = $resultado->fetch_object()) { 3. $mysqli = new mysqli("localhost". $usuario. echo "Error al crear la tabla personas". mysqli_connect_error()). 3. Una vez hecho esto podemos comprobar si ha habido algún error mediante la propiedad connect_error. if ($resultado = $mysqli->query("SELECT * FROM Empleados")) { 2. } En las consultas que modifican tuplas el número de tuplas afectadas se almacena en la propiedad affected_rows view plaincopy to clipboardprint? 1. $password. "mipassword".Primero creamos el objeto correspondiente con new mysqli($host. if ($mysqli->query("CREATE TABLE Personas(id int. Una vez abierta la conexión podemos comenzar a realizar consultas utilizando el método query. "mibbdd"). } else { 4. 2. nombre varchar(30))")) { 2. $mysqli->affected_rows. } . view plaincopy to clipboardprint? 1. $empleado->Apellidos). view plaincopy to clipboardprint? 1.

para escapar los caracteres especiales. se almacenará en la matriz $_GET.Al finalizar se debe cerrar la conexión utilizando el método close() view plaincopy to clipboardprint? 1. que tiene varios valores. después se llama al método bind_param del objeto stament creado. $consulta->execute(). también se puede usar$_REQUEST["nombre"]. Si se utiliza GET. Las claves de esta matriz asociativa se tomarán del atributo name de cada campo del formulario. Por último se llama al método close para cerar el stament view plaincopy to clipboardprint? 1. que contendrá los valores de los atributos name de las opciones seleccionadas. el valor del atributo name debe acabar con []. $mysqli->close() Para evitar ciertos ataques de SQL injection es conveniente pasar las cadenas que vengan del usuario por el método mysqli::escape_string($cadena). puedes consultar nuestro Tutorial de MySQL. para introducir los valores correspondientes en los placeholders y. PHP creará una matriz con este nombre. 4. o bien utilizar prepared staments. 5. $consulta->bind_param($campo. $tabla). que es una mezcla de la información de $_GET. execute() para ejecutar la consulta. $_POST y$_COOKIE (efectivamente. como una matriz. FORMULARIOS Al enviar un formulario. Para crear prepared staments se utilizar el método mysqli->prepare($consulta). 3. Si no nos importa el origen de la petición. } Si necesitas más información sobre MySQL en sí. después. . if ($consulta = $mysqli->prepare("SELECT a FROM b")) { 2. un array con los valores de las cookies) Para un select. $consulta->close(). el valor de cada campo rellenado por el usuario se guardará en una matriz asociativa de nombre $_POST. si se utiliza el método POST.

este texto debería pasar antes por la funciónhtmlspecialchars($cadena). y si no especificamos la codificación del documento. Si la entrada del usuario se va a mostrar en algún lugar del sitio. Puede ser útil como valor para el atributo action del formulario. $expiracion. $host. htmlspecialchars no reemplazaría nada. <. Si el atacante utilizara un texto codificado en UTF-7. opcionalmente. view plaincopy to clipboardprint? 1. $https) view plaincopy to clipboardprint? .view plaincopy to clipboardprint? 1. <input name="perl">Perl</input> 6. nuestro filtrado no habrá servido de nada. y el atacante engaña al navegador para hacerle pensar que UTF-7 es la verdadera codificación del archivo. <input name="c++">C++</input> 4. y que el tipo de comillas utilizado esté codificado como entidades HTML en la cadena. <input name="c">C</input> 3. También hay que tener cuidado con la codificación de caracteres. para evitar vulnerabilidades de XSS. que convierte a sus entidades HTML correspondientes los caracteres especiales “. <select name="languages[]"> 2. Podemos especificar la codificación de caracteres con una etiqueta meta o usando la cabecera ContentType: view plaincopy to clipboardprint? 1. & y. COOKIES Para crear cookies usamos setcookie($nombre. $ruta. </select> $_SERVER['PHP_SELF'] contiene la URL del script actual. echo 'Hola '. <input name="php">PHP</input> 5. „. Si el texto se va a utilizar en un atributo de una etiqueta HTML hay que asegurarse de que los valores de los atributos estén entre comillas. charset=UTF-8'). header('Content-Type: text/html. si pasamos como segundo argumento a la función la constante ENT_QUOTES. >. $valor. htmlspecialchars($_POST['usuario']).

SESIONES Para crear una sesión se llama a la función session_start(). 'raul'. echo 'Bienvenido '. $_SESSION['usuario'] = 'raul'. 3. A las cookies se accede a través de la matriz superglobal $_COOKIE: view plaincopy to clipboardprint? 1. // Expira 3600 segundos después de haberse creado 2. $_SESSION['usuario']. que debe ser la primera sentencia PHP de la página. setcookie('fondo'. $_COOKIE['usuario']. '#000000'). . echo 'Bienvenido '.1. Para acceder a los datos que hemos guardado en la sesión se utiliza el mismo array asociativo: view plaincopy to clipboardprint? 1. setcookie('usuario'. time() + 3600). Para almacenar datos en la sesión se puede utilizar la matriz superglobal $_SESSIONdirectamente: view plaincopy to clipboardprint? 1.