Formularios en PHP

El mecanismo básico de interacción entre el usuario y un web-site esta dado por el uso de formularios html, el server envía un formulario que el browser muestra en pantalla permitiendo al usuario ingresar datos, luego los datos en el formulario viajan al server en el próximo request realizado por el browser para ser procesados en el mismo. La respuesta del server suele depender de los datos recibidos en el formulario.


El siguiente es un ejemplo de formulario en HTML usando un campo de entrada de tipo “text”

<FORM ACTION=”procesar.php” METHOD=”POST”> <INPUT TYPE=”text” NAME=”texto”> <INPUT TYPE=”submit” NAME=”proc”> </FORM>

Este formulario HTML se ve en pantalla de la siguiente manera:

Una vez que el usuario ingresa un texto y presiona el botón de submit el browser genera un request con método “Post” al script “procesar.php” que es el script que se va a encargar de procesar los datos ingresados en el formulario.

Dentro del script php los datos del formulario se reciben en variables php que tienen el mismo nombre que los indicados con “NAME” en el formulario, en este caso el script recibe $texto con el texto tipeado por el usuario en el formulario.

Generación de web sites dinámicos usando PHP.

El script que recibe el formulario podría por ejemplo ser: (procesar.php)

<? print (“El valor ingresado en el formulario es: $texto <BR />”); ?>

En PHP es posible que un form se procese a si mismo, esto lo podemos hacer de la siguiente manera: (form1.php)

<? if(isset($proc)) {

print(“el valor ingresado es: $texto”); } else { ?>

<FORM ACTION=”form1.php” METHOD=”POST”> <INPUT TYPE=”text” NAME=”texto”> <INPUT TYPE=”submit” NAME=”proc”> </FORM>

<? } //Esto cierra el else que abrimos arriba. ?>

Notar que el nombre del script que muestra el formulario es el mismo que el script usado en “action” para procesarlo, la instrucción isset de PHP devuelve true si la variable esta seteada, para un formulario si el usuario presiona el botón de submit se setea automáticamente la variable que corresponde al “NAME” del botón submit del formulario, por eso preguntamos si esta seteado $proc para saber si hay que mostrar el formulario o procesarlo. Podría también procesarse el formulario y a su vez mostrarlo o mostrar otro distinto, las variantes dependen de que es lo que se quiere hacer.

Text type:

Para ingresar texto mediante un formulario html se usa el tag input con atrobuto type=”text”, los atributos

<TR >disponibles son:<TR >Atributos:<TR >maxlength=”numero”Cantidad máxima de caracteres que se pueden ingresar<TR >name=”text”Nombre de la variable php que recibirá el valor<TR >size=”numero”Tamaño del campo de entrada a mostrar en pantalla<TR >value=”texto”Valor inicial a mostrar en el campo de entrada (default)<TR >Hidden Type:

El tag input con type=”hidden” funciona en forma idéntica a un tipo “text” con la salvedad de que no se muestra en pantalla, esto es útil para pasar variables entre formularios o guardar variables “ocultas” en un formulario.

Checkboxes:

Los checkboxes son campos de entrada que soportan solamente los estados de seteado o no. Para ello se usa el tag input con type=”checkbox” , los atributos disponibles son:

Atributos:

<TR >CheckedSi el atributo esta presente el checkbox aparecerá marcado por default.<TR >name=”text”Nombre de la variable php que recibe el valor.<TR >value=”text”Valor que toma la variable si esta seteada, el default es “on”El script que recibe los resultados sólo recibe los nombres de los checkboxes que están seteados, es común en php generar una lista de checkboxes a partir de un vector, veamos un ejemplo:

(form2.php)

<FORM ACTION=”form2.php” METHOD=”post”> <? $vector=array(“opcion1”,”opcion2”,”opcion3”); for ($i=0;$i<count($vector);$i++) {

print(“$vector[$i]”); ?> <input type=”hidden” name=”valor[<?print($i);?>]”

value=”<?print(“$vector[$i]”);?>”> <input type=”checkbox” name=”vector[<?print($i);?>]”> <br> <?

} ?> <INPUT TYPE=”submit” name=”proc”> </FORM>

Este es un ejemplo muy útil en el cual el formulario html no es siempre el mismo sino que es generado dinámicamente desde php en base a por ejemplo el contenido de un vector.

Generación de web sites dinámicos usando PHP.

El formulario se muestra en el browser de la siguiente manera:

Y el código html que recibe el browser para mostrar el formulario (que se genera en el servidor) es:

