sábado, 25 de abril de 2009

Manual de PHP 76. MySQL: Modificar Registros.

Sintaxis MySQL de modificación de registros

Las sentencias MySQL que permiten la modificación de registros en las tablas pueden incluir algunas de las siguientes cláusulas que, al igual que ocurría en casos anteriores, pueden tener categoría de obligatorias u opcionales.

El orden en que deben estar indicadas ha de seguir la misma secuencia en la que están descritas aquí.

(PULSE EN EL ENLACE LEER MAS PARA LEER EL CONTENIDO COMPLETO DEL ARTÍCULO)

UPDATE

Tiene carácter obligatorio, debe ser la primera palabra de la sentencia e indica a MySQL que vamos realizar una modificación.


[LOW_PRIORITY]

Es opcional e indica a MySQL espere a que se terminen de hacer las consultas que en ese momento pudiera haber en proceso antes realizar la actualización.

[IGNORE]

Es opcional. Cuando se incluye en una sentencia el proceso de actualización no se interrumpe si aparece un conflicto de clave duplicada en uno de los registros en proceso. Simplemente ignora ese registro y continúa con los siguientes

Si no se incluye, el proceso de modificación se interrumpe en el momento en que encuentre un conflicto de clave duplicada.

Tanto con ignore como sin esa cláusula, en el caso de duplicidad de clave NUNCA se efectúan las modificaciones.

tabla

Es obligatoria y contiene el nombre de la tabla que pretendemos modificar.

SET

Tiene carácter obligatorio y debe estar delante de las definiciones de campo y valor.

campo1 = valor1

Es obligatoria al menos una definición. Indica el nombre del campo a modificar (campo1) y el valor que se asignará a ese campo.

Si se pretende modificar más de un campo se repetirá esta definición tantas veces como sea necesario, separando cada una de ellas por una coma.

WHERE

Es un campo opcional y su comportamiento es idéntico a señalado al mencionar el proceso de consultas.

ORDER BY

Tiene idéntica funcionalidad a la descrita al referirnos a consultas


Modificar un campo en todos los registros de una tabla

La sentencia MySQL, que permite modificar uno o varios campos en todos los registros de una tabla, es la siguiente:

UPDATE tabla SET campo1=valor1, campo2=valor2

¡Cuidado con esta sentencia!. Hay que tener muy presente que con esta sentencia -en la que no aparece WHERE- se modificarán TODOS LOS REGISTROS DE LA TABLA y por lo tanto los campos modificados tendrán el mismo valor en todos los registros.

Algunas consideraciones sobre la sintaxis

Siempre que manejes PHP y MySQL debes tener muy presente lo siguiente:

  • MySQL requiere SIEMPRE que los valores tipo cadena que incluyen campos de fecha vayan entre comillas. Por el contrario, los numéricos no deben llevar comillas.
  • Presta mucha atención a esto cuando escribas los valores directamente en la sentencia MySQL
  • Cuando pases valores desde una variable PHP debes tener muy en cuenta las consideraciones anteriores y si el contenido de la variable es una cadena que va a ser tratada como tal por MySQL tienes dos opciones para evitar el error:

    • Definir la variable así: $variable ="'valor'" (comillas dobles, comilla simple al principio y comilla simple, comilla doble al final) y poner en la sentencia MySQL el nombre de la variable sin entrecomillar, o
    • Definir la variable PHP así: $variable ="valor" y al escribir el nombre de esa variable en la sentencia MySQL escribirlo entre comillas sencillas, es decir, así: '$variable'

  • No pienses que es caprichoso el orden que hemos puesto en las comillas. Recuerda que al llamar a la sentencia MySQL, el contenido de la sentencia va entre comillas (que por costumbre son comillas dobles, por esa razón todo entrecomillado que vaya dentro de esa sentencia ha de usar comillas simples para evitar un error seguro).

    De ahí que al definir una variable PHP en la forma $variable ="'valor'" las comillas dobles exteriores indican a PHP que se trata de una cadena, por lo que, al pasar la variable a MySQL éste recibirá el contenido de la cadena que es, logicamente: 'valor' y en este caso las comillas forman parte del valor, razón por el que no es necesario escribir -en la sentencia MySQL- el nombre de la variable entrecomillado.

En este primer ejemplo, hemos incluido una actualización de tablas que pondrá puntuación 7 en la primera de las pruebas a todos los aspirantes a astronautas de nuestro ejemplo.

