You are on page 1of 27

Programacion PHP Para agregar un programa PHP dentro de una pgina HTML debemos por un lado al crear el archivo

definirlo con extensin y dentro del contenido de la pgina, encerrar el programa entre los smbolos <?php [aqui el programa PHP] ?>. <body> <?php [Cuerpo del programa] ?> </body> USO DE VARIABLES Los nombres de variables comienzan con el signo $ y son sensibles a maysculas y minsculas (no as las palabras claves del lenguaje). En PHP no es necesario definir el tipo antes de utilizarla, las mismas se crean en el momento de emplearlas. Las variables se declaran cuando se le asigna un valor, por ejemplo: $dia = 24; //Se declara una variable de tipo integer. $sueldo = 758.43; //Se declara una variable de tipo double. $nombre = "juan"; //Se declara una variable de tipo string. $exite = true; //Se declara una variable boolean. Tambin podemos hacer notar que para disponer comentarios de lnea debemos utilizar dos caracteres // Para concatenar string empleamos el operador . Cuando una cadena encerrada entre comillas dobles contiene una variable en su interior, sta se trata como tal, por lo tanto se utilizar su contenido para el almacenamiento. USO DE FUNCION ECHO echo se utiliza Para imprimir y se encierra entre comillas dobles. $dia=10; $fecha="Hoy es $dia"; echo $fecha; En pantalla se muestra: Hoy es 10Es decir, en la cadena, se sustituye el nombre de la variable $dia, con el contenido de la misma. USO DE FUNCION DATE Para obtener la fecha del servidor web debemos llamar a la funcin date. Si queremos la fecha completa: $fecha=date("Y:m:d") Si a la funcin date le pasamos el string "d" retornar slo el da $dia=date("d"); La funcin rand nos retorna un valor aleatorio entre un rango de dos enteros: $num=rand(1,100);

Sentencias de control Cuando se pretende que el programa, una vez llegado a un cierto punto, tome un camino concreto en determinados casos y otro diferente si las condiciones de ejecucin difieren, se utiliza el conjunto de instrucciones: if, else y elseif. if (Condicion 1) { Instruccin 1; Instruccin 2; } elseif (Condicion 2) { Instruccin A; Instruccin B; } else { Instruccin X; Instruccin Z; } for for(Inicializacin de la variable; Condicin; Incremento/decremento de la variable) { Instrucciones; } while while (condicin) { Instrucciones; } do while do { Instrucciones; } while (condicin);

Arreglos (vectores) Un Array es una coleccin de valores. Los array pueden ser unidimensionales (vectores), bidimensionales (matrices) y multidimensionales (ms de dos dimensiones) Los arrays se utilizan ampliamente en el lenguaje PHP. Se utiliza el delimitador [] para acceder a los diferentes elementos del vector. Se lo puede crear al vuelo, sin tener que declararlo: $dias[0]=31; $dias[1]=28; Luego de estas dos lneas, tenemos creado un vector de dos elementos, a los cuales accedemos por un subndice que comienza a numerarse desde cero. echo $dias[0]; //31 echo $dias[1]; //28 El vector, como podemos ver, puede ir creciendo en forma dinmica, es decir que si ahora hacemos: $dias[2]=31; Tambin podemos obviar el subndice cuando asignamos los valores: $dias[]=31; $dias[]=28; $dias[]=31; Automticamente comienza a numerarse desde cero. Si necesitamos conocer el tamao del vector en cualquier momento podemos llamar a la funcin count. La funcin sizeof(<nombre del vector>) es equivalente a count echo count($dias); //3

Si queremos imprimir todos los elementos en la pgina podemos hacer: $nombres[]="juan"; $nombres[]="pedro"; $nombres[]="ana"; for($f=0;$f<count($nombres);$f++) { echo $nombres[$f]; }

Otra forma de inicializar un vector es definirlo e inicializarlo simultneamente:

$edades=array("menores","jovenes","adultos");

Arreglos Asociativos Un vector asociativo permite acceder a un elemento del vector por medio de un subndice de tipo string. Como ejemplo, consideremos que deseamos guardar en un vector el DNI, nombre y direccin de una persona. Empleando un vector con subndice entero la solucin sera: <?php $registro[]="20456322"; $registro[]="Martinez Pablo"; $registro[]="Colon 134"; ?>

Un vector asociativo se define de la siguiente forma: <?php $registro['dni']="20456322"; $registro['nombre']="Martinez Pablo"; $registro['direccion']="Colon 134"; echo $registro['nombre']; ?> Otras formas de crear un vector asociativo: <?php $registro=array('dni'=>'20456322', 'nombre'=>'Martinez Pablo', 'direccion'=>'Colon 134'); echo $registro['dni']; ?>

Funciones La sintaxis para la definicin de una funcin en PHP es: function [nombre de la funcin]([parmetros]) { [algoritmo] }

Las funciones nos permiten tener un programa ms ordenado y facilitan la reutilizacin del cdigo. Una funcin puede retornar un dato, supongamos que necesitamos una funcin que nos retorne el promedio de dos valores, el cdigo sera: <?php function retornarpromedio($valor1,$valor2) { $pro=$valor1/$valor2; return $pro; } $v1=100; $v2=50; $p=retornarpromedio($v1,$v2); echo $p; ?> Cuando una funcin retorna un dato debemos emplear la palabra clave return seguida del valor que devuelve. En la llamada a la funcin el valor retornado se almacena generalmente en una variable: $p=retornarpromedio($v1,$v2); Si queremos que retorne ms de un dato debemos emplear parmetros por referencia. Supongamos que necesitamos ahora que una funcin nos retorne el cuadrado y cubo de un nmero: <?php function cuadradocubo($valor,&$cuad,&$cub) { $cuad=$valor*$valor; $cub=$valor*$valor*$valor; } cuadradocubo(2,$c1,$c2); echo "El cuadrado de 2 es:".$c1."<br>"; echo "El cubo de 2 es:".$c2; ?>

Es decir, cuando le antecedemos el caractr ampersand al parmetro, es por referencia. El objetivo es asignarle cierto valor al parmetro y posteriormente el dato quedar almacenado en la variable que le pasamos a la funcin. function cuadradocubo($valor,&$cuad,&$cub) { $cuad=$valor*$valor; $cub=$valor*$valor*$valor; }

El parmetro $cuad se almacena en la variable $c1 y el parmetro $cub se almacena en $c2. Es la forma ms adecuada de modificar variables dentro de una funcin.

Formulario La estructura mnima de un formulario es la siguiente: para la entrada de un nombre de persona, un objeto text y un botn para el envo del dato al servidor: <html> <head> <title>Formulario de entrada del dato</title> </head> <body> <form method="post" action="pagina2.php"> Ingrese su nombre: <input type="text" name="nombre"> <br> <input type="submit" value="confirmar"> </form> </body> </html> La marca <form> y </form> nos permite definir un formulario en la pgina. La marca FORM tiene dos propiedades que debemos inicializar obligatoriamente: action y method. La propiedad action indica el nombre del archivo que recibir los datos ingresados por el operador en el formulario y que sern enviados al servidor cuando se presione el botn (submit). La propiedad method indica como se organizan esos datos para enviarlos al servidor, pudiendo ser mediante los mtodos post o get (normalmente los datos de un formulario se envian mediante el mtodo post). Para crear un cuadro de texto para el ingreso del nombre debemos definir un objeto de tipo "text" y darle un nombre: <input type="text" name="nombre">

El control "textarea" se diferencia del "text" en que permite el ingreso de muchas lneas.

Las propiedades rows y cols que dimensionan el mismo en la pantalla:


<textarea name="comentarios" rows="10" cols="40"></textarea>

Para seleccionar el tipo de operacin a efectuar disponemos dos controles de tipo radio: <input type="radio" name="radio1" value="suma">sumar<br> <input type="radio" name="radio1" value="resta">restar

Es importante notar que los dos controles tienen el MISMO nombre. Esto es necesario para que el navegador sepa que los dos controles estn relacionados controles de tipo checkbox: <input type="checkbox" name="check1">sumar <input type="checkbox" name="check2">restar

Si el checkbox no est seleccionado en el formulario no se crea una entrada en el vector asociativo $_REQUEST, para saber si existe una determinada componente en un vector

se emplea la funcin isset, si retorna true significa que existe y por lo tanto el checkbox est seleccionado. if (isset($_REQUEST['check1']))

control de tipo select. <select name="operacion"> <option value="suma">sumar</option> <option value="resta">restar</option> </select>

Cada opcin tiene un valor. El seleccionado es el que se enviar a la pgina que procesa el formulario. El texto que aparece dentro del control es el que disponemos entre las marcas option. La propiedad type nos permite definir el tipo de control y con la propiedad name indicamos el nombre del control. Por ltimo todo formulario tiene un botn de tipo submit: <input type="submit" value="confirmar">

Tambin utilizamos la marca input pero en la propiedad type indicamos que se trata de un botn de envio de datos. En la propiedad value indicamos el texto que queremos que aparezca en el botn. Ahora necesitamos una pgina con un pequeo programa en PHP que procese los datos ingresados en el formulario: <html> <head> <title>Captura de datos del form</title> </head> <body> <?php echo "El nombre ingresado es:"; echo $_REQUEST['nombre']; ?> </body> </html> Para acceder al dato en PHP se cuenta con un vector llamado $_REQUEST indicando como subndice el nombre del cuadro de texto que definimos en el formulario.

Archivos de texto Una actividad fundamental es poder registrar informacin en el servidor (no como hemos estado haciendo hasta el momento generando slo una pgina con los datos cargados). Para registrar datos en el servidor disponemos de dos herramientas que se complementan en muchos casos (archivos de texto y bases de datos). En este apartado veremos cmo crear un archivo de texto y aadir datos al mismo. Para resolver este problema plantearemos dos pginas, un formulario para realizar la carga del nombre del visitante y sus comentarios. La pgina (pagina2.php) graba los datos cargados en el formulario en un archivo. $ar=fopen("datos.txt","a") or die("Problemas en la creacion");

En primer lugar creamos o abrimos el archivo de texto "datos.txt". El segundo parmetro de la funcin fopen indica la forma de apertura de archivo: "a" (lo crea o si ya existe el archivo lo abre para aadir datos al final). "w" (crea el archivo de texto, si existe borra su contenido). "r" (abre el archivo para su lectura). Si el archivo no se puede abrir, se ejecuta la instruccin que se encuentra luego del operador "or" en nuestro caso llamamos a la funcin die que finaliza la ejecucin del programita PHP mostrando como mensaje el texto que le pasamos a dicha funcin. Para la grabacin de datos utilizamos la funcin fputs que tiene dos parmetros: la referencia al archivo donde grabamos y el string a grabar. fputs($ar,$_REQUEST['nombre']); fputs($ar,"\n"); Para el salto de lnea en el archivo de texto, usamos los caracteres \n. De esta forma cuando leamos el archivo de texto lo haremos lnea a lnea. Cuando dejamos de trabajar con el archivo llamamos a la funcin fclose. fclose($ar); Para la lectura de un archivo de texto contamos con la funcin fgets. Adems debemos abrir el archivo para lectura. $ar=fopen("datos.txt","a") or die("Problemas en la creacion"); while (!feof($ar)) { $linea=fgets($ar); $lineasalto=nl2br($linea); echo $lineasalto; } La funcin feof retorna true si se ha llegado al final del archivo en caso contrario retorna false. Para que se impriman todas las lneas del archivo se plantea una estructura repetitiva que se ejecuta mientras no se llegue al final de archivo: while (!feof($ar)) Dentro de la estructura repetitiva leemos una lnea completa del archivo de texto con la funcin fgets.

$linea=fgets($ar);

La variable $linea contiene una lnea completa del archivo de texto, inclusive el salto de lnea (\n). Como el navegador no hace un salto de lnea con este caracter, debemos convertir dicho caracter a la marca <br> propia de HTML. La funcin que realiza esta actividad se llama nl2br (new line to br) El resultado se almacena en una nueva variable que es la que realmente imprimimos: $lineasalto=nl2br($linea); echo $lineasalto;