<FORM ACTION="form2.php" METHOD="post"> opcion1 <input type="hidden" name="valor[0]" value="opcion1"> <input type="checkbox" name="vector[0]"> <br> opcion2 <input type="hidden" name="valor[1]" value="opcion2"> <input type="checkbox" name="vector[1]"> <br> opcion3 <input type="hidden" name="valor[2]" value="opcion3"> <input type="checkbox" name="vector[2]"> <br> <INPUT TYPE="submit" name="proc"> </FORM>

Observar el uso de campos de texto ocultos para indicar cual es el valor de un textbox en caso de estar seleccionado, también podríamos haber usado el campo value de los checkboxes, es otra forma de hacer lo mismo. Le podemos agregar al formulario la opción de mostrar cuales son los checkboxes seleccionados usando: (Agregar este código al principio de form2.php)

Generación de web sites dinámicos usando PHP.
<? if(isset($proc)) { for ($i=0;$i<count($valor);$i++) { if(isset($vector[$i])) { if($vector[$i]==”on”) { print(“$valor[$i] viene seleccionado”); } }

} } ?>

Como resultado el script informa cuales son los checkboxes que han sido seleccionados por el usuario y cuales no. El script completo es:

(form2.php)

<? if(isset($proc)) { for ($i=0;$i<count($valor);$i++) { if(isset($vector[$i])) { if($vector[$i]=="on") { print("$valor[$i] viene seleccionado"); } }

} } ?>

<FORM ACTION="form2.php" METHOD="post"> <? $vector=array("opcion1","opcion2","opcion3"); for ($i=0;$i<count($vector);$i++) {

print("$vector[$i]"); ?>

<input type="hidden" name="valor[<?print($i);?>]" value="<?print("$vector[$i]") ;?>">

<input type="checkbox" name="vector[<?print($i);?>]"> <br> <? }

Radio Buttons:

Un radio button también es un tipo de botón de 2 estados (encendido-apagado) pero estos pueden agruparse de forma tal que sólo un radio-button del grupo pueda estar prendido. El nombre de radio button fue puesto por su funcionamiento parecido a los botones de las viejas radios de automóviles, que siempre debía estar presionado uno de los botones y nunca (mientras funcionaba correctamente) podían estar dos presionados al mismo tiempo.

Los atributos son checked, name y value. Todos los radio buttons del mismo nombre pertenecen al mismo grupo, es decir que de todo el grupo sólo uno podrá ser seleccionado. El value del botón determina cual es el radio elegido del grupo. Ejemplo:

<? if(isset($proc)) { print("El radio seteado es $grupo <BR />"); } ?>

<FORM ACTION="form3.php" METHOD="post"> <input type="radio" name="grupo" value="uno" checked> Uno <br> <input type="radio" name="grupo" value="dos"> Dos <br> <INPUT TYPE="submit" name="proc"> </FORM>

El formulario que se despliega en pantalla es: Y solamente uno de los dos radio buttons puede estar habilitado.

Image:

Es posible reemplazar el boton submit por una imagen gif o jpg de forma de darle al botón el look and feel que se quiera, esto se hace con el tag input type=”image” los atributos son:

name=”texto” Cumple la misma función que el atributo name de submit. src=”url” URL de la imagen a mostrar, ejemplo: “images/boton.jpg”

TextArea:

Un textarea permite ingresar texto en una caja de formato mayor a un input type=”text” , la notación de un textarea es distinta a la de un tag de input. Los atributos son los siguientes:

cols=”numero” Número de columnas del textarea rows=”numero” Número de líneas name=”texto” Nombre de la variable que recibe el texto wrap=”off/virtual/physical” Forma en la cual se cortan las palabras cuando termina cada línea, off elimina el corte de palabras, virtual muestra los cortes pero estos no son transmitidos al server, physical corta las palabras y además transmite los saltos de línea al server.

Ejemplo:

<textarea name=”texto” cols=”20” rows=”10”> </textarea>

Entre el tag que abre y cierra si se desea se puede poner texto que se muestra en el textarea y el usuario puede modificar.

File Uploads

El último tipo de dato que se puede transferir al server usando un formulario es un archivo, este es un tipo de transferencia especial pues implica generar un archivo en el file-system del web-server a partir de un archivo que el usuario selecciona desde su disco local.

HTML soporta el upload de archivos usando el tag <input> con type=”file”, este tipo de input genera un boton “browse” en el browser que permite al usuario seleccionar un archivo desde su file-system local (usando una caja de navegación por los discos standard del sistema operativo).

