Foros del Web » Programando para Internet » PHP »

Como bloquear un registro o tabla en mysql

Estas en el tema de Como bloquear un registro o tabla en mysql en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 16/03/2005, 14:13
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 14 años, 4 meses
Puntos: 21
Pregunta Como bloquear un registro o tabla en mysql

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??
__________________
gerardo
  #2 (permalink)  
Antiguo 16/03/2005, 15:46
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
"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,
  #3 (permalink)  
Antiguo 29/03/2005, 14:31
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 14 años, 4 meses
Puntos: 21
Pregunta 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
  #4 (permalink)  
Antiguo 29/03/2005, 15:11
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 14 años, 4 meses
Puntos: 21
Pregunta como bloquear una tabla al abrir un popup

como bloquear una tabla de mysql al abrir un popup y al cerrar el popup desbloquear la tabla
__________________
gerardo
  #5 (permalink)  
Antiguo 29/03/2005, 15:48
 
Fecha de Ingreso: julio-2003
Ubicación: Colombia
Mensajes: 591
Antigüedad: 14 años, 4 meses
Puntos: 7
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!
  #6 (permalink)  
Antiguo 29/03/2005, 17:38
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 14 años, 4 meses
Puntos: 21
Pregunta 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
  #7 (permalink)  
Antiguo 29/03/2005, 18:12
 
Fecha de Ingreso: julio-2003
Ubicación: Colombia
Mensajes: 591
Antigüedad: 14 años, 4 meses
Puntos: 7
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!
  #8 (permalink)  
Antiguo 29/03/2005, 18:30
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 14 años, 4 meses
Puntos: 21
ok gracias luchope

gracias por responder luchope
__________________
gerardo
  #9 (permalink)  
Antiguo 29/03/2005, 18:32
 
Fecha de Ingreso: julio-2003
Ubicación: Colombia
Mensajes: 591
Antigüedad: 14 años, 4 meses
Puntos: 7
bueno pero dime si es necesario para tu aplicacion ?
Chaop!
  #10 (permalink)  
Antiguo 29/03/2005, 18:38
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 14 años, 4 meses
Puntos: 21
pues la verdad si es requerido de esa forma

Es como una preinscripcion lo que estoy tratando de hacer.
__________________
gerardo

Última edición por chalchis; 29/03/2005 a las 18:39
  #11 (permalink)  
Antiguo 29/03/2005, 18:50
 
Fecha de Ingreso: julio-2003
Ubicación: Colombia
Mensajes: 591
Antigüedad: 14 años, 4 meses
Puntos: 7
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!
  #12 (permalink)  
Antiguo 29/03/2005, 19:26
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 14 años, 4 meses
Puntos: 21
Pregunta 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&iacute;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
  #13 (permalink)  
Antiguo 30/03/2005, 08:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
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,
  #14 (permalink)  
Antiguo 01/04/2005, 16:39
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 14 años, 4 meses
Puntos: 21
Pregunta 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
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:36.