Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Consulta mysqli de modificación

Estas en el tema de Consulta mysqli de modificación en el foro de PHP en Foros del Web. Deseo efectuar un cambio en una de las columnas de los registros sacados en una consulta de selección. La cuestión es que el cambio no ...
  #1 (permalink)  
Antiguo 20/01/2017, 02:29
Avatar de Euclides64  
Fecha de Ingreso: octubre-2010
Mensajes: 79
Antigüedad: 13 años, 6 meses
Puntos: 2
Pregunta Consulta mysqli de modificación

Deseo efectuar un cambio en una de las columnas de los registros sacados en una consulta de selección.
La cuestión es que el cambio no debe de ser el mismo para todos los registros, si no un número creciente en cada uno de ellos, el primero el 1, el segundo el 2 y así sucesivamente hasta el último.
He efectuado un montón de pruebas sin resultado positivo, mas bien ha sido un montón de códigos chapuzas que no me han conducido mas que a errores.
Pongo lo último en lo que he estado experimentando:
Código PHP:
$query_msjLin $form_db -> query ("SELECT * FROM lineas_fact WHERE num_fact='$num_fact'");
$row_msjLin mysqli_fetch_assoc($query_msjLin);
$a=1;
    do {
        
$consulta="UPDATE lineas_fact SET numero_linea=".$a." WHERE num_fact=".$num_fact;
        
$resultado=mysqli_query($form_db,$consulta);
        
$a++;
    } while (
$row_msjLin mysqli_fetch_assoc($query_msjLin)); 
Como veis esto no me ha conducido a nada.

Agradeceria vuestra orientación para conseguir lo que pretendo.

Gracias y saludos
  #2 (permalink)  
Antiguo 20/01/2017, 02:57
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta mysqli de modificación

Hola Euclides64,

¿Ya has probado a depurar tu código? Algo como:

Código PHP:
Ver original
  1. $query_msjLin = $form_db -> query ("SELECT * FROM lineas_fact WHERE num_fact=$num_fact");
  2. $row_msjLin = mysqli_fetch_assoc($query_msjLin);
  3. echo "<pre>";
  4. print_r($row_msjLin);
  5. echo "</pre>";
  6. $a=1;
  7.     do {
  8.         $consulta="UPDATE lineas_fact SET numero_linea=".$a." WHERE num_fact=".$num_fact;
  9.         echo $consulta . "<br>";
  10.         $resultado=mysqli_query($form_db,$consulta);
  11.         $a++;
  12.     } while ($row_msjLin = mysqli_fetch_assoc($query_msjLin));

Y si nos muestras los resultados de las pruebas, los errores que te tira, será más fácil ayudarte...

PD: Entiendo que $num_fact es un int, con lo que no debe llevar comillas en la consulta.
  #3 (permalink)  
Antiguo 20/01/2017, 05:45
Avatar de Euclides64  
Fecha de Ingreso: octubre-2010
Mensajes: 79
Antigüedad: 13 años, 6 meses
Puntos: 2
Respuesta: Consulta mysqli de modificación

Hola rbczgz, algunas ideas me has dado sobre todo en lo que se refiera a la depuración del código, agradezco tu interés.
Te comento que no me daba ningún error, simplemento no se reordenaban las líneas conforme yo esperaba.
La variable $num_fact es varchar por lo que si debe de llevar comillas, se trata del número de factura que es del tipo n/aaaa (n=número, /, aaaa=año).
He acoplado tu código a mi proyecto de esta manera:
Código PHP:
$query_msjLin $form_db -> query ("SELECT * FROM lineas_fact WHERE num_fact='$num_fact'");
$row_msjLin mysqli_fetch_assoc($query_msjLin);
$TotalLineas mysqli_num_rows($query_msjLin);
$a=1;

echo 
"<pre>";
print_r($row_msjLin);
echo 
"</pre>";

    do {
        
$consulta="UPDATE lineas_fact SET numero_linea=".$a." WHERE num_fact='$num_fact'";
        
$resultado=mysqli_query($form_db,$consulta);
        
$a++;
    } while (
$row_msjLin mysqli_fetch_assoc($query_msjLin));

mysqli_close($form_db);
//Header("Location:../new.fact.php?id=".$cli);

echo $consulta "<br>";
echo 
$num_fact."<br />";
echo 
$TotalLineas
Y al ejecutarlo esto es lo que sale:

Cita:
Array
(
[id] => 29
[created_at] => 2017-01-19 20:19:52
[id_fact] => 0
[num_fact] => 9/2017
[numero_linea] => 2
[concepto] => Limpieza de desagues y arquetas
[cantidad] => 0
[importe] => 0
[total] => 75
)

UPDATE lineas_fact SET numero_linea=2 WHERE num_fact='9/2017'
9/2017
2
Aclaro que mi consulta solo saca dos registros y a los dos le pone el ultimo valos, es decir el 2

El do while solo hace recorrer los dos registros pero a los dos le pone el mismo valor, en el primer recorrido el 1 y en el segundo recorrido el 2 y yo lo que deseo es que al primer registro le ponga el 1 y al segundo el 2.

Posiblemente puedas ayudarme de alguna manera, por el momento me has enseñado mucho pues he visto la forma de poder depurar los códigos de una manera clara y precisa.

Si se te ocurre algo espero me lo indiques.

Gracias y saludos.
  #4 (permalink)  
Antiguo 20/01/2017, 07:43
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta mysqli de modificación

Hola Euclides64,

Me alegro de haberte ayudado algo, aunque no hayamos resuelto el problema.

Yo no suelo usar do while ¿qué tal si pruebas a usar solo while?

Otra cosa que veo es que muestras $consulta fuera del bucle, yo te la había puesto dentro para ver qué hace en cada vuelta, que es de lo que se trata.

Prueba esto y me cuentas a ver si te puedo ayudar algo más...
  #5 (permalink)  
Antiguo 20/01/2017, 12:13
Avatar de Euclides64  
Fecha de Ingreso: octubre-2010
Mensajes: 79
Antigüedad: 13 años, 6 meses
Puntos: 2
Respuesta: Consulta mysqli de modificación

Hola, sigo con el asunto.
He probado a efectuar la consulta de modificación con solo el while y con del do while y el resultado es el mismo, cambia todos los registros con el número correspondiente al ultimo ciclo del bucle.
Se me ocurrió limitar el número de registros que pueden cambiarse tal que:

Código PHP:
$consulta="UPDATE lineas_fact SET numero_linea=".$a." WHERE num_fact='$num_fact' LIMIT $a,1"
Pensaba que de esta forma solo cambiaria un solo registro en cada pase del bucle que coincidiria con el registro que me interesa que cambia (LIMIT $a,1).
Falsa esperanza, parece ser que la sentencia UPDATE no acepta el LIMIT o al menos a mi no me lo acepta tal y conforme implemento.
Seguidamente pongo la respuesta que me da:
Cita:
Array
(
[id] => 73
[created_at] => 2017-01-20 19:01:18
[id_fact] => 0
[num_fact] => 9/2017
[numero_linea] => 4
[concepto] => Limpieza suelos
[cantidad] => 0
[importe] => 0
[total] => 85.2
)

UPDATE lineas_fact SET numero_linea=1 WHERE num_fact='9/2017' LIMIT 1,1
UPDATE lineas_fact SET numero_linea=2 WHERE num_fact='9/2017' LIMIT 2,1
Parece que debiera de funcionar pero lo cierto y verdad es que no da error pero tampoco efectua el cambio dejando los números de línea en los mismos que tenia antes de lanzar el código.
¿Realmente la sentencia UPDATE no acepta el LIMIT? y si lo acepta ¿Que parde de la sintaxi estoy poniendo mal?
De antemano agradezco las respuestas.
Saludos.
  #6 (permalink)  
Antiguo 20/01/2017, 14:14
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta mysqli de modificación

Hola Euclides64,

La sentencia UPDATE sí acepta el limit, pero el problema no es ese, si te fijas en los resultados, las dos líneas tienen el mismo número de factura, por eso te está poniendo el mismo numero_linea en las dos, si interpretas la consulta, le estás diciendo:

Actualiza en la tabla lineas_fact el campo numero_linea con el valor de $a donde el campo num_fact sea $num_fact.

Por lo tanto, si tienes dos registros con el mismo num_fact, en los dos te actualizará el campo numero_linea con el mismo valor.

Por otra parte, el do while, da como mínimo una vuelta y luego evalúa la condición y sigue dando vueltas mientras se cumple, el while, solo da vueltas si y mientras se cumple la condición, yo en lo personal, uso while para este tipo de cosas.

Como no sé en qué consiste tu aplicación ni cómo la tienes pensada y programada, no sé cómo más te puedo ayudar...
  #7 (permalink)  
Antiguo 20/01/2017, 16:27
 
Fecha de Ingreso: agosto-2011
Mensajes: 306
Antigüedad: 12 años, 8 meses
Puntos: 5
Respuesta: Consulta mysqli de modificación

hola el codigo esta correcto, lo que esta pasando es en la consulta ahí esta tu problema observa la consulta:

Código PHP:
Ver original
  1. $consulta="UPDATE lineas_fact SET numero_linea=".$a." WHERE num_fact=".$num_fact;

le estas diciendo que actualize numero de linea al valor de $a pero donde num factura es igual a tu numero de facturas es decir te actualiza todos los resultados al ultimo valor incrementado por $a.

prueba asi:


Código PHP:
Ver original
  1. $query_msjLin = $form_db -> query ("SELECT * FROM lineas_fact WHERE num_fact=".$num_fact);
  2. $row_msjLin = mysqli_fetch_assoc($query_msjLin);
  3. $a=1;
  4. $array=array();
  5.     do {
  6.         $array[]=$a;
  7.         $negar=implode(",",$array);
  8.         $consulta="UPDATE lineas_fact SET numero_linea=".$a." WHERE num_fact=".$num_fact." AND numero_linea NOT IN(".$negar.")";
  9.         $resultado=mysqli_query($form_db,$consulta);
  10.         $a++;
  11.     } while ($row_msjLin = mysqli_fetch_assoc($query_msjLin));


no deberia actualizar los que tienen ya la linea actualizada, no lo he probado pero esa es la idea.
igual cambia el while como dijo rbczgz porque si no tienes ningun valor se ejecuta el do de todas formas.
saludos

Última edición por primary; 21/01/2017 a las 06:50
  #8 (permalink)  
Antiguo 21/01/2017, 07:28
 
Fecha de Ingreso: agosto-2011
Mensajes: 306
Antigüedad: 12 años, 8 meses
Puntos: 5
Respuesta: Consulta mysqli de modificación

Perdona rbczgz no vi tu respuesta.
Saludos
  #9 (permalink)  
Antiguo 21/01/2017, 14:22
Avatar de Euclides64  
Fecha de Ingreso: octubre-2010
Mensajes: 79
Antigüedad: 13 años, 6 meses
Puntos: 2
Respuesta: Consulta mysqli de modificación

Amigos rbczgz y primary.
He llegado a la conclusión que estamos trabajando con un planteamiento equivocado, solo creo que sería válido el LIMIT $a,1 si esta instrucción fuese aceptada por la sentencia UPDATE, efectivamente el LIMIT lo acepta pero con un solo parámetro, a esta conclusión he llegado tras mis múltiples consultas en manuales e internet.

Por muchas vueltas que le demos a la consulta UPDATE con el el while siempre hace lo mismo y lo hecho en un pase no es válido para el siguiente por lo que, lo que dice primary tampoco me ha llegado a ninguna conclusión.

Estoy pensando en otra operativa para que mis líneas de factura se ordenen tras borrar una de ellas, con el resultado que saque lo pondré por aquí para vuestro conocimiento.

Repito, grácias por vuestra ayuda.

Saludos.
  #10 (permalink)  
Antiguo 21/01/2017, 14:28
 
Fecha de Ingreso: agosto-2011
Mensajes: 306
Antigüedad: 12 años, 8 meses
Puntos: 5
Respuesta: Consulta mysqli de modificación

Cita:
Iniciado por Euclides64 Ver Mensaje
Amigos rbczgz y primary.
He llegado a la conclusión que estamos trabajando con un planteamiento equivocado, solo creo que sería válido el LIMIT $a,1 si esta instrucción fuese aceptada por la sentencia UPDATE, efectivamente el LIMIT lo acepta pero con un solo parámetro, a esta conclusión he llegado tras mis múltiples consultas en manuales e internet.

Por muchas vueltas que le demos a la consulta UPDATE con el el while siempre hace lo mismo y lo hecho en un pase no es válido para el siguiente por lo que, lo que dice primary tampoco me ha llegado a ninguna conclusión.

