Foros del Web » Programando para Internet » PHP »

Update en dos tablas(MYSQL)

Estas en el tema de Update en dos tablas(MYSQL) en el foro de PHP en Foros del Web. A ver si alguién me puede ayudar, paso a detallar mi problema y más abajo está el script. La primera página tiene un formulario donde ...
  #1 (permalink)  
Antiguo 18/12/2002, 14:07
Avatar de Nina  
Fecha de Ingreso: septiembre-2002
Mensajes: 22
Antigüedad: 21 años, 7 meses
Puntos: 0
Pregunta Update en dos tablas(MYSQL)

A ver si alguién me puede ayudar, paso a detallar mi problema y más abajo está el script.
La primera página tiene un formulario donde se ingresa:
genero,nropaquete,origen y estado(son cajitas de texto), con el action se va a otra
página, donde se muestran todos los registros(de una tabla con base de datos MYSQL) con las
condiciones de la primera página, luego con un boton de submit(Actuializar) que está dentro
dentro de un formulario se va a un programa php(para actualizar tablas), donde el script
es el que sigue abajo. El problema es que el Update de la primera tabla lo hace
siempre, no tendría problema(modifica varios registros), el que no me anda es el Update
de la segunda tabla,a veces lo hace y hay veces que no modifica(tiene que ectualizar
un solo registro).Es inestable, no es que no actualiza nunca, a veces si.
No sé que pasa. Se entiende???
Aquí va el script de actualizacíon:
$SERVER="pp";
$USUARIO="pp";
$CLAVE="";
$BASE="prueba";
$conexion=mysql_connect ($SERVER,$USUARIO,$CLAVE);
mysql_select_db($BASE,$conexion);
$fecestado= date(Ymd);
// modifico base TRAMI
$sql = "UPDATE TRAMI SET nroremito='$numerore', estado='4', fechauestado='$fecestado' WHERE (genero='$genero' and nropaq='$nropaquete' and origen='$origen' and estado='$estado' and nroremito='0' and fechadecarga='$fecpaquete') or (genero='$genero' and nropaq='$nropaquete1' and origen='$origen' and estado='$estado' and nroremito='0' and fechadecarga='$fecpaquete1') or (genero='$genero' and nropaq='$nropaquete2' and origen='$origen' and estado='$estado' and nroremito='0' and fechadecarga='$fecpaquete2')";
$resultado=mysql_query($sql,$conexion) or die ("ATENCION problemas para realizar la modificación de TRAMI");
mysql_free_result($resultado);
$anio=date(Y);
// modifico base numera
if ($numerore == 1)
{
// alta al numera
$sqlr = "INSERT INTO numera (numero, anio ) VALUES ".
"('$numerore','$anio')";
$resultador=mysql_query($sqlr,$conexion) or die ("ATENCION problemas para realizar el alta de numera");
}
else
{
// modifica numera
$sqlr = "UPDATE numera SET numero='$numerore', anio='$anio' WHERE anio='$anio' ";
$resultador=mysql_query($sqlr,$conexion) or die ("ATENCION problemas para realizar la modificación de numera");
}
echo "<table border='0' width='100%'>";
echo "<tr>";
echo "<td><h2 align='center'>Ha finalizado el proceso de actualización</h2>";
echo "</td>";
echo "</tr>";
echo "</table>";
mysql_free_result($resultador);
mysql_close($conexion);
  #2 (permalink)  
Antiguo 18/12/2002, 14:57
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Cuando dices que no te funciona, ¿quieres decir que no te actualiza o que te da error (mensaje del die)? Si es lo segundo, añade al texto del die() la salida de mysql_error() para ver el error de MySQL.

Si es lo primero, ¿con que datos te lo hace y con cuales no?

Una pregunta. En el update segundo ¿por que modificas anio, si el valor de ese campo no cambia?

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 18/12/2002, 15:10
Avatar de Nina  
Fecha de Ingreso: septiembre-2002
Mensajes: 22
Antigüedad: 21 años, 7 meses
Puntos: 0
Gracias por contestarme.
No me da error en el segundo update.
No me modifica el registro, pero no se en qué casos, es aleatorio, a veces si y a veces no.
Esta tabla sería como un numerador, sigue numerando, pero no estampa la actualización en el archivo.
Lo de modificar el año tenés razon no es necesario.está de gusto
  #4 (permalink)  
Antiguo 18/12/2002, 15:21
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Pero cuando no actualiza la BD, ¿estas segura que ejecuta esa instruccion? Puedes poner un echo dentro de ese codigo. O mejor, hacer una especie de log (o un log propiamente dicho) de las actualizaciones, guardando $anio y $numerore.

