Hola amigos como puedo bloquear un registro o la tabla si un usuario
esta consultandolo y modificandolo ese registro
por ahi dicen que con el lock-tables pero como lo aplico en php
me pueden dar un ejemplo de bloquear el registro??
| |||
"lock-tables" es un comando SQL (instrucción) .. así que debes "lanzarlo" desde PHP como si de otro "SQL" cualquiera (un SELECT .. un INSERT .. un UPDATE .. ) se tratase con la función para ejecutar "SQL" común que ya usas para otras cosas: mysql_query() Ahora .. el tema de "si un usuario está consultado y modificando" .. tendrás que gestionar algo más por tu parte (de la aplicación) para hacer dicho bloqueo ... podría ser un campo tipo "flag" para cada registro .. si tal usuario entra a modificarlo .. lo pones a 1 .. cuando termine lo dejas a 0 .. sólo lista los campos que ese campo estén a "0" (por médio de un WHERE .. flag='0' o similar en tu SELECT ..). Eso sería lo "basico" .. pero ¿que hacemos si el usuario abandona la aplicación de forma inesperada? .. (sin terminar el proceso completo) .. En ese caso tendrías que gestionar ese "flag" como fecha (con hora) y otorgar un tiempo máximo para "liberar" ese campo (si es que quieres que sea el proceso semi-automático) ... Un saludo, |
| ||||
seria muy complicado hacer esto soy nuevo en esto de mysql con php lo que pasa que estoy creando unas cuentas de usuario: 1.-registrar los usuarios de dos maneras 1.1.-en el sitio el usuario llenara un formulario en el cual introducira datos y al momento de enviar se le creara una matricula o identificador unico por ejemplo 2006-1-001 en los ultimos 3 digitos es un consecutivo 2006-1-005....999 1.2.-la segunda forma es que el administrador agrege manualmente al usuario y consultando en cual numero consecutivo es el siguiente aqui viene el detalle de bloquear, al momento de que el administrador de consultar a la tabla, cual es el proximo numero ,digamos que van en el 2006-1-005 en un popup le dira el siguiente es el 2006-1-006, en ese momneto deseo bloquear la tabla que nadien me pueda ganar el 006 y que la tabla se desbloque cuando cierre el popup. El usuario(s) que este por registrarse desde el sitio no le gane el consecutivo, que en este caso seria el 006 y este en espera hasta que el administrador cierre la ventana, entonces ya el usuario que desea registrarse por medio del sitio ya le asigne la nueva clave que en este caso seria 007 seria muy complicado hacer esto??? espero sus comentarios??
__________________ gerardo |
| |||
mira esto! http://www.hudzilla.org/php/18_2_22.php lo pones en un php, con el browser sin ninguna barra y en ventana pequeña, o sea un pop up... Chaop! |
| ||||
sera posible hacer esto??? soy nuevo en esto de mysql con php lo que pasa que estoy creando unas cuentas de usuario: 1.-registrar los usuarios de dos maneras 1.1.-en el sitio el usuario llenara un formulario en el cual introducira datos y al momento de enviar se le creara una matricula o identificador unico por ejemplo 2006-1-001 en los ultimos 3 digitos es un consecutivo 2006-1-005....999 1.2.-la segunda forma es que el administrador agrege manualmente al usuario y consultando en cual numero consecutivo es el siguiente aqui viene el detalle de bloquear, al momento de que el administrador de consultar a la tabla, cual es el proximo numero ,digamos que van en el 2006-1-005 en un popup le dira el siguiente es el 2006-1-006, en ese momneto deseo bloquear la tabla que nadien me pueda ganar el 006 y que la tabla se desbloque cuando cierre el popup. El usuario(s) que este por registrarse desde el sitio no le gane el consecutivo, que en este caso seria el 006 y este en espera hasta que el administrador cierre la ventana, entonces ya el usuario que desea registrarse por medio del sitio ya le asigne la nueva clave que en este caso seria 007 seria muy complicado hacer esto??? espero sus comentarios??
__________________ gerardo Última edición por Cluster; 30/03/2005 a las 08:19 |
| |||
Bueno ,chalchis es supremamente necesario mostrarle al usuario el identificador, antes que se vaya a registrar, personalmente no le veo utilidad para ese caso especifico... Chaop! |
| |||
bueno lo que quiero decir es que es impractico, y problematico, que bloquues la tabla, al abrir el pop up, ya que si ese pop up no es cerrado, pues la tabla va a estar bloqueda siempre y va a producir negacion de inscripciones, bueno a no ser que la cierres al cabo de un tiempo.... Lo que yo haria para mostrar "alguito" es hacer la consulta a la base de datos, ver el resultado del ultimo registro identificador insertado sumarle 1, y mostrarselo.. por otro lado pues una transaccion, pero para hacer eso tocaria crear el registro, asi la persona no se vaya a terminar logeando... Chaop! |
| ||||
si creo que puede ser impractico pero mira esto es lo que estoy haciendo y probando El formulario que vera el futuro alumno se almacera en un tabla de preinscritos el cual guardara todos sus datos y el identifacador generado manejo dos tablas: una donde se genera el consecutivo con 3 campos -la tabla se llama $WEB_DIGITOS=WEB_DIGITOS para eso tengo un archivo de configuracion hago incude -campo año que guardar esta constante 2006 -campo periodo que guarda una constante 1 -campo digito que es el campos que se genera automatica mente 000 le puse al ultimo campo la opcion zero fill para que me rellene ceros a la izquierda. osea estaria asi : 2006-1-000 esta es la pagina que vera el futuro alumno aqui namas pruebo que clave es la que se genero despues de enviar todo el formulario $conexion=mysql_connect($host,$user_host,$pas_host )or die("No es posible conectarse a la base de datos"); mysql_select_db($base_host,$conexion ) or die ("No es posible seleccionar la base de datos"); $actualiza = "UPDATE $WEB_DIGITOS SET digito=digito+1"; $result = mysql_query($actualiza); if($result) { $result = mysql_query("SELECT * FROM $WEB_DIGITOS", $conexion); $row = mysql_fetch_row($result); $ano=$row[0]; $periodo=$row[1]; echo $ano.$periodo."----".$row[2]; } else { echo "error"; echo mysql_error(); } mysql_close($conexion); ********************************************* aqui es la pagina que consultara el administrador <?php include('rutas.php'); include('config.php'); $error="f"; if($_POST['numtxt']!=null) { $conexion=mysql_connect($host,$user_host,$pas_host )or die("No es posible conectarse a la base de datos"); mysql_select_db($base_host,$conexion ) or die ("No es posible seleccionar la base de datos"); mysql_query("LOCK TABLES $WEB_DIGITOS WRITE;"); $actualiza = "UPDATE $WEB_DIGITOS SET digito=digito+1"; $result = mysql_query($actualiza); if($result) { $result = mysql_query("SELECT * FROM $WEB_DIGITOS", $conexion); $row = mysql_fetch_row($result); $ano=$row[0]; $periodo=$row[1]; echo $ano.$periodo."----".$row[2]; } else { echo "error"; echo mysql_error(); } mysql_query("UNLOCK TABLES;"); mysql_close($conexion); exit(); } else { $conexion=mysql_connect($host,$user_host,$pas_host )or die("No es posible conectarse a la base de datos"); mysql_select_db($base_host,$conexion ) or die ("No es posible seleccionar la base de datos"); mysql_query("LOCK TABLES $WEB_DIGITOS WRITE;"); $result = mysql_query("SELECT * FROM $WEB_DIGITOS", $conexion); $row = mysql_fetch_row($result); $ano=$row[0]; $periodo=$row[1]; $actual=$row[2]; mysql_query("UNLOCK TABLES;"); mysql_close($conexion); } ?> <html> <head> <title>Documento sin título</title> <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta http-equiv="Pragma" content="no-cache"> </head> <body> <table width="406" border="1" align="center"> <form name="formulario" method="post" action="chelo2.php"> <tr> <td width="153">Numero actual:</td> <td width="237"><? echo $actual;?></td> </tr> <tr> <td> <div align="left"> <input type="hidden" name="numtxt" value="<? echo $actual;?>"> </div></td> <td><div align="right"> <input type="submit" name="Submit" value="<<aceptar>>"> </div></td> </tr> </form> </table> </body> </html> por cierto estoy usando tablas myIsam
__________________ gerardo Última edición por chalchis; 29/03/2005 a las 19:28 |
| |||
No sé si conoces los campos autonuméricos (y unicos) de Msyql .. pero eso ya lo hacen sólos: generar ese autonumérico. Si tu creas un registro (INSERT INTO ....) con una definición de tu campo tipo "ID" autonumérico .. puedes obtener ese n°generado usando: mysql_insert_id() Como para mostrarlo a tu usuario .. o asociarlo en otra tabla para establecer una relación 1-N .. o la que necesites y respetar la "integridad referencial" de los datos. Con ese n° secuencial . .si quieres le añades otras cosas (cadenas/numeros) para componer tu "código" .. Realmente yo ya no me complico con "códigos" de ese estilo .. Uso sólo el autonumérico que me arroja la creación del registro y listo .. Pero si tu requieres componer cierto "código" própio .. OK .. Puedes tomar dicho n° autonuméroco como te comenté, añadir lo que requieras y guardarlo en tu BD en otro campo del registro del usuario. El "bloqueo" de ese estilo se hace con SQL sólo (aunque dependiendo del volumen de cración de esos registros en un instante .. no te será ni necesario usarlo). Concretamente usando las sentencias SQL de Msyql: COMMINT, ROOLBACK y afines. Eso indica a tu BD que bloquee la tabla en uso mientras se está haciendo tu INSERT .. obtiendo el n° autonumérico generado y tal vez un UPDATE antes de terminar lo que llaman "transacción" .. Si hay error, se "deshace" todo lo hecho quedando en su estado inicial todo. Un saludo, |
| ||||
Gracias le mejor opcion seria una bandera Ok cluster tienes razon creo, que mejor con un campo bandera que agregue y poner un caracter que indique si el registro esta bloqueado. Pero ahora como podria yo hacerle para que el usuario al momento de enviar sus datos el escript haga procesos de checar si el registro ya se desbloquio, hacer algo como un "enviandose la informacion...." mientras este bloqueado para que asi no se piedar la informacion que el ususario se envio por este es el script para el visitante $conexion=mysql_connect($host,$user_host,$pas_host )or die("No es posible conectarse a la base de datos"); mysql_select_db($base_host,$conexion ) or die ("No es posible seleccionar la base de datos"); $resultado1 = mysql_query("SELECT * FROM $WEB_DIGITOS", $conexion); $row_blo = mysql_fetch_row($resultado1); if($resultado1) { if($row_blo[3]!="b") { $actualiza = "UPDATE $WEB_DIGITOS SET digito=digito+1"; $result = mysql_query($actualiza); if($result) { $result = mysql_query("SELECT * FROM $WEB_DIGITOS", $conexion); $row = mysql_fetch_row($result); $ano=$row[0]; $periodo=$row[1]; echo $ano.$periodo."----".$row[2]; } else { echo "error"; echo mysql_error(); } } else { echo "registro bloqueado"; } } else { echo mysql_error(); } mysql_close($conexion); *************** yo puse registro bloqueado pero como decia como podria checar nuevamente si el registro ya se desbloquio... gracias amigos por responder espero sus comentario
__________________ gerardo |