Estoy pensando en otra operativa para que mis líneas de factura se ordenen tras borrar una de ellas, con el resultado que saque lo pondré por aquí para vuestro conocimiento.

Repito, grácias por vuestra ayuda.

Saludos.
el ejemplo que te puse no funciona porque tiene un error coloca este linea

$array[]=$a;

despues de la consulta osea arriba del $a++ asi:


Código PHP:
Ver original
  1. $array[]=$a;
  2. $a++;
  #11 (permalink)  
Antiguo 21/01/2017, 16:24
Avatar de Euclides64  
Fecha de Ingreso: octubre-2010
Mensajes: 79
Antigüedad: 13 años, 6 meses
Puntos: 2
Respuesta: Consulta mysqli de modificación

Hola, buenas noches.
He entrado en el foro para decir que ya tenia la solución y veo la nueva respuesta de primary, la he traspasado a mi proyecto y efectivamente, funciona.

La solución que yo le había dado es el huevo de Colón, solo había que ir modificando registro a registro y nada más facil que:

Código PHP:
$query_msjLin $form_db -> query ("SELECT * FROM lineas_fact WHERE num_fact='$num_fact' ORDER BY numero_linea ASC");
$row_msjLin mysqli_fetch_assoc($query_msjLin);
$TotalLineas mysqli_num_rows($query_msjLin);
if (
$TotalLineas 1){
    do{
        
$row $row_msjLin['id'];
        
$consulta="UPDATE lineas_fact SET numero_linea=$a WHERE id=".$row." ORDER BY numero_linea ASC";
        
$resultado=mysqli_query($form_db,$consulta);
        
$a++;
    }while (
$row_msjLin mysqli_fetch_assoc($query_msjLin)); 
}
mysqli_close($form_db); 
Que verguenza, lo mejor es desconectar y retomar el problema con la cabeza despejada.

Muchas grácias a todos.

Saludos.
  #12 (permalink)  
Antiguo 22/01/2017, 03:46
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta mysqli de modificación

Hola Euclides64,

Me alegro de que lo hayas resuelto, no olvides marcar el tema como solucionado por si alguien viene tan cansado como tú con un problema similar, que sepa que aquí encontrará la solución.
  #13 (permalink)  
Antiguo 22/01/2017, 05:22
 
Fecha de Ingreso: agosto-2011
Mensajes: 306
Antigüedad: 12 años, 8 meses
Puntos: 5
Respuesta: Consulta mysqli de modificación

Cita:
Iniciado por Euclides64 Ver Mensaje
Hola, buenas noches.
He entrado en el foro para decir que ya tenia la solución y veo la nueva respuesta de primary, la he traspasado a mi proyecto y efectivamente, funciona.

La solución que yo le había dado es el huevo de Colón, solo había que ir modificando registro a registro y nada más facil que:

Código PHP:
$query_msjLin $form_db -> query ("SELECT * FROM lineas_fact WHERE num_fact='$num_fact' ORDER BY numero_linea ASC");
$row_msjLin mysqli_fetch_assoc($query_msjLin);
$TotalLineas mysqli_num_rows($query_msjLin);
if (
$TotalLineas 1){
    do{
        
$row $row_msjLin['id'];
        
$consulta="UPDATE lineas_fact SET numero_linea=$a WHERE id=".$row." ORDER BY numero_linea ASC";
        
$resultado=mysqli_query($form_db,$consulta);
        
$a++;
    }while (
$row_msjLin mysqli_fetch_assoc($query_msjLin)); 
}
mysqli_close($form_db); 
Que verguenza, lo mejor es desconectar y retomar el problema con la cabeza despejada.

Muchas grácias a todos.

Saludos.
Jeje verguenza nada suele pasar
Mi recomendacion es no utilizar los id que seguro es un autoincrement ademas si solo necesitas el id cambia * por id sera mas rapida la sql y aparte quitar el order by del update no sirve para nada tambien el ASC viene por defecto lo puedes omitir.
Supongo que esas cosas ya lo sabias pero por si acaso.
Saludos.

Última edición por primary; 22/01/2017 a las 05:31

Etiquetas: mysql, mysqli, registro, select
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 06:54.