El formulario para subir un archivo es de la forma:

<FORM ENCTYPE=»multipart/form-data» ACTION=»upload.php» METHOD=POST> <INPUT TYPE=»hidden» name=»MAX_FILE_SIZE» value=»1000″> Send this file: <INPUT NAME=»userfile» TYPE=»file»> <INPUT TYPE=»submit» VALUE=»Send File»> </FORM>

Como puede verse hay un campo oculto que indica cual es el limite máximo de tamaño que se puede subir, este valor es chequeado en el “cliente”, además PHP dispone de una variable que se inicializa en el archivo de configuración de php (en gral /var/lib/php.ini) allí se limita el tamaño máximo de los uploads al llegar al “server”

El script upload.php que recibe los datos del formulario recibe las siguientes variables:

  • $userfile – Path del archivo almacenado en el server.
  • $userfile_name – Nombre del archivo segun el usuario
  • $userfile_size – Tamaño del archivo subido
  • $userfile_type – Mime type del archivo, por ejemplo image/gif

El script que recibe el archivo es responsable de hacer lo que corresponda con el mismo ya que en general el archivo se almacena en un directorio temporal y es eliminado una vez que termina el script. El script debe almacenar el archivo en una base de datos, moverlo a un directorio permanente, tomar datos de el o realizar el procesamiento que corresponda.

Capitulo 4: Manejo de Strings y expresiones regulares.

A continuación se describe un resumen de las funciones mas importantes de PHP para manejo de strings.

Mayúsculas y minúsculas:

string=strtoupper(string); Pasa un string a mayúsculas. string=strtolower(string); Pasa un string a minúsculas. string=ucfirst(string); Pasa a mayúscula el primer carácter de un string string=ucwords(string); Pasa a mayúsculas el primer carácter de cada palabra de un string (separadas por blancos, tabulaciones y

saltos de línea)

Trimming:

string=chop(string); Elimina blancos y saltos de línea a la derecha de un string dado. string=ltrim(string); Elimina blancos y saltos de línea a la izquierda de un string. string=trim(string); Elimina blancos y saltos de línea a derecha e izquierda de un string.

Comparaciones:

int=strpos(string1,string2); Devuelve la posición de la primera ocurrencia de string 2 dentro de string1. int=strspn(string1,string2); Devuelve la longitud en caracteres de s1 contando desde el principio hasta que aparece un caracter en s1 que

no esta en s2. int=strcmp(string1,string2); Compara dos strings y devuelve 1, 0 o –1 según sea mayor el primero, iguales o el segundo. int=strcasecmp(string1,string2); Idem anterior pero case-insesitive (no distingue mayúsculas y minúsculas)

int=strcspn(string1,string2); Devuelve la longitud de s1 desde el principio hasta que aparece un caracter que pertenece a s2. int=strstr(string1,string2); Devuelve todos los caracteres de s1 desde la primera ocurrencia de s2 hasta el final. int=stristr(string1,string2); Idem anterior pero case-insensitive (no distingue mayúsculas de minúsculas) int=similar_text(string1,string2,referencia); Analiza la semejanza entre dos strings, devuelve la cantidad de caracteres iguales en los dos strings, si se pasa

como tercer parámetro una referencia a una variable devuelve en la misma el porcentaje de similitud entre ambos strings de acuerdo al algoritmo de Oliver (1993). Ejemplo: similar_text($st1,$st2,&$porcentaje);

Funciones de Parsing:

array=explode(separator,string);

Devuelve un vector donde cada elemento del vector es un substring del string pasado particionado de acuerdo a un cierto caracter separador. Ejemplo: $st=”hola,mundo,como,estan”

$vec=explode(“,”,$st); //$vec=(“hola”,”mundo”,”como”,”estan”); string=implode(separator,array); Genera un string concatenando todos los elementos del vector pasado e intercalando separator entre ellos. string=chunk_split(string,n,end); end es opcional y por default es “\r\n”, devuelve un string en donde cada “n” caracteres del string original se

intercala el separador “end”. Ejemplo: $st=”hola mundo”;

$st2=chunk_split($st,2,”,”); //$st2=”ho,la, m,un,do”;

array=count_chars(string); Devuelve un vector de 256 posiciones donde cada posición del vector indica la cantidad de veces que el caracter de dicho orden aparece en el vector.

