viernes, 12 de octubre de 2012

23. UPDATE (Modificación de un registro de una tabla)


De las actividades con tablas esta es la más larga. Vamos a resolverlo implementando tres páginas, la primera un formulario de consulta del mail de un alumno, la segunda otro formulario que nos permita cargar su mail modificado y la última registrará el cambio en la tabla.

El formulario de consulta del mail del alumno es similar a problemas anteriores:


<html>
<head>
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post">
Ingrese el mail del alumno:
<input type="text" name="mail"><br>
<input type="submit" value="buscar">
</form>
</body>
</html>
 
La segunda página es la más interesante y con conceptos nuevos:


<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion=mysql_connect("localhost","root","") or
  die("Problemas en la conexion");
mysql_select_db("base1",$conexion) or
  die("Problemas en la selección 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";
?>
</body>
</html> 
 
Lo primero que podemos observar es que si el if se verifica verdadero se ejecuta un bloque que contiene código HTML:


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
}
 
Es decir que podemos disponer bloques de PHP dispersos dentro de la página.

Otro concepto importante es como enviar el mail del primer formulario a la tercer página, esto se logra con los controles de tipo "hidden", este tipo de control no se visualiza en el formulario pero se envía al presionar el botón submit.

Si queremos que el control text se cargue 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 efectúa la modificación de la tabla propiamente dicha. Con el mail ingresado en la pagina1.php, el mail modificado en la pagina2.php se efectúa el update.


<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion=mysql_connect("localhost","root","") or
  die("Problemas en la conexion");
mysql_select_db("base1",$conexion) or
  die("Problemas en la selección 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";
?>
</body>
</html> 
 
Tengamos en cuenta que el segundo formulario nos envía dos datos: $_REQUEST[mailnuevo] y $_REQUEST[mailviejo].


PROBLEMA PROPUESTO

Efectuar la modificación del nombre del curso de la tabla "cursos". Para la búsqueda ingresar el código de curso.

22. DELETE (Baja de todos los registros de una tabla)


Para borrar todos los registros de una tabla debemos llamar al comando delete de SQL sin disponer la cláusula where:


<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion=mysql_connect("localhost","root","") or
  die("Problemas en la conexion");

mysql_select_db("base1",$conexion) or
  die("Problemas en la selección de la base de datos");

mysql_query("delete from alumnos",$conexion) or
  die("Problemas en el select:".mysql_error());
echo "Se efectuó el borrado de todos los alumnos.";
mysql_close($conexion);
?>
</body>
</html> 
 
 
PROBLEMA PROPUESTO 

Efectuar el borrado de todos los registros de la tabla cursos.
 

21. DELETE (Baja de un registro en una tabla)


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 efectúe su borrado.

La primera página es idéntica a la consulta, ya que debemos implementar un formulario que solicite la carga del mail del alumno:


<html>
<head>
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post">
Ingrese el mail del alumno a borrar:
<input type="text" name="mail">
<br>
<input type="submit" value="buscar">
</form>
</body>
</html>
 
Por otro lado 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:


<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion=mysql_connect("localhost","root","") or
  die("Problemas en la conexion");

mysql_select_db("base1",$conexion) or
  die("Problemas en la selección 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);
?>
</body>
</html> 
 
En esta segunda página efectuamos dos llamadas a la función mysql_query, una para consultar si existe el mail ingresado y otra para efectuar el borrado del registro respectivo.


PROBLEMA PROPUESTO

 Confeccionar un programa que permita ingresar el nombre de un curso por teclado y posteriormente efectúe el borrado de dicho registro en la tabla cursos. Mostrar un mensaje si no existe el curso.

20. Consulta (selección 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 sólo aquel que cumple la condición por la que buscamos.

Haremos un programa que nos permita consultar los datos de un alumno ingresando su mail para su búsqueda. Tengamos en cuenta que no puede haber dos alumnos con el mismo mail, por lo que la consulta nos puede arrojar uno o ningún registro.

Debemos codificar un formulario para el ingreso del mail a consultar:


<html>
<head>
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post">
Ingrese el mail del alumno a consultar:
<input type="text" name="mail">
<br>
<input type="submit" value="buscar">
</form>
</body>
</html>
 
Por otro lado tenemos el archivo "pagina2.php" que se encarga de buscar el mail ingresado en el formulario:


<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion=mysql_connect("localhost","root","") or 
  die("Problemas en la conexion");

mysql_select_db("base1",$conexion) or
  die("Problemas en la selección 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);
?>
</body>
</html> 
 
Lo más 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 sólo el registro que cumple con la condición que el mail sea igual al que ingresamos.

Como sólo puede haber un registro que cumpla la condición, llamamos a la función mysql_fetch_array en un if:


if ($reg=mysql_fetch_array($registros))
 
En caso de retornar un vector asociativo la condición del if se verifica como verdadera y pasa a mostrar los datos, en caso de retornar false se ejecuta el else.


PROBLEMA PROPUESTO


Confeccionar un programa que permita ingresar el nombre de un alumno en un formulario, luego mostrar los datos del mismo (tener en cuenta que puede haber más de un alumno con el mismo nombre)

19. Listado (selección de registros de una tabla)


Ahora veremos como recuperar los datos almacenados en la tabla alumnos de la base de datos "base1".
El programa que muestra los registros en una página es:


<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion=mysql_connect("localhost","root","") 
  or  die("Problemas en la conexion");

mysql_select_db("base1",$conexion) 
  or  die("Problemas en la selección de la base de datos");

$registros=mysql_query("select codigo,nombre, mail, codigocurso
                       from alumnos",$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:";
  switch ($reg['codigocurso']) {
    case 1:echo "PHP";
           break;
    case 2:echo "ASP";
           break;
    case 3:echo "JSP";
           break;
  }
  echo "<br>";
  echo "<hr>";
}
mysql_close($conexion);
?>
</body>
</html> 
 
La primer parte es similar a lo visto hasta ahora, es decir nos conectamos a la base de datos y seleccionamos la base de datos base1.

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, el comando SQL select la función mysql_query retorna false, por lo que se ejecuta el comando siguiente al operador or, es decir la función die.

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 extraídos:


while ($reg=mysql_fetch_array($registros))
 
Para rescatar registro a registro los datos obtenidos por el select debemos llamar a la función mysql_fetch_array. Esta función retorna un vector asociativo con los datos del registro rescatado, o false en caso de no haber más registros. Es decir que si retorna un registro se almacena en el vector $reg y la condición del while se valida como verdadero y pasa a ejecutarse el bloque del while:


{
  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 función mysql_fetch_array. Como vemos, para rescatar cada campo accedemos mediante el vector asociativo $reg indicando como subíndice un campo indicado en el select:$reg['codigo']

Cada vez que llamamos a la función mysql_fetch_array nos retorna el siguiente registro.

Cuando debemos mostrar el curso mediante la instrucción switch, analizamos si tiene un 1,2 ó 3 y procedemos a mostrar el nombre del curso.

Para separar cada alumno en la página HTML disponemos la marca "<hr>"


PROBLEMA PROPUESTO

Confeccionar un programa que recupere los datos de la tabla cursos de la base de datos base1. Mostrar el código de curso y su nombre.

lunes, 8 de octubre de 2012

18. INSERT (Alta de registros en una tabla)


Luego de crear una base de datos y sus tablas (Vamos a trabajar co la base de datos ya creada: base1, que contiene la tabla alumnos), veremos como agregar registros.

Para añadir datos en la tabla empleamos el comando SQL llamado insert.

Necesitamos dos páginas para este proceso, una será el formulario de carga de datos y la siguiente será la que efectúe la inserción en la tabla.

Formulario de carga de datos:


<html>
<head>
<title>Problema</title>
</head>
<body>
<h1>Alta de Alumnos</h1>
<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">
<option value="1">PHP</option>
<option value="2">ASP</option>
<option value="3">JSP</option>
</select>
<br>
<input type="submit" value="Registrar">
</form>
</body>
</html>

El formulario es bastante similar a los que venimos desarrollando en puntos anteriores, tal vez lo distinto es cómo emplearemos el control "select" del curso a desarrollar:


<select name="codigocurso">
<option value="1">PHP</option>
<option value="2">ASP</option>
<option value="3">JSP</option>
</select>
 
Cada opción tiene su respectivo valor (en este caso los números 1,2 y 3) y los textos a mostrar PHP, ASP y JSP. El dato que se envía a la otra página es el código de curso (esto debido a que definimos la propiedad value).

Ahora veremos como realizar la registración de los datos cargados en el formulario, en la tabla alumnos de la base de datos base1:


<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion=mysql_connect("localhost","root","") 
  or die("Problemas en la conexion");
mysql_select_db("base1",$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>
 
Veamos los pasos para efectuar el alta en la tabla alumnos:


$conexion=mysql_connect("localhost","root","") 
  or die("Problemas en la conexion");
 
La función mysql_connect se conecta a una base de datos de tipo MySql, el primer parámetro es la dirección donde se encuentra el gestor de base de datos (en este caso en el mismo servidor por lo que indicamos esto con "localhost), el segundo parámetro es el nombre de usuario de la base de datos ("root" en nuestro caso, que es el usuario por defecto que crea MySql para el administrador) y por último la clave del usuario (por defecto cuando instalamos el WampServer se crea el usuario root con clave vacía).

En caso de hacer algún error en la llamada a la función la misma retorna false por lo que se ejecuta la instrucción seguida del operador or, en nuestro caso llamamos a la función die que detiene la ejecución del programa y muestra el mensaje por pantalla.

Paso seguido se selecciona una base de datos (ya que el gestor de base de datos puede administrar varias bases de datos):


mysql_select_db("base1",$conexion) or
  die("Problemas en la seleccion de la base de datos");
 
A esta función le indicamos como primer parámetro el nombre de la base de datos con la que trabajaremos y como segundo parámetro la referencia que retornó la función mysql_connect.

El paso más importante es la codificación del comando SQL insert:


mysql_query("insert into alumnos(nombre,mail,codigocurso) values 
   ('$_REQUEST[nombre]','$_REQUEST[mail]',$_REQUEST[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. Luego debemos indicar en el mismo orden los valores a cargar en cada campo (dichos valores los rescatamos del formulario anterior).

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í.

Otra cosa a tener en cuenta es que los subíndices de los vectores asociativos no deben ir entre simples comillas ya que se encuentran dentro de un string, sino se producirá un error.

En caso que MySql detecte un error, retorna false esta función, por lo que se ejecuta la instrucción posterior al or, es decir la función die que mostrará el error generado por MySql llamando a la función mysql_error().
Por último cerramos la conexión con la base de datos y mostramos un mensaje indicando que la carga se efectuó en forma correcta.
Tener en cuenta que el campo código se generó en forma automática.

Si queremos controlar que el insert se efectuó en forma correcta podemos ingresar al PHPMyAdmin y seleccionar la tabla "alumnos", y en la pestaña "examinar" podremos ver los datos ingresados desde la página que creamos: 

PHPMyAdmin insert en una tabla
 

PROBLEMA PROPUESTO

Crear en la base de datos "base1" otra tabla llamada "cursos".

La estructura de esta segunda tabla debe ser:


  codigo int auto_increment primery_key
  nombrecurso varchar(40)
 
Utilizar el PHPMyAdmin para la creación de esta tabla.

Implementar las dos páginas necesarias para efectuar el alta de cursos. Un formulario para ingresar el nombre del curso y otra página donde se efectuará el insert.

17. Base de datos (MySQL)


Uno de los empleos principales de PHP es el acceso a una base de datos en el servidor. Las operaciones básicas se hacen empleando como lenguaje el SQL.

PHP implementa distintas funciones según 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 más empleado en la actualidad en la web es el gestor de base de datos MySQL (debido que cuando se lo emplea sin fines de lucro se puede usar el software en forma gratuita).

Cuando instaló el WampServer en un principio para trabajar con PHP, se instaló el MySQL (recordemos que las letras que forman el WampServer son : W(Windows)A(Apache)M(MySQL)P(PHP)Server).


Para crear una base de datos el WampServer instala también un programa codificado en PHP que nos permite interactuar con el MySQL.

Este programa se llama PHPMyAdmin (como veremos nos permite crear las bases de datos, tablas, índices, usuarios etc.)

Para iniciar el PHPMyAdmin debemos presionar el botón izquierdo del mouse sobre el ícono del WampServer que se encuentra en la bandeja del sistema:

Arrancar el PHPMyAdmin

Como podemos ver la interfaz del PHPMyAdmin es un programa que se ejecuta en la web:

PHPMyAdmin


Para crear una base de datos procedemos a seleccionar la pestaña "Base de datos" e ingresamos como nombre "base1" y presionamos el botón crear:

PHPMyAdmin creación de una base de datos

Luego de crear la base de datos podemos ver que aparece en el lado izquierdo:

PHPMyAdmin creación de una base de datos

Seleccionamos el nombre nombre de la base de datos "base1" y se actualiza la interfaz de pantalla para que ingresemos el nombre de una tabla y la cantidad de campos que tendrá (crearemos una tabla llamada alumnos con 4 campos):

PHPMyAdmin creación de una tabla

La estructura de la tabla es:

  codigo int auto_increment primary key
  nombre varchar(50)
  mail varchar(70)
  codigocurso int
 
En el PHPMyAdmin ingresamos:

PHPMyAdmin creación de una tabla

Es importante también hacer notar que en el campo codigo debemos marcar en Indice el valor "primary" y tildar la columna A_I:

PHPMyAdmin creación de una tabla

Por último presionamos el botón guardar y ya tenemos la tabla "alumnos" creada en la base de datos "base1":

PHPMyAdmin creación de una tabla

La tabla almacenará datos de alumnos que desarrollarán cursos de programación en PHP, ASP y JSP.
El código del alumno es de tipo numérico (int) y al indicar que es auto_increment se generará automáticamente por el gestor de base de datos.

Los campos nombre y mail son de tipo varchar (podemos almacenar cualquier caracter) y por último el campo codigocurso representa el curso a tomar por el alumno (1=PHP, 2=ASP y 3=JSP).

El campo clave de esta tabla es el código de alumno (es decir no podemos tener dos alumnos con el mismo código, no así el nombre del alumno que puede eventualmente repetirse)

En los próximos conceptos comenzaremos a ver como desde PHP podemos comunicarnos con la base de datos "base1" y acceder a la tabla "alumnos" para ejecutar los comandos SQL más comunes como pueden ser: select, insert, delete, update etc.

lunes, 1 de octubre de 2012

16. Funciones en PHP


La sintaxis para la definición de una función en PHP es:

function [nombre de la función]([parámetros])
{
[algoritmo]
}

Implementaremos una función que muestre un mensaje centrado en patalla, y la llamaremos posteriormente dos veces:


<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
function mensajecentrado($men)
{
  echo "<table width=\"100%\" border=\"1\">";
  echo "<tr><td align=\"center\">";
  echo $men;
  echo "</tr></td>";
  echo "</table>";
}

mensajecentrado("Primer recuadro");
echo "<br>";
mensajecentrado("Segundo recuadro");
?>
</body>
</html>
 
 
Para mostrar el texto centrado en un recuadro utilizamos la marca table de HTML. Definimos las propiedades border con 1, para que sea visible y el ancho de 100% para que ocupe todo el navegador. La tabla tiene una fila a la que definimos con la marca tr (table row) y un solo dato en esa fila mediante la marca td (table data).

Para que el texto dentro de la tabla salga centrado, inicializamos la propiedad align de la marca td.

Si vemos la función, notamos que lo más trabajoso es definir todas las marcas HTML para crear la tabla. Es importante notar que en PHP para introducir las dobles comillas dentro de un string debemos anteceder el carácter ' \'; para introducir el carácter ' \' debemos escribir \\.

Las llamadas a la función las hacemos por medio de su nombre y pasamos el único parámetro que requiere:


mensajecentrado("Primer recuadro");
echo "<br>";
mensajecentrado("Segundo recuadro");
 
Las funciones nos permiten tener un programa más ordenado y facilitan la reutilización del código. Más adelante veremos como hacer archivos con rutinas comunes a muchas páginas.

Una función puede retornar un dato, supongamos que necesitamos una función que nos retorne el promedio de dos valores, el código sería:


<html>
<head>
<title>Problema</title>
</head>
<body>

<?php
function retornarpromedio($valor1,$valor2)
{
  $pro=$valor1/$valor2;
  return $pro;
}

$v1=100;
$v2=50;
$p=retornarpromedio($v1,$v2);
echo $p;
?>

</body>
</html>
 
Cuando una función retorna un dato debemos emplear la palabra clave return seguida del valor que devuelve.

En la llamada a la función el valor retornado se almacena generalmente en una variable:


$p=retornarpromedio($v1,$v2);
 
Si queremos que retorne más de un dato debemos emplear parámetros por referencia.

Supongamos que necesitamos ahora que una función nos retorne el cuadrado y cubo de un número:


<html>
<head>
<title>Problema</title>
</head>
<body>
<?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;
?>
</body>
</html>
 
Es decir, cuando le antecedemos el carácter ampersand al parámetro, es por referencia.

El objetivo es asignarle cierto valor al parámetro y posteriormente el dato quedará almacenado en la variable que le pasamos a la función.


function cuadradocubo($valor,&$cuad,&$cub)
{
  $cuad=$valor*$valor;
  $cub=$valor*$valor*$valor;
}
 
El parámetro $cuad se almacena en la variable $c1 y el parámetro $cub se almacena en $c2. Es la forma más adecuada de modificar variables dentro de una función.


PROBLEMA PROPUESTO


Confeccionar un formulario que solicite la carga del nombre de usuario y su clave en dos oportunidades. En la página que se procesan los datos del formulario implementar una función que imprima un mensaje si las dos claves ingresadas son distintas.