Por cierto, ¿de donde viene $numerore? ¿Quien crea/modifica ese valor? ¿Esa situacion de no actualizacion te da cuando estas tu sola trabajando con la pagina o cuando hay mas gente? ¿Hay posibilidades de que dos personas esten accediendo a la vez intentando grabar el mismo valor de $numerore cuando cada uno tendria que estar grabando uno distinto? ¿Tu 'numerador' es una especie de contador automatico? ¿Podrias sustituir el $numerore por el valor anterior del campo + 1 (aunque creo que no porque usas esa variable en el otro update?

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #5 (permalink)  
Antiguo 19/12/2002, 17:50
Avatar de Nina  
Fecha de Ingreso: septiembre-2002
Mensajes: 22
Antigüedad: 21 años, 7 meses
Puntos: 0
Gracias Josemi, por preocuparte.y ayudarme
El $numerore, viene de otra página, que primero leo la tabla Numero (donde sus campos son numero,año) para saber en que cantidad está número, luego le sumo 1 (y lo guardo en $numerore)y se lo paso a la otra pagina de actualización(siempre y cuando presionen el boton de actualizar).Es una tabla con un único registro por año, tipo numerador.
Lo que me dijiste, de que varias personas puedan estar uzando la misma página al mismo tiempo puede ser, pero cómo hago par bloquear el registro????.
Espero que me hayas entendido.
Lo que no entiendo porqué la actualización de la primera tabla me la hace siempre??, y la segunda a veces???
Gracias
  #6 (permalink)  
Antiguo 23/12/2002, 14:47
Avatar de Nina  
Fecha de Ingreso: septiembre-2002
Mensajes: 22
Antigüedad: 21 años, 7 meses
Puntos: 0
Hola a todos, vuelvo a insitir de nuevo.
Mysql, bloquea atomáticamente él o los registros en un UPDATE???.
Porque creo que es eso lo que me pasa, no actualiza la segunda tabla porque acceden varias personas al numerdor(segunda tabla).En cambio la primera tabla la actualiza porque los grupos de registros que modifica son distintos , en cambio de la segunda toman todos el mismo registro.
Hay una forma de bloquear un registro hasta que haga una actualizacion, o Mysql tiene esa función???.
Desde ya gracias a todos y Feliz Navidad para todos!!!!!!!!!!!!!
  #7 (permalink)  
Antiguo 23/12/2002, 14:57
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

El problema es que $numerore lo calculas en otra pagina. Si dos navegantes son capaces de cargar la misma version de esa pagina (es decir, obtienen el mismo valor de $numerore), al realizar la accion y pasar $numerore a la siguiente pagina pasan el mismo valor. Como supongo que tambien pasan el mismo $anio, el update segundo SI se ejecuta dos veces, pero con los mismos valores.

La solucion seria no calcular $numerore en la primera pagina sino en la segunda pagina (la de los updates). La forma de hacerlo hay depende de la logica de tu script, pero dentro del mismo script puedes usar la funcion de MySQL LOCK TABLES.

Espero haber sido de ayuda.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #8 (permalink)  
Antiguo 27/12/2002, 12:50
Avatar de Nina  
Fecha de Ingreso: septiembre-2002
Mensajes: 22
Antigüedad: 21 años, 7 meses
Puntos: 0
Josemi gracias, por contestarme.Disculpame que siga insistiendo.
El $numerore lo tengo que calcular en la otra página porque muestro ciertos datos de otra tabla, junto con ese numerador.
No se si me explico???, como podría hacer para optimizar las dos páginas???.
Este sería el script de la página anterior mas o menos:
<?
// variable para propagar a otra página el de la actualizacion,
// estas vienen de la página principal
$pasa.= "&genero=".urlencode($genero)."&nropaquete=".urlen code($nropaquete)."&nropaquete1=".urlencode($nropa quete1)."&nropaquete2=".urlencode($nropaquete2)."& origen=".urlencode($origen)."&estado=".urlencode($ estado)."&fecpaquete=".urlencode($fecpaquete)."&fe cpaquete1=".urlencode($fecpaquete1)."&fecpaquete2= ".urlencode($fecpaquete2)."&numerore=".urlencode($ numerore);
// conexion
$SERVER="pp";
$USUARIO="pp";
$CLAVE="";
$BASE="prueba";
$conexion=mysql_connect ($SERVER,$USUARIO,$CLAVE);
// acceder a base numera para sacar el numero de remito
$anio=date(Y);
$sqln= "SELECT * FROM numera where anio='$anio' ";
$resultadon=mysql_query($sqln,$conexion) or die ("ATENCION no se puede abrir la tabla de numera");
$filasn=mysql_num_rows($resultadon);
if ($filasn == 0)
{
$numerore=1;
}
else
{
$numerore=mysql_result($resultadon,0,"numero");
$numerore=$numerore + 1;
}
// acceder a tabla trami
$sql6="SELECT * FROM TRAMI where (genero='$genero' and nropaq='$nropaquete' and origen='$origen' and estado='$estado' and nroremito='0' and fechadecarga='$fecpaquete') or (genero='$genero' and nropaq='$nropaquete1' and origen='$origen' and estado='$estado' and nroremito='0' and fechadecarga='$fecpaquete1') or (genero='$genero' and nropaq='$nropaquete2' and origen='$origen' and estado='$estado' and nroremito='0' and fechadecarga='$fecpaquete2') order by dni";
$resultado6=mysql_query($sql6,$conexion) or die ("ATENCION no se puede abrir la tabla de trami");
$filas=mysql_num_rows($resultado6);
if ($filas == 0)
{
echo "<body>";
echo "<h2 align='center'>&nbsp;</h2>";
echo "<h2 align='center'>&nbsp;</h2>";
echo "<h2 align='center'>Busqueda inexistente</h2>";
echo "</body>";
}
else
{
echo "<p align='center'><font size=\"2\" face=\"Verdana\"> Nº : " .$numerore." Contiene <b>". $filas. "</b>registros<b></font></b><p>";
echo "<form method='POST' action='actualización.php?pasa=$pasa'>";
echo "<p><input type='submit' value='Remitir' name='B1'></p>";
echo "</form>";
echo "<table border='1' cellpadding='0' cellspacing='0' width='100%'>";
echo "<TR><font face='verdana' size='1'><TH><font face='verdana' size='1'>Campo1</TH><th><font face='verdana' size='1'>Campo2</ht>";
while ($fila = mysql_fetch_array($resultado6))
{
echo "<TR>";
echo "<TD><font face='verdana' size='1'>".$fila["campo1"]."</TD>";
echo "<TD><font face='verdana' size='1'>".$fila["campo2"]."</TD>";
echo "</TR>";
}
echo "</TABLE>";
mysql_close($conexion);
}
?>
luego vendría el script que ante escribí en mensages anteriores el de la actualización, siempre y cuando oprima el boton remitir.
Si me puedes orientar para optimizar, ya que puede suceder que varias personas accedan al mismo tiempo.
Gracias y Feliz Año Nuevo !!!!!!!!!!!
  #9 (permalink)  
Antiguo 27/12/2002, 13:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
(observación: Nina, cuando pongas código .. usa el boton "PHP" .. así se coloreará el código y será mas legible.
Tambien resumir el código ayuda a entender el concepto .. elimina todo HTML que no haga falta .. y centrate en tu caso Mysql y datos .. no tanto en el formateo HTML de esos datos).


Un saludo,
  #10 (permalink)  
Antiguo 27/12/2002, 14:12
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Pero por lo que veo no calculas por primera vez $numerore en esta pagina, ya que la añades a la variable $pasa al comienzo del script. Es en esa pagina anterior donde comienza el problema. Tambien creo que usas esa variable como una especie de 'numero de factura', no solo como numerador. Lo que debes plantearte es en que pagina necesitas dar un valor definitivo a $numerore. En este ultimo script lo usas de una forma informativa, ¿es absolutamente necesario que aparezca ahi el valor definitivo o seria perfectamente viable no mostrarlo en absoluto?

El problema es plantearse el flujo de datos entre las paginas, donde debe darse el valor a las varibles y donde guardarlo. Para esto hace falta conocer mas a fondo lo que hacen las 3 paginas. Por que yo con lo poco que se de los requisitos, no calcularia $numerore ni en la primera ni en la segunda, ni siquiera lo mostraria. Lo calcularia en la tercera, donde el update. Porque el flujo que creo que hay es en la primera pagina metes los datos para seleccionar los registros a modificar; en la segunda te muestra los registros que vas a modificar para que confirmes la modificacion; y la tercera es donde se realiza la modificacion.

Espero haber sido de ayuda.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #11 (permalink)  
Antiguo 30/12/2002, 12:51
Avatar de Nina  
Fecha de Ingreso: septiembre-2002
Mensajes: 22
Antigüedad: 21 años, 7 meses
Puntos: 0
Disculpame Josemi que no contesto en seguida, es que a veces no puedo logonearme.
Es correcto con lo que dices: el primer flujo de datos de la primera página es para seleccionar los datos para modificar que los muestro en la segunda página con $numerore, porque necesitan imprimir antes de actualizar esos datos con ese numero. (segunda página)
ejemplo

Nro.factura: $numerore
datos a modificar
datos a modificar
datos a modificar
.................
.....................
etc
Boton remitir(va a modificar en la tercera página)
Gracias de todas maneras , no te preocupes voy a ver como lo resuelvo.
Feliz año nuevo!!!
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 05:32.