Problema con código para modificar registros en base de datos

Ejemplo sacado de phpya.com

El cambio de datos se hace con tres páginas encadenadas. La primera, con el formulario:

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

Y en la segunda viene el problema, hay una parte que no entiendo:
<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> 

Veamos, el mailviejo y el mailnuevo tienen el mismo valor: <?php echo $reg['mail']?> :confused: :confused: ¿Alguien me lo explica?

Gracias, un saludo.
Hola!

Debe ser para comparar si hubieron cambios y/o utilizar el mail antiguo como referencia de lo que debe editar (dependerá del modelo de datos). En la tercera parte debería haber algo así:

mysql_query( "UPDATE alumnos SET mail='$_POST[mailnuevo]' WHERE mail = '$_POST[mailviejo]'");
¡Hola maestro! [:)] Efectivamente el tercer archivo tiene esa línea:

	$registros=mysql_query("update alumnos set mail='$_REQUEST[mailnuevo]' where mail='$_REQUEST[mailviejo]'", $conexion) or die ('Error en el select'.mysql_error());

Y sigo sin enterarme, se pretende cambiar A por B pero en vez de A y B tenemos A y A repetida :confused:
No, no es eso... es simplemente que sin el mail antiguo, no tengo cómo decirle a MySQL (o cualquier otro gestor de bases de datos) qué mail modificar.

Como dije entre paréntesis anteriormente, todo dependerá de la estructura de tu modelo de datos. En un modelo de datos donde un usuario puede tener un único mail, la tabla debería ser así:

alumno (
  id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  usuario VARCHAR(100) NOT NULL,
  // Otras columnas como nombre, apellido, etc.
  mail VARCHAR(100) NOT NULL
);

Esto está bien si no quieres añadir más de un mail. Pero, ¿Qué pasa si quiero que un usuario tenga más de un mail? Tendría que repetir el usuario tantas veces como emails desee añadir :confused:, lo que me daría una tabla con datos similares a

ID| Usuario | Mail
-------------------
1 | Lombardo | [correo eliminado]
2 | Lombardo | [correo eliminado]
3 | Lombardo | [correo eliminado]

¿Ves el problema? Además, que pasa si deseo que el usuario sea único? No se podría, así que, esta solución está descartada :P.

Una solución mejor sería tener una tabla separada para el mail:

alumno (
  id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  usuario VARCHAR(100) NOT NULL,
  // Otras columnas como nombre, apellido, etc
);

email (
  id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  mail VARCHAR(100) NOT NULL,
  alumno_id INT(11) NOT NULL, // Esto es una clave extranjera (foreign), que hará referencia a la tabla alumno y debe ser el mismo tipo que la columna de la tabla referenciada (en este caso, alumno.id)
  CONSTRAINT email__alumno_FK FOREIGN KEY alumno_id REFERENCES alumno(id) // Define la clave foránea
);

De esta forma, puedo añadir tantos email como desee asociados a un único alumno. Un ejemplo de insert:

INSERT INTO email (mail, alumno_id) VALUES
('[correo eliminado]', (SELECT id FROM alumno WHERE usuario = 'Lombardo')),
('[correo eliminado]', (SELECT id FROM alumno WHERE usuario = 'Lombardo')),
('[correo eliminado]', (SELECT id FROM alumno WHERE usuario = 'Lombardo'));

Idealmente, no ejecutarás el SELECT id... en cada inserción, sino que lo extraerás una sola vez, lo guardarás en una variable y lo insertarás en cada fila necesaria.

Con este último modelo, te puedo explicar para qué necesito el mail antiguo. Suponiendo que exista el alumno Lombardo y su ID sea 1 (como en el ejemplo de inserción de datos), tendríamos la tabla email así:

ID| Mail    | alumno_id
-----------------------
1 | [correo eliminado] | 1
2 | [correo eliminado] | 1
3 | [correo eliminado] | 1

Asumiendo que quisiera cambiar el mail [correo eliminado] por [correo eliminado], ¿de qué forma le digo que lo quiero editar?:

UPDATE email SET mail = '[correo eliminado]'

Ok, funciona; el problema es que me cambió todos los email XD! Hay una forma de editarlo sin cambiar todas las filas de la tabla email: usando la cláusula WHERE condición. Esta cláusula le dice a MySQL que seleccione (SELECT), actualice (UPDATE) o borre (DELETE) todos los registros que cumplan con la condición. La condición puede ser cualquier comparación que devuelva un resultado boolean (true o false/verdadero o falso).

Tomando en cuenta el último párrafo, lo correcto para actualizar el mail es:

UPDATE email SET mail = '[correo eliminado]' WHERE mail = '[correo eliminado]'

En el caso de tu formulario, $_POST['mailnuevo'] contendría el valor de '[correo eliminado]' y $_POST['mailviejo'] sería igual a '[correo eliminado]'.

Se entiende?

Uff, cuanta vuelta me di para explicar eso xD.
¡Casi casi! Ahora veo más clara la cosa gracias a tu explicación... pero sigo sin entender dónde se estipula que mailviejo es el mail existente... :confused::confused: Uno y otro, es decir, el nuevo y el viejo, figuran de la misma forma en sentencias consecutivas: <?php echo $reg['mail']?>

¿Cómo se cambia de uno a otro? ¿Es que acaso el botón hidden incluye esa característica, es decir, que recoge el valor existente en una modificación?

¡Muchas gracias por tu ayuda! [:)]
Aaaaaaaaaah, ahora entendí xD!

¿Es que acaso el botón hidden incluye esa característica, es decir, que recoge el valor existente en una modificación?

Es algo así. Como sabrás, no se puede editar lo que no se ve (a no ser de que utilices las herramientas de desarrollo del navegador), por ende, un <input type="hidden" /> no se podrá modificar y conservará el valor inicial.

Un ejemplo: suponiendo que $reg['mail'] contenga el valor '[correo eliminado]', el form quedaría así:

Formulario
<html>
  <head><title>Ejemplo PHP</title></head>
  <body>
<form action="procesar.php" action="post">
  <input type="text" name="mailnuevo" value="[correo eliminado]" />
  <input type="hidden" name="mailviejo" vlaue="[correo eliminado]" />
  <input type="submit" />
</form>
</body></html>

procesar.php
<?php
  $nuevo = $_POST['mailnuevo'];
  $viejo = $_POST['mailviejo'];

  echo "Nuevo mail: $nuevo; Antiguo mail: $viejo";
?>

Si yo escribiera en el mailnuevo [correo eliminado], el resultado de procesar.php sería:

Nuevo mail: [correo eliminado]; Antiguo mail: [correo eliminado]

Conclusión: sí, se está utilizando el mail original dos veces, pero la primera es para que el usuario sepa que mail está modificando y la segunda es para guardar el mail original y saber que mail debe reemplazar.

Creo que lo mejor que puedes hacer es probar el código que te acabo de mostrar :). Copia y pega el formulario en un archivo index.html y el código PHP en un archivo llamado procesar.php en la misma carpeta que el anterior (supongo que sabes como ejecutar el código PHP, no?).

Espero que ahora sí te haya ayudado :).
Aaaaah vale, ya lo entendí [:)][:)][:)] ¡Hay que ver el follón que me ha causado el manual dichoso, por no explicar las cosas bien!

No sabes cuánto te agradezco tus explicaciones, como siempre de la máxima ayuda. ¡Te debo otra cerveza, maestro! Un saludote.
¡Te debo otra cerveza, maestro!

Jajajajaja, me parece bien, ya la cobraré :D, saludos!