Bases de datos (Mysql) Uno de los empleos principales de PHP es el acceso a una base de datos en el servidor. Las operaciones bsicas se hacen empleando como lenguaje el SQL. PHP implementa distintas funciones segn la base de datos a emplear. Existen funciones actualmente para acceder a las siguientes servidores de bases de datos: - MySQL, Microsoft SQL Server, Oracle, PostgreSQL, SysBase, FrontBase, Informix, InterBase, Ingres, mSQL, dBase, SQLlite El ms empleado en la actualidad en la web es el gestor de base de datos MySQL Se ha creado una base de datos llamada phpfacil. Tambin he creado una tabla llamada: alumnos. La estructura de la misma es: CREATE TABLE alumnos ( codigo int(11) NOT NULL auto_increment, nombre varchar(40) default NULL, mail varchar(50) default NULL, codigocurso int(11) default NULL, PRIMARY KEY (`codigo`) ) Agregar registros. Para aadir datos en la tabla empleamos el comando SQL llamado insert. Veremos como realizar la registracin de los datos cargados en el formulario, en la tabla alumnos de la base de datos phpfacil: <?php $nombre=$_REQUEST[nombre]; $mail=$_REQUEST[mail]; $codigocurso=$_REQUEST[codigocurso]; $conexion=mysql_connect("localhost","root","z80") or die("Problemas en la conexion"); mysql_select_db("phpfacil",$conexion) or die("Problemas en la seleccion de la base de datos"); mysql_query("insert into alumnos(nombre,mail,codigocurso) values($nombre,$mail,$codigocurso), $conexion) or die("Problemas en el select".mysql_error()); mysql_close($conexion); echo "El alumno fue dado de alta."; ?> La funcin mysql_connect se conecta a una base de datos de tipo MySql.

$conexion=mysql_connect("localhost","root","z80") or die("Problemas en la conexion");

El primer parmetro es la direccin donde se encuentra el gestor de base de El segundo parmetro es el nombre de usuario de la base de datos Y por ltimo la clave del usuario En caso de hacer algn error en la llamada a la funcin la misma retorna false por lo que se ejecuta la instruccin seguida del operador or Paso seguido se selecciona una base de datos: mysql_select_db("phpfacil",$conexion) or die("Problemas en la seleccion de la base de datos");

A esta funcin le indicamos como primer parmetro el nombre de la base de datos con la que trabajaremos y como segundo parmetro la referencia que retorn la funcin mysql_connect. El paso ms importante es la codificacin del comando SQL insert: mysql_query("insert into alumnos(nombre,mail,codigocurso) values($nombre,$mail,$codigocurso), $conexion) or die("Problemas en el select".mysql_error());

La sintaxis del comando insert es bastante sencilla: Indicamos el nombre de la tabla y los campos de la tabla a cargar. insert into alumnos(nombre,mail,codigocurso)

Luego debemos indicar en el mismo orden los valores a cargar en cada campo (dichos valores los rescatamos del formulario anterior). values($nombre,$mail,$codigocurso)

Los campos de tipo varchar SQL requiere que encerremos entre comillas simples, esto sucede para el nombre y el mail; en cambio, para el codigocurso esto no debe ser as ya que se trata de un entero. En caso que MySql detecte un error, retorna false esta funcin, por lo que se ejecuta la instruccin posterior al or, es decir la funcin die que mostrar el error generado por MySql llamando a la funcin mysql_error(). Por ltimo cerramos la conexion con la base de datos y mostramos un mensaje indicando que la carga se efectu en forma correcta. mysql_close($conexion); echo "El alumno fue dado de alta.";

Listado(Seleccin de registros). Ahora veremos como recuperar los datos almacenados en la tabla alumnos de la base de datos phpfacil. El comando SQL que nos permite recuperar datos de tablas se llama SELECT. Indicamos los campos a rescatar de la tabla y luego de la palabra clave from indicamos el nombre de la tabla: $registros=mysql_query("select codigo,nombre, mail, codigocurso from alumnos",$conexion) or die("Problemas en el select:".mysql_error());

En caso de haber codificado incorrectamente, retorna false por lo que se ejecuta el comando siguiente al operador or. Si el comando SQL es correcto, en la variable $registros se almacena una referencia a los datos rescatados de la tabla alumnos. Ahora debemos ir mostrando registro a registro los datos extraidos: Para rescatar registro a registro los datos obtenidos por el select debemos llamar a la funcin mysql_fetch_array. Esta funcin retorna un vector asociativo con los datos del registro rescatado, o false en caso de no haber ms registros. Es decir que si retorna un registro se almacena en el vector $reg y la condicin del while se valida como verdadero y pasa a ejecutarse el bloque del while: while ($reg=mysql_fetch_array($registros)) { echo "Codigo:".$reg['codigo']."<br>"; echo "Nombre:".$reg['nombre']."<br>"; echo "Mail:".$reg['mail']."<br>"; echo "Curso:"; switch ($reg['codigocurso']) { case 1:echo "PHP"; break; case 2:echo "ASP"; break; case 3:echo "JSP"; break; } echo "<br>"; echo "<hr>"; }

El bloque del while muestra el contenido del registro rescatado por la funcin mysql_fetch_array. Para rescatar cada campo accedemos mediante el vector asociativo $reg indicando como subndice un campo indicado en el select:$reg['codigo'] Cada vez que llamamos a la funcin mysql_fetch_array nos retorna el siguiente registro. Cuando debemos mostrar el curso mediante la instruccin switch, analizamos si tiene un 1,2 3 y procedemos a mostrar el nombre del curso. Para separar cada alumno en la pgina HTML llamamos disponemos la marca "<hr>"

Consulta (Seleccin de registros de una tabla). El proceso de consulta de datos de una tabla es similar al del listado, la diferencia es que se muestra slo aquel que cumple la condicin por la que buscamos. Tengamos en cuenta que si el campo es nico, solo podr mostrar uno o ningn registro, sin embargo si es un campo que puede ser repetido, nuestra consulta puede ser de ms de un registro Tenemos el archivo "*.php" que se encarga de buscar el mail ingresado en el formulario: <?php $conexion=mysql_connect("localhost","root","z80") or die("Problemas en la conexion"); mysql_select_db("phpfacil",$conexion) or die("Problemas en la seleccin de la base de datos"); $registros=mysql_query("select codigo,nombre, codigocurso from alumnos where mail='$_REQUEST[mail]'",$conexion) or die("Problemas en el select:".mysql_error()); if ($reg=mysql_fetch_array($registros)) { echo "Nombre:".$reg['nombre']."<br>"; echo "Curso:"; switch ($reg['codigocurso']) { case 1:echo "PHP"; break; case 2:echo "ASP"; break; case 3:echo "JSP"; break; } } else { echo "No existe un alumno con ese mail."; } mysql_close($conexion); ?> Lo ms importante est en el comando select: $registros=mysql_query("select codigo,nombre, codigocurso from alumnos where mail='$_REQUEST[mail]'",$conexion) or die("Problemas en el select:".mysql_error());

Ac es donde con la clausula where seleccionamos slo el registro que cumple con la condicin que el mail sea igual al que ingresamos. Como slo puede haber un registro que cumpla la condicin, llamamos a la funcin mysql_fetch_array en un if: if ($reg=mysql_fetch_array($registros))

En caso de retornar un vector asociativo la condicin del if se verifica como verdadera y pasa a mostrar los datos, en caso de retornar false se ejecuta el else.

DELETE (Baja de un registro) El objetivo de este punto es el borrado de un registro de una tabla. Para ello, implementaremos un algoritmo que solicite ingresar el mail de un alumno y posteriormente efectu su borrado. Tenemos el archivo "pagina2.php" que se encarga de buscar el mail ingresado en el formulario y en caso que exista se procede a borrarlo: <?php $conexion=mysql_connect("localhost","root","z80") or die("Problemas en la conexion"); mysql_select_db("phpfacil",$conexion) or die("Problemas en la seleccin de la base de datos"); $registros=mysql_query("select codigo from alumnos where mail='$_REQUEST[mail]'",$conexion) or die("Problemas en el select:".mysql_error()); if ($reg=mysql_fetch_array($registros)) { mysql_query("delete from alumnos where mail='$_REQUEST[mail]'", $conexion) or die("Problemas en el select:".mysql_error()); echo "Se efectu el borrado del alumno con dicho mail."; } else { echo "No existe un alumno con ese mail."; } mysql_close($conexion); ?>

En esta pgina efectuamos dos llamadas a la funcin mysql_query, una para consultar si existe el mail ingresado y otra para efectuar el borrado del registro respectivo. Para borrar todos los registros de una tabla debemos llamar al comando delete de SQL sin disponer la clusula where: mysql_query("delete from alumnos",$conexion) or die("Problemas en el select:".mysql_error());

UPDATE (Modificacion de un registro en la tabla) De las actividades con tablas esta es la ms larga. Vamos a resolverlo implementando tres pginas, la primera un formulario de consulta del mail de un alumno (formulario html), la segunda otro formulario que nos permita cargar su mail modificado y la ltima registrar el cambio en la tabla. La segunda pgina es la ms interesante y con conceptos nuevos: <?php $conexion=mysql_connect("localhost","root","z80") or die("Problemas en la conexion"); mysql_select_db("phpfacil",$conexion) or die("Problemas en la seleccin de la base de datos");

$registros=mysql_query("select * from alumnos where mail='$_REQUEST[mail]'",$conexion) or die("Problemas en el select:".mysql_error()); if ($reg=mysql_fetch_array($registros)) { ?> <form action="pagina3.php" method="post"> Ingrese nuevo mail: <input type="text" name="mailnuevo" value="<?php echo $reg['mail'] ?>"> <br> <input type="hidden" name="mailviejo" value=" <?php echo $reg['mail'] ?>"> <input type="submit" value="Modificar"> </form> <?php } else echo "No existe alumno con dicho mail"; ?> Lo primero que podemos observar es que si el if se verifica verdadero se ejecuta un bloque que contiene cdigo HTML. Es decir que podemos disponer bloques de PHP dispersos dentro de la pgina. Otro concepto importante es como enviar el mail del primer formulario a la tercer pgina, esto se logra con los controles de tipo "hidden", este tipo de control no se visualiza en el formulario pero se enva al presionar el botn submit. Si queremos que el control text se inicialize con el mail ingresado en el formulario anterior debemos cargar la propiedad value con dicho valor: <input type="text" name="mailnuevo" value="<?php echo $reg['mail'] ?>">

Por ltimo la pagina3.php es la que efecta la modificacin de la tabla propiamente dicha. Con el mail ingresado en la pagina1.php, el mail modificado en la pagina2.php se efecta el update: <?php $conexion=mysql_connect("localhost","root","z80") or die("Problemas en la conexion"); mysql_select_db("phpfacil",$conexion) or die("Problemas en la seleccin de la base de datos"); $registros=mysql_query("update alumnos set mail='$_REQUEST[mailnuevo]' where mail='$_REQUEST[mailviejo]'",$conexion) or die("Problemas en el select:".mysql_error()); echo "El mail fue modificado con exito"; ?> Tengamos en cuenta que el segundo formulario nos enva dos datos: $_REQUEST[mailnuevo] y $_REQUEST[mailviejo].

INSERT (insertar registro y consultar otra tabla) Ahora vamos a ver como resolver el problema del alta de un alumno seleccionando el curso de la tabla "cursos". Es decir, el formulario de carga de datos no es HTML puro ya que debemos cargar el control "select" con los datos de la tabla cursos. El cdigo por lo tanto queda de la siguiente forma:
<html> <head> <title>Problema</title> </head> <body> <form action="pagina2.php" method="post"> Ingrese nombre: <input type="text" name="nombre"><br> Ingrese mail: <input type="text" name="mail"><br> Seleccione el curso: <select name="codigocurso"> <?php $conexion=mysql_connect("localhost","root","z80") or die("Problemas en la conexion"); mysql_select_db("phpfacil",$conexion) or die("Problemas en la seleccin de la base de datos"); $registros=mysql_query("select codigo,nombrecur from cursos",$conexion) or die("Problemas en el select:".mysql_error()); while ($reg=mysql_fetch_array($registros)) { echo "<option value=\"$reg[codigo]\">$reg[nombrecur]</option>"; } ?> </select> <br> <input type="submit" value="Registrar"> </form> </body> </html>

El algoritmo es similar a cuando trabajamos con una tabla, pero el control "select" lo cargamos con los datos de la tabla "cursos":
while ($reg=mysql_fetch_array($registros)) { echo "<option value=\"$reg[codigo]\">$reg[nombrecur]</option>"; }

Dentro del while generamos todas las opciones que contiene el "select" imprimiendo el campo nombrecur y asociando el campo codigo a la propiedad value(que es en definitiva el cdigo que necesitamos rescatar en la otra pgina) La pgina que efecta el insert es exactamente la misma que vimos anteriormente:
<html> <head> <title>Problema</title> </head>

<body> <?php $conexion=mysql_connect("localhost","root","z80") or die("Problemas en la conexion"); mysql_select_db("phpfacil",$conexion) or die("Problemas en la seleccion de la base de datos"); mysql_query("insert into alumnos(nombre,mail,codigocurso) values ('$_REQUEST[nombre]', '$_REQUEST[mail]', $_REQUEST[codigocurso])", $conexion) or die("Problemas en el select".mysql_error()); mysql_close($conexion); echo "El alumno fue dado de alta."; ?> </body> </html>

Listado (Seleccin de registros de varias tablas) Ahora veremos como imprimir todos los alumnos inscriptos a los cursos junto al nombre del curso donde est inscripto. Los datos se encuentran en las tablas "alumnos" y "cursos". Debemos aparear el cdigo de curso de la tabla "alumnos" con el cdigo de la tabla "cursos". El cdigo del programa que hace esto es el siguiente:
<html> <head> <title>Problema</title> </head> <body> <?php $conexion=mysql_connect("localhost","root","z80") or die("Problemas en la conexion"); mysql_select_db("phpfacil",$conexion) or die("Problemas en la seleccin de la base de datos"); $registros=mysql_query("select alu.codigo as codigo,nombre,mail,codigocurso, nombrecur from alumnos as alu inner join cursos as cur on cur.codigo=alu.codigocurso", $conexion) or die("Problemas en el select:".mysql_error()); while ($reg=mysql_fetch_array($registros)) { echo "Codigo:".$reg['codigo']."<br>"; echo "Nombre:".$reg['nombre']."<br>"; echo "Mail:".$reg['mail']."<br>"; echo "Curso:".$reg['nombrecur']."<br>"; echo "<hr>"; } mysql_close($conexion); ?> </body> </html>

Hay varias cosas nuevas cuya sintaxis necesitamos analizar, la primera es como hacer el apareo con la tabla cursos:

inner join cursos as cur on cur.codigo=alu.codigocurso",

Luego de las palabras claves inner join, indicamos la tabla que necesitamos aparear, podemos crear un alias de una palabra mediante la palabra clave as. En el resto de la consulta, en vez de indicar el nombre de la tabla, hacemos referencia al alias(generalmente un nombre ms corto). Seguidamente de la palabra clave on, indicamos los campos por los que apareamos las tablas, en nuestro caso el codigo de la tabla cursos con el codigocur de la tabla alumnos. Otro punto a tener en cuenta es indicar en el select qu campos debemos rescatar de las tablas, es decir, indicarle a qu tabla pertenece en el caso que tengan el mismo nombre:
$registros=mysql_query("select alu.codigo as codigo,nombre,mail,codigocurso, nombrecur from alumnos as alu

En este caso rescatamos el cdigo del alumno (y no el cdigo de curso). Debemos crear un alias si dos tablas tienen el mismo nombre de campo para evitar confusin; como ocurre aqu con el campo codigo de las tablas alumnos y cursos. Tambin creamos un alias para la tabla alumnos. Cuando rescatamos los datos y los mostramos en la pgina, hacemos referencia al alias del campo:
while ($reg=mysql_fetch_array($registros)) { echo "Codigo:".$reg['codigo']."<br>"; echo "Nombre:".$reg['nombre']."<br>"; echo "Mail:".$reg['mail']."<br>"; echo "Curso:".$reg['nombrecur']."<br>"; echo "<hr>"; }

Funcin COUNT de SQL Cuando necesitamos saber la cantidad de registros que cumplen una condicin podemos utilizar la funcin count, por ejemplo si deseamos conocer la cantidad de alumnos que hay en la tabla "alumnos" la codificacin ser la siguiente: <?php $conexion=mysql_connect("localhost","root","z80") or die("Problemas en la conexion"); mysql_select_db("phpfacil",$conexion) or die("Problemas en la seleccin de la base de datos"); $registros=mysql_query("select count(*) as cantidad from alumnos",$conexion) or die("Problemas en el select:".mysql_error()); $reg=mysql_fetch_array($registros); echo "La cantidad de alumnos inscriptos son :".$reg['cantidad']; ?> En la sentencia select en vez de indicar los campos de la tabla, colocamos la llamada a la funcin count pasando como parmetro un asterisco y creando un alias para su posterior recuperacin e impresin del dato: $registros=mysql_query("select count(*) as cantidad from alumnos",$conexion)

El select no tiene clusula where ya que debemos contar todos los alumnos y no los de algn curso en particular. La llamada a la funcin mysql_fetch_array se hace sin estructura condicional o repetitiva ya que sabemos que nos retornar un nico registro (en realidad, un registro que tiene una sola columna llamada cantidad, en caso de estar vaca la tabla alumnos, se almacena cero en el alias cantidad): $reg=mysql_fetch_array($registros);

Clausula GROUP BY de SQL: Entre las muchas posibilidades que nos brinda SQL, una es agrupar registros y obtener informacin resumida de tablas. En nuestro problema, un listado interesante sera mostrar la cantidad de alumnos inscriptos por curso. Para resolver de una manera sencilla esta situacin, SQL nos permite agrupar los registros de la tabla "alumnos" por la columna "codigocurso" y contar la cantidad de registros que hay por cada cdigo de curso igual. El programa que nos permite resolver este problema es el siguiente: <?php $conexion=mysql_connect("localhost","root","z80") or die("Problemas en la conexion"); mysql_select_db("phpfacil",$conexion) or die("Problemas en la seleccin de la base de datos"); $registros=mysql_query("select count(alu.codigo) as cantidad, nombrecur from alumnos as alu inner join cursos as cur on cur.codigo=alu.codigocurso group by alu.codigocurso", $conexion) or die("Problemas en el select:".mysql_error()); while ($reg=mysql_fetch_array($registros)) { echo "Nombre del curso:".$reg['nombrecur']."<br>"; echo "Cantidad de inscriptos:".$reg['cantidad']."<br>"; echo "<hr>"; } mysql_close($conexion); ?> Hay varias partes importantes en este cdigo; primero, en el select indicamos que cuente la cantidad de registros de la tabla "alumnos": "select count(alu.codigo) as cantidad, nombrecur from alumnos as alu

Pero, como veremos ms adelante, en 'cantidad' no se almacena la cantidad total de registros de la tabla "alumnos" debido a que ms adelante empleamos la clusula group by. Como necesitamos rescatar el nombre del curso hacemos el apareo con la tabla "cursos": inner join cursos as cur on cur.codigo=alu.codigocurso

Por ltimo en la sentencia select de SQL disponemos la clusula group by: group by alu.codigocurso"

Con esta clusula se hace un corte de control por cada grupo de registros que tienen el mismo cdigo de curso almacenado. Luego mostramos el nombre de curso con la cantidad de inscriptos para dicho curso: while ($reg=mysql_fetch_array($registros)) { echo "Nombre del curso:".$reg['nombrecur']."<br>"; echo "Cantidad de inscriptos:".$reg['cantidad']."<br>"; echo "<hr>"; }

Paginacin En situaciones en las cuales una consulta retorna muy muchos datos, en vez de enviarlos todos al navegador, se puede enviar un conjunto limitado de registros. Luego, mediante hipervnculos, ver el resto de datos. Por ejemplo, cuando hacemos bsquedas con el servidor google, generalmente no nos retorna todas las direcciones donde se encuentran los resultados buscados, nos retorna pginas con 10 enlaces por pgina (pensemos el tiempo de transferencia si nos retornara 1.000.000 de enlaces). Bueno, ahora resolvamos con el lenguaje PHP este problema de paginacin: <?php if (isset($_REQUEST['pos'])) $inicio=$_REQUEST['pos']; else $inicio=0; ?> <html> <head> <title>Problema</title> </head> <body> <?php $conexion=mysql_connect("localhost","root","z80") or die ("Problemas en la conexion"); mysql_select_db("phpfacil",$conexion) or die("Problemas en la seleccin de la base de datos"); $registros=mysql_query("select alu.codigo as codigo,nombre,mail,codigocurso, nombrecur from alumnos as alu inner join cursos as cur on cur.codigo=alu.codigocurso limit $inicio,2", $conexion) or die("Problemas en el select:".mysql_error()); $impresos=0; while ($reg=mysql_fetch_array($registros)) { $impresos++; echo "Codigo:".$reg['codigo']."<br>";

echo "Nombre:".$reg['nombre']."<br>"; echo "Mail:".$reg['mail']."<br>"; echo "Curso:".$reg['nombrecur']."<br>"; echo "<hr>"; } mysql_close($conexion); if ($inicio==0) echo "anteriores "; else { $anterior=$inicio-2; echo "<a href=\"pagina1.php?pos=$anterior\">Anteriores </a>"; } if ($impresos==2) { $proximo=$inicio+2; echo "<a href=\"pagina1.php?pos=$proximo\">Siguientes</a>"; } else echo "siguientes"; ?> </body> </html> Hay muchas cosas importantes en este ejemplo, lo primero que vemos es el bloque que rescata a partir de qu registro ir mostrando: if (isset($_REQUEST['pos'])) $inicio=$_REQUEST['pos']; else $inicio=0; La funcin isset retorna verdadero si existe la variable que le pasamos como parmetro, en este caso le estamos pasando la componente pos del vector asociativo $_REQUEST. Cuando llamamos por primera vez a esta pgina, lo hacemos : pagina1.php sin parmetros, por lo que el if se verifica como falso. Es decir la variable $inicio se carga con el valor 0.
$registros=mysql_query("select alu.codigo as codigo,nombre,mail,codigocurso, nombrecur from alumnos as alu inner join cursos as cur on cur.codigo=alu.codigocurso limit $inicio,2", $conexion) or

Seguidamente mostramos todos los registros retornados y adems los contamos:


$impresos=0; while ($reg=mysql_fetch_array($registros)) { $impresos++; echo "Codigo:".$reg['codigo']."<br>"; echo "Nombre:".$reg['nombre']."<br>"; echo "Mail:".$reg['mail']."<br>";

echo "Curso:".$reg['nombrecur']."<br>"; echo "<hr>";

Ahora vemos dnde dispondremos los hipervnculos, hacia adelante o atrs:


if ($inicio==0) echo "anteriores "; else { $anterior=$inicio-2; echo "<a href=\"pagina1.php?pos=$anterior\">Anteriores </a>"; }

Si la variable $inicio vale 0 significa que no hay registros antes de ste, por lo que slo mostramos un texto "anteriores". En caso que la variable $inicio sea distinta de 0, se ejecuta el else, donde disponemos un hipervnculo con la misma pgina e inicializando el parmetro pos con el valor de $inicio menos 2. Si el contador $impresos tiene el valor 2 significa que posiblemente hay ms registros por mostrar y debemos disponer un hipervnculo con la misma pgina pero inicializando el parmetro pos con el valor de $inicio ms 2:
if ($impresos==2) { $proximo=$inicio+2; echo "<a href=\"pagina1.php?pos=$proximo\">Siguientes</a>"; } else echo "siguientes";

You might also like