Es un caso de actualización sin la condición WHERE y tiene el código comentado.


<?

$base="ejemplos";

# establecemos la conexión con el servidor

$c=mysql_connect ("localhost","pepe","pepa");



#Seleccionamos la BASE DE DATOS en la que PRETENDEMOS TRABAJAR

mysql_select_db ($base, $c);



# establecemos el nombre de la tabla en una variable

$tabla="demodat1";



# asignamos el valor a escribir en todos los registros a una varibale

$valor=7;



# hacemos la llamada a MySQL mediante la función mysql_query

# y le decimos que UPDATE (modifique) la tabla

# y que lo haga (SET) en el campo Puntos

# poniendo el valor que en este caso es 7

$resultado=mysql_query("UPDATE $tabla SET Puntos=$valor",$c);



# cerramos la conexión con la base de datos

mysql_close($c);



# escribimos un mensaje para que nos avise del final de proceso de actualización

echo "<h2>Proceso de actualización terminado</h2>";



# cerramo el script PHP

?>



<!--

###################################################################

# AHORA YA ESTAMOS EN HTML (hemos cerrado el script PHP con ?> #

###################################################################



escribimos esta script de JAVASCRIPT

para que el navegador cargue en la ventana actual

la página que nos permite visualizar el contenido

de las tablas y que es un ejemplo que hemos desarrollado

en la página anterior.

Como observarás esta llamada no la hacemos desde PHP

sino desde JavaScript, la razón es simple:

PHP se ejecuta en el servidor SIEMPRE

JavaScript se ejecuta siempre el el cliente (navegador del usuario)

y lo que pretendemos ahora es que el navegador del usuario

cargue la página indicada -->







<script language="JavaScript">

window.self.location="ejemplo196.php";

</script>



Selección y modificación de un solo registro

Es una de las opciones más habituales. Es el caso en el que –mediante un formulario– asignamos una condición a WHERE y simultáneamente asignamos los nuevos valor del campo o campos elegidos. Requiere la siguiente sintaxis:

UPDATE tabla SET campo1=valor1, campo2=valor2 WHERE condición

La condición es fundamental en esta opción y normalmente aludirá a un campo índice (clave principal o única), de modo que sea un solo registro el que cumpla la condición. Podría ser el caso, en nuestro ejemplo, del campo DNI que por su unicidad garantizaría que la modificación solamente va a afectar a uno solo de los registros.

El ejemplo siguiente nos permitirá hacer modificaciones de este tipo en la tabla deomodat2. Observa el código fuente y verás que mediante un simple recurso JavaScript, el script que realiza la modificación nos reenvía al formulario con un mensaje de confirmación de la modificación.

El formulario:

<html>

<head><title>Formulario de modificaciones</title></head>

<body>

<h2><center>MODIFICACION DE PUNTUACIONES<BR> DE LA PRUEBA Nº 2



<!-- Caundo la variable $avisa recoge el mensaje creado en

el script que actualiza la base de datos, la imprimimos

con esta etiqueta PHP -->



<? echo $_GET['avisa']; ?>



</H2></CENTER>

<FORM name="modificar" method="GET" action="ejemplo199.php">



<table align=center border=2>

<td>Escriba el DNI de la persona a calificar..:</td>

<td><input type="text" name="Penitente" value=""></td><tr>

<td>Escriba aquí la calificación..:</td>

<td><input type="text" name="Calificacion" value=""></td><tr>

<td align=center><input type="submit" value="Calificar"></td>

<td align=center><input type="reset" value="Borrar"></td>

</form>

</table>

<br><BR>

<H3><CENTER>Tenga en cuenta que la calificación requiere<br>un número de DNI existente en la base de datos</center></h3>

</body>

</html>


El Script:

<?

#recogemos del formulario las variables Calificacion y Penitente

# en variables automaticas de PHP que serán $Calificacion y $Penitente

# atención a Mayusculas/Minusculas en nombres de variables

# recuerda que para PHP son DISTINTAS

$Calificacion=$_GET['Calificacion'];

$Penitente=$_GET['Penitente'];

$base="ejemplos";



# establecemos la conexión con el servidor

$c=mysql_connect ("localhost","pepe","pepa");



#Seleccionamos la BASE DE DATOS en la que PRETENDEMOS TRABAJAR

mysql_select_db ($base, $c);



# establecemos el nombre de la tabla en una variable