string=nl2br(string); Devuelve un string en donde todos los saltos de línea se han reemplazado por el tag <BR> de html. string=strip_tags(string,string_tags_validos); Devuelve un string eliminando del string original todos los tags html, si se pasa el segundo parámetro

opcional es posible especificar que tags no deben eliminarse (solo hace falta pasar los tags de apertura) ejemplo: $st2=strip_tags($st1,”<br> <table>”); Elimina todos los tags html de $st1 excepto <br> , <table> y </table> string=metaphone(string); Devuelve una representación metafónica (similar a soundex) del string de acuerdo a las reglas de

pronunciación del idioma ingles. string=strtok(separador,string); Dado un separador obtiene el primer “token” de un string, sucesivas llamadas a strtok pasando solamente el

separador devuelven los tokens en forma sucesiva o bien falso cuando ya no hay mas tokens. Ejemplo: $tok=strtok($st,”/”);

while($tok) { //Hacer algo $tok=strtok(“/”);

} parse_string(string); Dado un string de la forma “nombre=valor&nombre2=valor2&nombre3=valor3”, setea las variables

correspondientes con los valores indicados, ejemplo: parse_string(“v1=hola&v2=mundo”); //Seteta $v1=”hola” y $v2=”mundo”

Codificación y decodificación ASCII.

char=chr(int); Devuelve el caracter dado su número ascii. int=ord(char); Dado un caracter devuelve su código Ascii.

Substrings:

string=substr(string,offset,longitud); Devuelve el substring correspondiente al string pasado desde la posición indicada por offset y de la longitud indicada como tercer parámetro, si no se pasa el tercer parámetro se toman todos los caracteres hasta el final del string.

string=substr_replace(string,string_reemplazo,offset, longitud);

Idem anterior pero el substring seleccionado es reemplazado por string_reemplazo, si string_reemplazo es “” entonces sirve para eliminar una porción de un string.

Búsquedas y Reemplazos.

str_replace(string1,string2,string3);

Reemplaza todas las ocurrencias de string1 en string3 por string2. Esta función no admite expresiones regulares como parámetros. string=strtr(string1,string_from,string_to); Reemplaza en string1 los caracteres en string_from por su equivalente en string_to (se supone que

string_from y string_to son de la misma longitud, si no lo son los caracteres que sobran en el string mas largo se ignoran)

Ejemplo: $st=”hola mundo” strtr($st,”aeiou”,”12345”); //$st=”h4la m5nd4”

array=split(pattern,string); Idem a explode pero el separador puede ser ahora una expresión regular. boolean=ereg(pattern,string,regs); Devuelve true o false según si el string matchea o no una expresión regular dada, el tercer parámetro es

opcional y debe ser el nombre de un vector en donde se devolverán los matches de cada paréntesis de la expresion regular si es que la misma tiene paréntesis. boolean=eregi(pattern,string,regs); Idem anterior pero case-insensitive. ereg_replace(pattern_from,string_to,string); Reemplaza todas las ocurrencias de una expresión regular en string por el contenido de string_to.

eregi_replace(pattern_from,string_to,string); Idem anterior pero no considera mayúsculas y minúsculas para la búsqueda de la expresión regular en el string.

Sintaxis básica de una expresión regular:

Los símbolos especiales “^” y “$” se usan para matchear el principio y el final de un string respectivamente.

<TR >Por ejemplo:<TR >“^el”Matchea strings que empiezan con “el”<TR >“colorin colorado$”Matchea strings que terminan en “colorin colorado”<TR >“^abc$”String que empieza y termina en abc, es decir solo “abc” matchea<TR >“abc”Un string que contiene “abc” por ejemplo “abc” ,”gfabc”, “algoabcfgeh”, etc…Los símbolos “*” , “+” y “?” denotan la cantidad de veces que un caracter o una secuencia de caracteres puede ocurrir. Y denotan 0 o más, una o más y cero o una ocurrencias respectivamente. Por ejemplo:

“ab*” Matchea strings que contienen una “a” seguida de cero o mas “b”

Ej: “a”, “ab”, “cabbbb”, etc “ab+” Matchea strings que contienen una “a” seguida de una o mas “b” “ab?” Matchea strings que contienen una “a” seguida o no de una “b” pero no mas de 1. “a?b+$” Matchea “a” seguida de una o mas “b” terminando el string.

Para indicar rangos de ocurrencias distintas pueden especificarse la cantidad máxima y mínima de ocurrencias usando llaves de la forma {min,max} “ab{2}” Una “a” seguida de exactamente 2 “b” “ab{2,}” Una “a” seguida de 2 o mas “b” “ab{3,5}” Una “a” seguida de 3 a 5 “b” (“abbb”, “abbbb”, ”abbbbb”)

Es obligatorio especificar el primer número del rango pero no el segundo. De esta forma + equivale a {1,}. * equivale a {0,} y ? equivale a {0,1} Para cuantificar una secuencia de caracteres basta con ponerla entre paréntesis. “a(bc)*” Matchea una “a” seguida de cero o mas ocurrencias de “bc” ej: “abcbcbc” El símbolo “|” funciona como operador “or” “hola|Hola” Matchea strings que contienen “hola” u “Hola”

“(b|cd)ef” Strings que contienen “bef” o “cdef” “(a|b)*c” Secuencias de “a” o “b” y que termina en “c”

El carácter “.” matchea a cualquier otro caracter. “a.[0-9]” Matchea “a” seguido de cualquier caracter y un dígito. “^.{3}$” Cualquier string de exactamente 3 caracteres.

Los corchetes se usan para indicar que caracteres son validos en una posición única del string. “[ab]” Matchea strings que contienen “a” o “b” “[a-d]” Matchea strings que contienen “a”, “b” , “c” o “d” “^[a-zA-Z]” Strings que comienzan con una letra. “[0-9]%” Un dígito seguido de un signo % También puede usarse una lista de caracteres que no se desean agregando el símbolo “^” dentro de los corchetes, no confundir con “^” afuera de los corchetes que matchea el principio de línea. “[^abg]” Strings que NO contienen “a” , “b” o “g” “[^0-9]” Strings que no contienen dígitos Los caracteres “^.[$()|*+?{\” deben escaparse si forman parte de lo que se quiere buscar con una barra invertida adelante. Esto no es válido dentro de los corchetes donde todos los caracteres no tienen significado especial. Ejemplos: Validar una suma monetaria en formato: “10000.00”, “10,000.00” .,“10000” o “10,000” es decir con o sin centavos y con o sin una coma separando tres dígitos. ^[1-9][0-9]*$ Esto valida cualquier número que no empieza con cero, lo malo es que “0” no pasa el test. Entonces: ^(0|[1-9][0-9]*)$ Un cero o cualquier número que no empieza con cero. Aceptemos también un posible signo menos delante. ^(0|-?[1-9][0-9]*)$ O sea cero o cualquier número con un posible signo “-“ delante. En realidad podemos admitir que un número empiece con cero para una cantidad monetaria y supongamos que el signo “-“ no tiene sentido, agreguemos la posibilidad de decimales: ^[0-9]+(\.[0-9]+)?$ Si viene un “.” debe esta seguido de un dígito, 10 es válido pero “10.” no

Especifiquemos uno o dos dígitos decimales: ^[0-9]+(\.[0-9]{1,2})?$ Ahora tenemos que agregar las comas para separar de a miles. ^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$ O sea un conjunto de 1 a 3 dígitos seguido de uno más conjuntos de “,” seguido de tres dígitos. Ahora

hagamos que la coma sea opcional. ^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(\.[0-9]{1,2})?$ Y de esta forma podemos validar números con los 4 formatos validos en una sola expresión.

 Manejo de Bases de Datos (MySQL)

Una de las características más importantes de PHP es su integración con diversos motores de base de datos,. El PHP está construido para generar en forma sencilla páginas web dinámicas a partir de información almacenada en bases de datos. A continuación mostramos las funciones más importantes y ejemplos típicos de uso para una base MySql.

1. Conexión a la base

$db_link=mysql_connect(hostname, user, password); Ejemplo: $db=mysql_connect(“localhost”,”root”,”secreto”); La función realiza la conexión a la base Mysql y devuelve “false” si hubo algún error en la conexión o un link

a la conexión a la base en caso de que la conexión sea exitosa. El link es un número que indica la sesión dentro del MySql. Esta sesión se mantiene hasta que […]. Para finalizar la conexión se debe utilizar la función mysql_close(). Es muy importante cerrar la conexión a la base de datos una vez finalizadas las transacciones para evitar la sobrecarga en el motor de la base de datos.

2. Selección de la base de datos a utilizar

mysql_select_db(database_name, db_link); Ejemplo: mysql_select_db(“test”,$db); Esta función configura cual es la base de datos que se utilizara por omisión. En este caso el link a utilizar en

esta función es el link que se obtuvo al ejecutar la función mysql_connect.

La función mysql_select_db devuelve el valor “false” en caso de que se encuentre algún error, como por ejemplo la inexistencia de la base de datos. En este punto cabe aclarar que la denominación de las bases de datos de MySql es case-sensitive, por lo que

debemos mantener un standard a la hora de elegir los nombres de las distintas bases de datos.

3. Queries a la base de datos.

$result=mysql_query(query,db_link); Ejemplo: $result=mysql_query(“update clientes set deudor=’si’ where apellido=’Picapiedras’, $db) $query=”insert into clientes (nombre, Apellido) values (Pedro, Mármol) ”;

$result=mysql_query($query,$db); Nuevamente el link que se debe usar es el que se obtiene al conectarse a la base, mysql_query devuelve falso en caso de que el query no pueda ejecutarse (error de SQL) o bien un result set en los casos que devuelva algún tipo de datos como por ejemplo en un select..

Es muy importante fijarse con que usuario se realizó la conexión a la base de datos a la hora de ejecutar el mysql_connect, ya que la gran mayoría de los errores producidos en esta instancia son el resultado de la falta de permisos para realizar la consulta.

4. Cantidad de Filas Consultadas o Modificadas

4.1 Filas Consultadas

$cantidad=mysql_num_rows($result);

Ejemplo: $query=”select nombre, telefono from contactos where edad between 20 and 25 and sexo=’f’”; $result=mysql_query($query,$db); $cant=mysql_num_rows($result);

Esta función devuelve la cantidad de filas que se obtuvieron luego de ejecutar una instrucción de consulta como por ejemplo la función select. En el caso del ejemplo, en la variable $cant nos dirá cuantas chicas de entre 20 y 25 años tenemos en nuestra lista de contactos.

4.2 Filas Modificadas

$cantidad=mysql_affected_rows(db_link); Ejemplo: $cuantos=mysql_affected_rows($db); Devuelve cuantos registros fueron afectados por un query con insert, update, o delete, notar que se le pasa el

db_link ya que el result_set no tiene sentido. Si el query fue un delete sin clausula “where” esta función devuelve cero independientemente del número de registros eliminados de la tabla.

5. Obtención de registros de una consulta

5.1 Obtención de datos en un result set
$var=mysql_fetch_row(result_set);

Ejemplo: $query=”select nombre, telefono from contactos where edad between 20 and 25 and sexo=’f’”;

$result=mysql_query($query,$db);$rs=mysql_fetch_row($result);

Toma un registro del result set y lo devuelve en un vector en el cual el elemento con índice 0 es la primer columna del registro, el elemento con índice 1 es la segunda columna, etc. Si no hay más registros por devolver devuelve false. Los valores de los campos solicitados en el result set son devueltos en forma de array, es decir que para acceder al valor de nombre de la primera fila de nuestro ejemplo debo llamar a la variable $rs[0].Ejemplo:

while($v=mysql_fetch_row($result)) { print(“Columna 0: $v[0] Columna 1: $v[1]”); }
5.2 Obtención de datos en un vector
$query=”select nombre, telefono from contactos where edad between 20 and 25 and sexo=’f’”; $result=mysql_query($query,$db); $rs=mysql_fetch_array($result);

Ejemplo:

$rs=mysql_fetch_array($result);

Funciona de forma idéntica a mysql_fetch_row pero devuelve los resultados en un vector asociativo indexado por nombre de columna, por lo que para obtener los nombres de nuestra consulta es necesario llamar al vector de la forma $rs[“nombre”]

Ejemplo:

while($v=mysql_fetch_array($result)) { print(“Columna 0: $v[“nombre”]”); }
6. Cerrar la conexión

mysql_close(db_link) Por último, esta función nos sirve para cerrar la conexión a la base se usa.

Otras funciones:

<TR >FunciónDescripción<TR >result=mysql_create_db(database_name,db_link);Crea una base de datos con el nombre indicado, devuelve true o false según el resultado.<TR >Result=mysql_data_seek(result_set, position);Mueve el puntero interno de cada result set a la posición indicada (el primer registro es la posición 0), de esta forma la próxima llamada a mysql_fetch_row o mysql_fetch_array devolvera el registro que se acaba de apuntar. Devuelve true o false.<TR >Result=mysql_db_query(database_name, query, db_link);Realiza una consulta a una base indicada, es obviamente reemplazable por un mysql_select_db y un mysql_query aunque resulta útil si hay que consultar tablas en varias bases distintas.<TR >Result=mysql_drop_db(database_name,db_link);Dropea la base con el nombre indicado, devuelve true o false.<TR >Object=mysql_fetch_field(result_set, numero_columna);Devuelve un objeto con información sobre la columna indicada de un result set (0 es la primera columna, 1 la segunda, etc). Las propiedades que se setean en el objeto son: • name – nombre de la columna • table – nombre de la tabla • max_length – longitud maxima de la columna • not_null – 1 si la columna no puede ser null • primary_key – 1 si la columna es primary key • unique_key – 1 si la columna es unique key • multiple_key – 1 si la columna no es unique key • numeric – 1 si la columna es numerica • blob – 1 si la columna es un BLOB • type – Tipo de la columna • unsigned – 1 si la columna es sin signo • zerofill – 1 si la columna es zero-filled<TR >object=mysql_fetch_object(result_set);Similar a mysql_fetch_array con la diferencia de que los resultados se devuelven en un vector en lugar de un vector asociativo. Luego se puede acceder a las distintas columnas del registro devuelto como propiedades (data_members) del objeto devuelto.<TR >int=mysql_num_fields(result_set);Devuelve el numero de columnas en un result set.

Manejo de errores:

Mensaje=mysql_error();

Devuelve un texto con el mensaje correspondiente al error que ocurrió en caso de que se produzca un error en la base de datos.

Ejemplo:

$result=mysql_query($query,$db);

if(!$result) {

$x=mysql_error();

die(“Ocurrio un error en la base de datos: $x”); }

Generación dinámica de páginas a partir de una base de datos:

Repasemos el layout de nuestro web-site ejemplo: Supongamos que a la barra de links y aplicaciones a la derecha se decide agregarle un módulo “noticia de la semana” el layout queda entonces de la siguiente manera:

<TR >LOGOBANNER <TR >BUSCADOR <TR >BOTON S1BOTON S2BOTON S3BOTON S4<TR >Barra de links y AplicacionesCONTENIDOS <TR >Informacion de copyrigh, y pie de página <TR >LOGOBANNER <TR >BUSCADOR <TR >BOTON S1BOTON S2BOTON S3BOTON S4<TR >Noticia de la semana.CONTENIDOS <TR >Barra de links y aplicaciones.<TR >Información de copyrigh, y pie de página

Se define que el módulo php que mostrará la noticia de la semana se denominará noticia.php

Ejercicio: Modificar el archivo layout1.php para reflejar el cambio.

A continuación una tarea habitual es que el equipo de diseño realice un archivo html (o php) con un ejemplo de cómo debe quedar para que sea visualmente agradable el módulo noticia de la semana, por ejemplo puede verse de la siguiente manera:

El código HTML del módulo noticia.php es el siguiente:

<table bgcolor=»#22AE22″ width=»140″ border=»0″ cellspacing=»0″ cellpadding=»0″> <tr><td> <img src=»flechita.gif»> <b>Título Noticia</b> </td></tr> <tr><td bgcolor=»#226622″> Información sobre la noticia datos varios cosas divertidas. </td> </tr> </table>

Lo que debemos hacer es reemplazar el título de la noticia y el texto de la misma por valores que obtenemos de la base de datos. Para ello decidimos crear una tabla llamada “noticia” en donde almacenaremos la noticia de la semana, además tenemos que construir un cargador que permita insertar el título y texto de la noticia en la base.

Definimos la tabla noticia en MySQL de la siguiente manera:

CREATE TABLE noticia( título varchar(40), texto text, fecha datetime

);

La fecha la vamos a usar para poder insertar varias noticias y que en la página se muestre siempre la última (la que tiene fecha más reciente), el historial de noticias de la semana puede usarse eventualmente en otra página para mostrar un listado de los títulos de la noticia de la semana, etc.

El formulario cargador que vamos a utilizar usa las técnicas que vimos en el capítulo de formularios y le agregamos el manejo de la base de datos para que realice el insert en la tabla de noticias.

<? //Este código se ejecuta cuando se presiono el botón de submit if(isset($proc)) {

$dab=mysql_connect(" localhost","root","seldon"); mysql_select_db("curso",$dab); $query="INSERT into noticia(título,texto,fecha) values('$título','$texto',now()

)"; $res=mysql_query($query,$dab); if(!$res) {

$x=mysql_error(); print("Se produjo un error al insertar: $x");

} } ?> <form action="<?print("$PHP_SELF");?>" method="post"> Título de la noticia: <input type="text" maxlength="40" name="título"> <BR> Texto de la noticia: <textarea rows="10" cols="80" name="texto"></textarea><BR> <input type="submit" name="proc"> </form>

Luego podemos modificar el módulo noticia.php para que obtenga el título y texto de la última noticia y sea esto lo que se muestre al usar el módulo.

Noticia.php modificado queda de la forma:

<? //Obtenemos los datos de la noticia a buscar $dab=mysql_connect("localhost","root","seldon"); if(!$dab) {$título="No hay noticia";$texto="No hay noticia";} else {

mysql_select_db("curso",$dab); $query="select título,texto from noticia order by fecha desc"; $res=mysql_query($query,$dab); if(!$res) {$título="No hay noticia";$texto="No hay texto";} else {

$r=mysql_fetch_row($res); $título=$r[0]; $texto=$r[1];

} } ?> <table bgcolor="#22AE22" width="140" border="0" cellspacing="0" cellpadding="0"> <tr><td> <img src="flechita.gif"> <b><?print("$título");?></b> </td></tr> <tr><td bgcolor="#226622"> <?print("$texto");?> </td> </tr> </table>

Como podemos ver probando el módulo o usando el layout modificado con la inclusión de este módulo a partir de este momento la noticia de la semana que se muestra al ingresar a la página es la última noticia ingresada en la base, usando el cargador de noticias puede modificarse la misma cargando una nueva noticia y la próxima vez que se acceda a la base automáticamente se ve la nueva noticia. Este es el principio básico de un web-site dinámico y de la generación dinámica y en tiempo real de páginas web.

Almacenamiento de objetos binarios en MySQL:

Un tema interesante en Mysql es usar la base de datos para guardar además de datos de tipo texto datos binarios como por ejemplo código html o imágenes. De esta forma se pueden almacenar completamente en la base de datos todos los elementos necesarios para construir un web-site.

CREATE TABLE binary_data ( id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY, description CHAR(50), bin_data LONGBLOB, filename CHAR(50), filesize CHAR(50), filetype CHAR(50) );

El siguiente script puede usarse para insertar objetos binarios en la base de datos desde un browser. Notar que se usa el tag input type=”file” de un form html para subir un archivo.

<HTML> <HEAD><TITLE>Store binary data into SQL Database</TITLE></HEAD> <BODY>

<?php if ( $submit) { //codigo que se ejecuta si se presiono el botón submi t MYSQL_CONNECT( "localhost" , "root" , "password"); mysql_select_db( "binary_data"); $data = addslashes( fread( fopen( $form_data, "r") , filesize( $form_data))); $result=MYSQL_QUERY( "INSERT INTO binary_data (description,bin_data,filename,filesize,filetype) " . "VALUES ('$form_description','$data','$form_data_name','$form_data_size','$form_d ata_type')"); $id= mysql_insert_id(); print "<p>Database ID: <b>$id</b>"; MYSQL_CLOSE(); } else {

// sino mostrar el formulario para nuevos datos:

? > <form method="post" action=" <?php echo $PHP_SELF; ?>" enctype="multipart/form-data"> File Description:<br> <input type="text" name="form_description" size="40"> <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000000"> <br>File to upload/store in database:<br> <input type="file" name="form_data" size="40"> <p><input type="submit" name="submit" value="submit"> </form>

<?php

}

? >

</BODY> </HTML>

Notar el uso de la variable predefinida $PHP_SELF que tiene el nombre del script de esta forma el formulario se llama a si mismo independientemente del nombre que se le ponga al archivo.

El siguiente script (getdata.php) puede usarse para recuperar los datos desde la base de datos, notar que el script espera recibir la variable $id con el id del registro a recuperar de la tabla.

<?php if( $id) { @MYSQL_CONNECT( "localhost" , "root" , "password"); @mysql_select_db( "binary_data"); $query = "select bin_data,filetype from binary_data where id=$id"; $result = @MYSQL_QUERY( $query); $data = @MYSQL_RESULT( $result,0, "bin_data"); $type = @MYSQL_RESULT( $result,0, "filetype"); Header( "Content-type: $type"); echo $data; };

? >

Para usar una imagen que se obtiene de la base de datos se puede usar:

<img src=»getdata.php?id=3″>

Notar como se le pasa la variable id al script para saber cual es el registro a recuperar de la base. Usando este conjunto de scripts es sencillo:

  • Armar un cargador que permita insertar en la base de datos archivos binarios (imágenes, código html, etc)
  • Utilizar los datos almacenados en la base para insertarlos en una página web usando el script getdata o una variante del mismo.
Categorías: PHP

0 comentarios

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *