Noches de PHP

PHP, MySQL y otros delirios…

Un millón de gracias

<?php
/* Solamente para agradecerles por haber compartido este año de
trabajo, en el que aprendí muchísimo. */

for ($i=0;$i<1000000;$i++)
     echo "¡Muchísimas gracias!";

//Éxitos con los exámenes.
//Juan.
?>

Resultados recuperatorios + Organización finales

En un post anterior, publiqué mal la fecha de los finales. Los mismos serán el día 2 y 14 de diciembre de 2011. (Pido disculpas por la equivocación, y le agradezco a Jésica que me hizo notar el error.)
Los exámenes finales son individuales y a carpeta cerrada. Recuerden inscribirse según lo establecido por la institución.

A continuación, publico la situación de cada uno de los estudiantes al finalizar la instancia de recuperatorio.
Tienen la materia aprobada:

  • Diego
  • Francesco
  • Pablo
  • Emiliano
  • Luciano
  • Elías
  • Javier
  • Gimena
  • César
  • Cristian
  • Mariana
  • Leandro
  • Juan Carlos
  • Eliana
  • Alexis
  • Luis
  • Melina

Rinden el final, solamente con los temas del primer cuatrimestre (válido sólo para el turno diciembre 2011):

  • Matías
  • Jésica

Rinden el final, solamente con los temas del segundo cuatrimestre (válido sólo para el turno diciembre 2011):

  • Juan Pablo M.
  • Juan Pablo H.

El resto de los estudiantes debe rendir el final completo.

Resultados del parcial

Les comunico los resultados de lo evaluado el día martes pasado.
Algunos estudiantes ya tienen aprobada la materia. Ellos son:

  • Diego
  • Francesco
  • Pablo
  • Emiliano
  • Javier
  • Cristian
  • Mariana
  • Leandro
  • Juan Carlos
  • Alexis
  • Luis
  • Melina
  • Eliana
  • Elías

Otros estudiantes, deben recuperar uno u otro contenido, lo que se detalla en la siguiente tabla. (“A” significa aprobado; “NA” significa “No Aprobado”; “P” significa “Pendiente”).

1er cuat Funciones SQL SQL+PHP TP Defensa TP
Matías NA A A A P P
Luciano A NA NA A P P
Gimena A A A A P P
César A NA A A P P
Jésica NA A A NA A P
Juan Pablo H A NA A A A A
Joan NA NA A A A A
Los que tienen “NA” en Funciones, SQL y/o SQL+PHP, pueden recuperar el viernes 18/11 a las 20hs. Lo mismo vale para quienes no pudieron asistir al parcial del martes.
Los estudiantes que no asistieron el martes, no figuran en esta lista. Ante cualquier duda, consúltenme por mail.
Mañana viernes a las 20, estaré en la escuela para devolver los parciales, y atender consultas.

[Recreo] Juego en PHP+MySQL

Fuera de toda obligación académica, los invito a curiosear un juego que programamos mi cuñado y yo.
Los lenguajes utilizados son los que ustedes conocen: HTML, CSS, javascript, PHP y MySQL.
La idea es que lo jueguen ayudándose con un buscador para resolver las pistas.
El juego se llama “¿Dónde está Pancracio el zorro?“, y está disponible en http://elzorropancracio.com (Si usan Chrome o Firefox, mejor).
El programa tiene licencia libre, así que el código fuente está disponible en la misma página. (Lo hicimos medio a los apurones; chiflen si encuentran algún bug).
Juego en PHP
Calculo que el año que viene le haremos algunas mejoras. Si alguien tiene ganas de donar su tiempo y talento para mejorar este juego, nos vendría muy bien. Comuníquense por mail.

Entrega del TP, parciales y finales

Algunos compañeros tenían dudas acerca del enunciado del TP, intentaré explicar un poco más cada uno de los puntos.

  • Punto 9: Se nos pide un ABM de una de las tablas. Ejemplos: Alta, Baja, Baja y modificación (Ver en funcionamiento)
  • Punto 10: Se nos pide una consulta con intervención del usuario, en la que intervenga más de una tabla. Ejemplo (ver en funcionamiento).
  • Punto 11: Una consulta a más de una tabla, sin intervención del usuario. Ejemplo
  • Punto 12: Se nos piden 2 informes. Un informe es una consulta que resume información (count, sum, avg, etc.). Ejemplo.
  • Los cuatro puntos anteriores se refieren al diseño (la planificación, junto a la correspondiente explicación de por qué sería útil). El punto 13 consiste en presentar el código fuente de los puntos anteriores.

Fechas para tener en cuenta

  • Viernes 28/10: No hay actividad por el acto de colación de 3er año.
  • Lunes 31/10; martes 01/11; viernes 04/11: Clases de consulta para el TP y/o para el parcial. Concertar previamente por mail.
  • Lunes 07/11, 20hs.: Entrega del TP completo.
  • Martes 08/11, 20hs: 2º Parcial. Defensa del TP.
  • Viernes 18/11, 20hs: Recuperatorio Parcial. Defensa del TP.
  • Miércoles 30/11:Viernes 02/12: Final.
  • Martes 13/12:Miércoles 14/12: Final.

Informes

Veremos ahora cómo hacer un “informe” (es decir, una consulta que muestra información resumida) en php. En nuestro caso será una lista de los equipos con la cantidad de etapas ganadas por cada uno de ellos.
En este caso, no es demasiado difícil el programa; lo difícil es hacer la consulta.
La misma será:

SELECT nomequipo, count(ganador) 
FROM ciclista, etapa
WHERE ganador=dorsal 
GROUP BY nomequipo
ORDER BY count(ganador) DESC

El primer renglón nos indica los campos que tendrá la consulta: el nombre del equipo y la cantidad de etapas ganadas.
El segundo renglón, nos indica cuáles son las tablas que intervienen.
El tercer renglón, nos indica el campo por el cual se relacionan las tablas.
El cuarto renglón, indica cómo estará agrupada la función count: no contará a todos los ganadores, sino que contará agrupándolos por equipo.
El último renglón nos indica que la consulta se verá ordenada según la cantidad de etapas ganadas, de mayor a menor.

Una vez probada la consulta, el programa en php no presenta mayores dificultades:

<?php
require('conexion.php');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Informe: Etapas ganadas por equipo</title>
</head>
<body>
<h1>Etapas ganadas por equipo</h1>
<!-- Mostraremos los resultados en una tabla, así que armamos el encabezado -->
<table><tr><th>Equipo</th><th>Etapas ganadas</th></tr>
<?php
//Nos conectamos a la BD (la función está en el archivo requerido "conexion.php").
$con=conectar();

//Escribimos la cadena de consulta:
$sql="select nomequipo, count(ganador) from ciclista, etapa where ganador=dorsal group by nomequipo order by count(ganador) DESC";

//Hacemos la consulta:
$result=mysql_query($sql);

while($fila=mysql_fetch_array($result)) {
  //Mostramos los datos en un renglón de la tabla:
  echo '<tr><td>'.$fila['nomequipo'].'</td><td>'.$fila['count(ganador)'].'</td></tr>';
}

//Cerramos la conexión:
mysql_close($con);
?>
</table>
</body>
</html>

Si todo salió bien, deberíamos obtener un resultado parecido a este:
Vista previa
El archivo conexion.php es el mismo que en los ejercicios anteriores:

<?php
function conectar() {
  $conexion = mysql_connect("SERVIDOR", "USUARIO", "CONTRASEÑA") or die ("Error al conectar al servidor");
  mysql_select_db("NOMBRE_DE_LA_BD") or die ("Error al conectar a la BD");
  return $conexion;
}
?>

Consulta a dos tablas, con intervención del usuario

Nos proponemos, al igual que en el ejercicio anterior, hacer una consulta, pero en este caso, el usuario podrá intervenir, eligiendo qué campos querrá ver en la consulta.
Para ver el ejercicio en funcionamiento, hagan clic aquí.
En primer lugar hacemos un simple formulario html para que el usuario elija los campos:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Lista de ciclistas</title>
</head>
<body>
<h1>Lista de ciclistas</h1>
<!-- Hacemos el formulario en el que el usuario elegirá los campos de la consulta -->
<h3>Elija los campos que desea ver en la consulta:</h3>
<form action="consulta2.php" method="post">
<ul>
<li><input type="checkbox" name="dorsal">Dorsal</li>
<li><input type="checkbox" name="nombre">Nombre</li>
<li><input type="checkbox" name="edad">Edad</li>
<li><input type="checkbox" name="nomequipo">Nombre del equipo</li>
<li><input type="checkbox" name="director">Director</li>
</ul>
<input type="submit" value="Ver datos">
</form>
<!-- Deberíamos validar por javascript que se elija al menos un campo. Se omite. -->
</body>
</html>

Ahora, vemos el archivo que realiza y muestra la consulta. Las explicaciones están como comentarios:
Archivo “consulta2.php”

<?php
require('conexion.php');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Lista de ciclistas</title>
</head>
<body>
<h1>Lista de ciclistas</h1>
<!-- Mostraremos los resultados en una tabla, así que armamos el encabezado de la misma -->
<table>
<tr>
<?php
$cantcampos=0;
$tablaciclista=$tablaequipo=false;
//Según lo que haya elegido el usuario, se arma la variable $campos:
//Si $_POST['dorsal'] está definido:
if (isset($_POST['dorsal'])) {
	$campos='c.dorsal';
	//Muestro la celda de encabezado de la tabla.
	echo '<th>Dorsal</th>';
	//Indico que la tabla "ciclista", participa de la consulta.
	$tablaciclista=true;
	//Incremento el contador de campos
	$cantcampos++;
}
//Si $_POST['dorsal'] está definido:
if (isset($_POST['nombre'])) {
//Si *no* es el primer campo...
	if($cantcampos) {
		$campos.=',c.nombre';
	}
//En cambio, si se trata del 1er campo:	
	else {
		$campos='c.nombre';
		$tablaciclista=true;
	}
	echo '<th>Nombre</th>';
	$cantcampos++;
}
// (Los que siguen son todos parecidos)
if (isset($_POST['edad'])) {
	if($cantcampos) {
		$campos.=',c.edad';
	}	
	else {
		$campos='c.edad';
		$tablaciclista=true;
	}
	echo '<th>Edad</th>';
	$cantcampos++;
}

if (isset($_POST['director'])) {
	if($cantcampos) {
		$campos.=',e.director';
	}	
	else {
		$campos='e.director';
	}
	$tablaequipo=true;
	echo '<th>Director</th>';
	$cantcampos++;
}
if (isset($_POST['nomequipo'])) {
	if(!$cantcampos) {
		$campos='e.nomequipo';
		$tablaequipo=true;
	}	
	elseif(!$tablaequipo) {
		$campos.=',c.nomequipo';
	}
	else {
		$campos.=',e.nomequipo';
	}
	echo '<th>Equipo</th>';
	$cantcampos++;
}
echo '</tr>';

// Si $cantcampos es 0, quiere decir que el usuario no eligió ningún campo:
if(!$cantcampos) die('Error: Hay que elegir al menos un campo.');

//Se arma la parte de la consulta que va después del FROM
if ($tablaequipo && $tablaciclista) {
	$tablas='equipo e, ciclista c where e.nomequipo=c.nomequipo';
}
elseif ($tablaequipo) {
	$tablas='equipo e';
}
else {
	$tablas='ciclista c';
}

//Finalmente, la consulta queda:
$sql="SELECT $campos from $tablas";

// PARA PROBAR, descomentar la siguiente línea:
// echo $sql;  

//Nos conectamos a la BD (la función está en el archivo requerido "conexion.php".
$con=conectar();

//Hacemos la consulta:
$result=mysql_query($sql);

/*mysql_fetch_row es igual que mysql_fetch_array, pero devuelve un array únicamente indexado, es decir, que solo puede ser referenciado por número (ej: $fila[0]), pero no por nombre (ej: $fila['dorsal']): */
while($fila=mysql_fetch_row($result)) {
  //Mostramos los datos en un renglón de la tabla:
  echo '<tr>';
  foreach ($fila as $valor) echo "<td>$valor</td>";
  echo '</tr>';
}
//Cerramos la conexión:
mysql_close($con);
?>
</table>
</body>
</html>

El código anterior requiere el archivo “conexión.php”, cuyo código es:
Archivo conexion.php

<?php
function conectar() {
  $conexion = mysql_connect("SERVIDOR", "USUARIO", "CONTRASEÑA") or die ("Error al conectar al servidor");
  mysql_select_db("NOMBRE_DE_LA_BD") or die ("Error al conectar a la BD");
  return $conexion;
}
?>

Resultados del TP + Sin actividad el viernes

Están corregidos los TP de SQL que hicieron el lunes.
Les dejo el ejercicio resuelto.
Todos los que hicieron el TP resultaron aprobados. Felicitaciones.

Este viernes 21/10 no habrá actividad, porque la escuela va a ser aprontada para el acto eleccionario del domingo. Nos reencontramos el lunes 24/10, les pido que, de ser posible hagan los ejercicios propuestos en los últimos post, para poder consultar dudas.

Solución del ejercicio anterior

Les dejo una posible solución al ejercicio anterior.
Archivo “modificar.php”

<?php
require('conexion.php');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Modificar ciclista</title>
</head>
<body>
<h1>Modificar ciclista</h1>
<?php
$con=conectar();
$id=$_GET['id'];
//Guardamos en una variable nuestra cadena de consulta
$sql = "SELECT * FROM ciclista where dorsal=$id";
//Hacemos la consulta:
$result=mysql_query($sql);
/*Se usa un if, y no un while, porque la consulta devuelve un solo registro */
if($fila=mysql_fetch_array($result)) {
  echo "<form action='modificar2.php' method='post'>";
  echo "<input type='hidden' name='dorsal' value=".$fila['dorsal'].'>Dorsal: '.$fila['dorsal'];
  echo "<br>Nombre:<input type='text' name='nombre' value='".$fila['nombre']."'>";
  echo "<br>Edad:<input type='text' name='edad' value=".$fila['edad'].'>';
  echo "<br>Equipo:<input type='text' name='nomequipo' value='".$fila['nomequipo']."'>";
  echo "<br><input type='submit' value='Modificar'></form>";
} else {
  echo '<h1>Error en la consulta</h1>';
}
//Cerramos la conexión:
mysql_close($con);
?>
</body>
</html>

Archivo “modificar2.php”

<?php
require('conexion.php');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Modificar ciclista</title>
</head>
<body>
<h1>Modificar ciclista</h1>
<?php
$con=conectar();
//Guardamos en una variable nuestra cadena de consulta
$sql = "UPDATE ciclista SET nombre='".$_POST['nombre']."',edad=".$_POST['edad'].",nomequipo='".$_POST['nomequipo']."' where dorsal=".$_POST['dorsal'];
//Hacemos la consulta:
if(mysql_query($sql)) {
  echo '<h1>Datos modificados</h1>';
} else {
  echo '<h1>Error al modificar</h1>';
}
//Cerramos la conexión:
mysql_close($con);
?>
</body>
</html>

Baja y modificación a una tabla desde php

Vuelvo a copiar el código visto en la clase del viernes, con dos pequeñas modificaciones:

  • la función de conexión a la BD está en un archivo aparte.
  • una pequeña modificación en las líneas destacadas. Más abajo dejo la explicación.

Archivo “conexion.php”

<?php
function conectar() {
$conexion = mysql_connect("servidor","usuario","contras") or die("¡No se ha podido establecer la conexión con el servidor!");
mysql_select_db("NOMBRE_DE_LA_BD",$conexion) or die("¡No se ha podido seleccionar la base de datos!");
return $conexion;
}
?>

Archivo “consulta.php”

<?php
require('conexion.php');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Lista de ciclistas</title>
</head>
<body>
<h1>Lista de ciclistas</h1>
<!-- Mostraremos los resultados en una tabla, así que armamos el encabezado de la misma -->
<table>
<tr><th>Dorsal</th><th>Nombre</th><th>Equipo</th></tr>
<?php
$con=conectar();
//Guardamos en una variable nuestra cadena de inserción
$sql = "SELECT dorsal, nombre, nomequipo FROM ciclista";
/* mysql_query es la función que ejecuta la consulta guardada en $sql. La función devuelve "false" si hubo algún error.
Cuando se hace un SELECT exitoso, la función devuelve el resultado de la consulta.*/
//Hacemos la consulta:
$result=mysql_query($sql);
/*$result guarda el resultado de la consulta. Este resultado no puede ser accedido directamente, sino a través de la función mysql_fetch_array */
while($fila=mysql_fetch_array($result)) {
  echo '<tr><td>'.$fila['dorsal'].'</td><td>'.$fila['nombre'].'</td><td>'.$fila['nomequipo']."</td>";
  echo "<td><a href='modificar.php?id=".$fila['dorsal']."'>Editar</a></td>";
  echo "<td><a href='baja.php?id=".$fila['dorsal']."'>Borrar</a></td></tr>";
}
//Cerramos la conexión:
mysql_close($con);
?>
</table>
</body>
</html>

En la línea 25 se omitió el </tr>, para que la fila de la tabla no termine.
En la línea 26 se agrega una celda a la tabla, que contiene un enlace a la página modificar.php, pasando por GET la variable id, con el valor del dorsal de ciclista.
En la línea 27 se agrega una celda a la tabla, que contiene un enlace a la página baja.php, pasando por GET el mismo valor.
Para verlo en funcionamiento, hacer clic aquí
A continuación se muestra el código:
Archivo “baja.php”

<?php
require('conexion.php');
//Faltaría validar que exista el ciclista, se omite por brevedad.
$id=$_GET['id'];
$con=conectar();
mysql_query("DELETE from ciclista where dorsal=$id");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Baja de ciclistas</title>
</head>
<body>
<h1>Lista de ciclistas</h1>
<h2>Se ha dado de baja al ciclista número <?=$id?></h2>
<h3><a href="consulta.php">Volver a la lista de ciclistas</a></h3>
</body>
</html>

Les dejo como ejercicio el archivo modificar.php

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.