$tabla="demodat2";



#########################################################################

# COMPROBACION DE LA EXISTENCIA DE UN REGISTRO CON ESE D.N.I. #

#########################################################################



# Es una operación necesaria para advertir al usuario de la correcta realización

# del proceso de modificación.

# Si introducimos un DNI inexistente la función UPDATE no DARA MENSAJE DE ERROR

# aunque evidentemente NO LO ACTUALIZARA tampoco

#

# Para hacer esa comprobación tenemos múltiples opciones una de ellas sería

# contar los registros en los que el DNI es igual al valor recibido en la variable

# $Penitente

# Si existiera el DNI devolvería UNO en el índice CERO DEL ARRAY

# recuerda que los indices de ese array se corresponden con el orden

# en el que han sido insertados los campos en la opcion SELECT

# en este caso solo ponemos uno... COUNT(DNI) por lo que el índice del array

# ha de ser el primero de los posibles que como sabes es CERO

$resultado=mysql_query("SELECT DNI FROM $tabla WHERE (DNI=$Penitente)",$c);

$comprueba=mysql_num_rows($resultado);



#HACEMOS LA COMPROBACION

# y en caso de inexistencia del recogemos en una variable ($Avisar)

# la cadena del mensaje de inexistencia

# en otro caso (cuando el DNI existe) hacemos que ese mensaje sea la cadena vacia

if($comprueba==0) {$avisar="<h2>No existe nadie con DNI ".$Penitente. " en la base de datos<br>Su Modificacion anterior no ha sido procesada</h2>";

}else{

$avisar="<BR>Calificación registrada<BR>";

}



# hacemos la llamada a MySQL mediante la función mysql_query

# y le decimos que UPDATE (modifique) la tabla

# y que lo haga (SET) en el campo Puntos

# poniendo el valor que en este caso $Calificacion

# si el DNI existe en la base de datos actualizará el valor

# y si no existe no pasa nada... ya tenemos el mensaje de error

# que nos aparecerá en la página formulario

$resultado=mysql_query("UPDATE $tabla SET Puntos=$Calificacion WHERE (DNI=$Penitente)",$c);



#colocamos la opcion de mensaje de error por si se produce alguna incidencia

if (mysql_errno($c)==0){echo " ";

}else{

if (mysql_errno($c)==1062){echo "<h2>No ha podido añadirse el registro<br>Ya existe un campo con este DNI</h2>";

}else{

$numerror=mysql_errno($c);

$descrerror=mysql_error($c);

echo "Se ha producido un error nº $numerror que corresponde a: $descrerror <br>";

}

}

# cerramos la conexión con la base de datos

mysql_close($c);



# escribimos un mensaje para que nos avise del final de proceso de actualización



#insertamos el script de Java que nos devolverá al formulario



#####################################################

#fijate como pasamos el valor del mensaje de aviso #

#####################################################

# para pasar valores a PHP hay la opcion de añadir a la direccion

# URL del script el simbolo de cerrar interrogacion

# seguido del nombre de la variable con la que será transferido

# el signo igual y el valor de la variable

#

# si quieres pasar mas de una variable la sintaxis sería

# http://loquesea.php?variable1=valor1&variable2=valor2&variable3=valor3

?>



<script language='JavaScript'>

<? echo "window.self.location='ejemplo198.php?avisa=$avisar'" ?>

</script>




Modificación simúltanea de un campo en cualquiera de los registros

Aquí tienes un ejemplo que permite visualizar el valor actual de todas las puntuaciones de la prueba 2 de los astronautas así como sus nombres y apellidos y DNI y en la cual se pueden modificar ninguno, uno, varios o todos los valores y posteriormente actualizarlos todos con los nuevos valores.

El formulario:

<html>

<head>

<title>Formulario para añadir datos a la tabla demo4</title>

</head>

<body>



<?



# definimos una variable con el NOMBRE DE LA BASE DE DATOS





$base="ejemplos";



# establecemos la conexión con el servidor



$conexion=mysql_connect ("localhost","pepe","pepa");



#Seleccionamos la BASE DE DATOS en la que PRETENDEMOS TRABAJAR



mysql_select_db ($base, $conexion);





#creamos una consulta de las bases de datos demo4 y demodat2

# esta segunda es la tabla de puntuaciones de la segunda prueba

# seleccionamos los campos DNI de ambas tablas

# y nombre y apellidos de la primera

# establecemos como condicion la IGUALDAD DE LOS DNI en ambas BASES











$resultado=mysql_query("SELECT demo4.DNI,demo4.Nombre,demo4.Apellido1, demo4.Apellido2 ,demodat2.Puntos FROM demo4, demodat2 WHERE (demo4.DNI=demodat2.DNI) ",$conexion);



# presentamos la salida en forma de tabla HTML



# estos son los encabezados





echo "<table align=center border=2 bgcolor='#F0FFFF'>";

echo "<td colspan=5 align=center>Para modificar escribe en la casilla correspondiente</td><tr>";

echo "<td colspan=4 align=center>Datos del aspirante</td>";

echo "<td align=center>Puntuación</td><tr>";





#escribimos la etiqueta de apertura de un formulario como method=post

# como action ponemos la direccion de la página que realizará las actualizaciones

# en este caso sera ejemplo201.php



echo "<form name='modificar' method=\"POST\" action='ejemplo201.php'>";



while($salida = mysql_fetch_array($resultado)){



# escribimos un bucle que nos lea desde el indice 0 hasta el indice 6

# de la matriz de salida ya que los indices 0,1,2,3,4...

# se corresponden con el número de orden tal como fueron establecidos

# los campos en la opción SELECT: 0 es el indice del primero

# 1 el de segundo, 2 el del tercero, etc. etc.



for ($i=0;$i<5;$i++){



# establecemos un condicion que escriba una tabla normal SALVO

# cuando $i=4 que es el valor actual de la puntuación

# cuando eso ocurre pedimos que escriba en la celda de la tabla

# un campo de formulario TIPO TEXTO cuyo NOMBRE SEA UNA MATRIZ

# aqui la hemos llamado ident

# cuyos indices sean los DNI de los personajes de la tabla

# recuerda que la $Salida[0] contiene siempre el primer elemento

# definido en la opcion SELECT y que en este caso es el DNI

# PEDIMOS QUE ESE CAMPO DEL FORM tenga por valor EL VALOR ACTUAL DE LA PUNTUACION

# existente en la base de DATOS





if($i!=4){



echo "<td>",$salida[$i],"</td>";

}else{

echo "<td><input type=text size=8 name=ident[$salida[0]] value=$salida[4]></td><tr>";

}



#cerramos el bucle for



}





# CERRAMOS EL BUCLE WHILE



}



# cerramos la conexión... y listo...



mysql_close($conexion)



# SALIMOS DE PHP y ponemos los botones de borrar /enviar desde HTML



?>



<td colspan=5 align=center><br><input type=submit value='Modificar'> <input type=reset value='Borrar'>



<!-- CERRAMOS EL FORMULARIO Y LA TABLA -->



</form></table>



<!-- LOS CAMPOS DEL FORMULARIO PUEDEN MODIFICARSE DESDE EL TECLADO

Y RECOGERAN LAS MODIFICACIONES EN EL ARRAY iden que como recuerdas

TENIA POR INDICE EL Nº DE DNI

AL PULSAR EN ENVIAR ESE ARRAY ES PASADO A ejemplo133.php

QUE REALIZA LA ACTUALIZACION DE LA TABLA -->

</body>

</html>








El Script:


<?



$base="ejemplos";



# establecemos la conexión con el servidor



$conexion=mysql_connect ("localhost","pepe","pepa");



#Seleccionamos la BASE DE DATOS en la que PRETENDEMOS TRABAJAR



mysql_select_db ($base, $conexion);





# escribimos un bucle que nos lea la matriz pasada desde el formulario

# de modificación de datos

# el indice de esa matriz sera el DNI (fijate en el codigo fuente del formulario)

# y el valor asociado la puntuación tecleada en el formulario

# que será el valor con el que se modificará la tabla



# la instruccion WHERE obliga a que cada valor se asigne en la tabla

# al registro cuyo DNI coincide con el indice de la matria transferida desde el formulario



foreach ($_POST['ident'] as $indice=>$valor){



$resultado=mysql_query("UPDATE demodat2 SET Puntos=$valor WHERE DNI=$indice ",$conexion);





}



#cerramos la conexion



mysql_close($conexion);





# cerramos la etiqueta PHP y desde HTML llamamos a la página que visualiza los valores

# si todo ha ido bien :-) los campos apareceran actualizados



?>



<script language="JavaScript">



window.self.location="ejemplo200.php";



</script>






Fuente:



No hay comentarios: