Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Modificacion masiva PHP y SQL

Estas en el tema de Modificacion masiva PHP y SQL en el foro de PHP en Foros del Web. Hola, resulta que tengo el siguiente problema: Tengo una base de datos con 600 facturas, cada una tiene el campo id_order desde 1 hasta la ...
  #1 (permalink)  
Antiguo 15/12/2013, 11:01
 
Fecha de Ingreso: mayo-2010
Mensajes: 16
Antigüedad: 14 años, 6 meses
Puntos: 0
Modificacion masiva PHP y SQL

Hola, resulta que tengo el siguiente problema:

Tengo una base de datos con 600 facturas, cada una tiene el campo id_order desde 1 hasta la 600.
Como algunas facturas no eran válidas, tuve que borrarlas, por lo que tengo la factura 1 y la siguiente en la BD es la 12, y asi sucesivamente hasta 600, tengo la 30, (falta la 31), 32, 33, (34 falta), (35 falta), 36....etc

Lo que quiero hacer es numerarlas del 1 al 600 (en este caso quitando las que borré ya no llegarán a la 600) pero que estén consecutivas.

¿Alguien sabe como podría solucionarlo mediante un script PHP que me automatice este trabajo?

Un saludo y gracias!
  #2 (permalink)  
Antiguo 15/12/2013, 14:12
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Modificacion masiva PHP y SQL

Podrías empezar haciendo una consulta a la tabla y, con ayuda de un bucle, recorres el array asociativo que formarás con el resultado de la consulta y, ya con esto, vas actualizando cada dato con el valor de un contador que irá aumentando su valor de uno en uno por cada iteración, algo como esto:

Código PHP:
Ver original
  1. $conexion = new mysqli("servidor", "usuario", "password", "bd") or exit("No se pudo realizar la conexión");
  2.  
  3. $consulta = $conexion->query("SELECT * FROM tabla");
  4. if ($consulta->num_rows) {
  5.     while($datos = $consulta->fetch_array()) {
  6.         $conxion->query("UPDATE tabla SET id_order = " . ++$i . " WHERE id_order = " . $datos["id_order"]);
  7.     }
  8.     $consulta->free();
  9. }
  10. else
  11.     echo "No se encontraron datos en la consulta";
  12.    
  13. $conexion->close();

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 15/12/2013 a las 14:48
  #3 (permalink)  
Antiguo 15/12/2013, 16:34
 
Fecha de Ingreso: mayo-2010
Mensajes: 16
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Modificacion masiva PHP y SQL

Cita:
Iniciado por Alexis88 Ver Mensaje
Podrías empezar haciendo una consulta a la tabla y, con ayuda de un bucle, recorres el array asociativo que formarás con el resultado de la consulta y, ya con esto, vas actualizando cada dato con el valor de un contador que irá aumentando su valor de uno en uno por cada iteración, algo como esto:

Código PHP:
Ver original
  1. $conexion = new mysqli("servidor", "usuario", "password", "bd") or exit("No se pudo realizar la conexión");
  2.  
  3. $consulta = $conexion->query("SELECT * FROM tabla");
  4. if ($consulta->num_rows) {
  5.     while($datos = $consulta->fetch_array()) {
  6.         $conxion->query("UPDATE tabla SET id_order = " . ++$i . " WHERE id_order = " . $datos["id_order"]);
  7.     }
  8.     $consulta->free();
  9. }
  10. else
  11.     echo "No se encontraron datos en la consulta";
  12.    
  13. $conexion->close();

Saludos
Gracias por tu tiempo!! he puesto un poco modificado el código para ir mostrando los campos que quiero guardar, pero no funciona la consulta.

Código PHP:
Ver original
  1. $i=0;
  2. $consulta = $conexion->query("SELECT * FROM ps_orders");
  3. echo "Filas afectadas: " . $conexion->affected_rows; //NO ESCRIBE NADA
  4.  
  5. while($datos = $consulta->fetch_array()) {
  6.  
  7.     echo $datos["id_order"];
  8.     echo $datos["invoice_number"] . </br>;
  9.  
  10.     $conexion->query("UPDATE ps_orders SET id_order = " . ++$i . " WHERE id_order = " . $datos["id_order"]);
  11.     $conexion->query("UPDATE ps_orders SET invoice_number = " . ++$i . " WHERE id_order = " . $datos["id_order"]);
  12.  
  13.     if($conexion == false) {
  14.     trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $conn->error, E_USER_ERROR);
  15.     }else{
  16.       echo "Consulta realizada";
  17.     }
  18. }
  19.  
  20. $consulta->free();
  21. $conexion->close();

No escribe el 'echo "Filas afectadas: " . $conexion->affected_rows;'.
¿El while que es lo que hace exactamente? se supone que mientras q tiene $datos una fila que vaya haciendo la consulta, ¿no? Mediante el fetch_array() q crea un array dentro con todos los datos de la consulta.
  #4 (permalink)  
Antiguo 15/12/2013, 17:01
 
Fecha de Ingreso: mayo-2010
Mensajes: 16
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Modificacion masiva PHP y SQL

Ya me funciona, aun que no se por que razón el primer valor que mete en el id_order es el 10.

¿Alguien sabe algo de por que ocurre esto? Gracias.
  #5 (permalink)  
Antiguo 15/12/2013, 17:51
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Modificacion masiva PHP y SQL

Para mostrar el valor de las filas afectadas, debiste usar dicho método con el objeto de la consulta, es decir, con $consulta y no con la $conexion. Si en una misma iteración colocas ++$i dos veces, en la segunda tendrá un valor superior en 1 a la anterior, en tal caso, coloca $i++ antes de actualizar los datos y en la consulta de actualización, solamente colocas $i.

Si estás actualizando dos campos de una misma tabla, puedes hacerlo en la misma línea:

Código PHP:
Ver original
  1. $i++;
  2. $actualizacion = $conexion->query("UPDATE ps_orders SET id_order = " . $i . ", invoice_number = " . $i . " WHERE id_order = " . $datos["id_order"]);

Y para saber si se realizó la actualización:

Código PHP:
Ver original
  1. echo $actualizacion ? "El dato se ha actualizado" : "No se pudo actualizar el dato";

El bucle While recorrerá los datos del array asociativo $datos, el cual contiene los registros de la consulta a la tabla y en cada iteración de éste bucle, se actualizarán uno a uno los registros encontrados. La función fetch_array(), crea un array asociativo con los registros de la consulta.

He notado que estás usando la variable $conn y también a la variable $conexion, en el ejemplo, mi variable de conexión se llama $conexion y realiza la conexión en la primera línea, de modo que te sugiero que uses una de ellas y no ambas porque solamente una funcionará.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #6 (permalink)  
Antiguo 16/12/2013, 10:57
 
Fecha de Ingreso: mayo-2010
Mensajes: 16
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Modificacion masiva PHP y SQL

Cita:
Iniciado por Alexis88 Ver Mensaje
Para mostrar el valor de las filas afectadas, debiste usar dicho método con el objeto de la consulta, es decir, con $consulta y no con la $conexion. Si en una misma iteración colocas ++$i dos veces, en la segunda tendrá un valor superior en 1 a la anterior, en tal caso, coloca $i++ antes de actualizar los datos y en la consulta de actualización, solamente colocas $i.

Si estás actualizando dos campos de una misma tabla, puedes hacerlo en la misma línea:

Código PHP:
Ver original
  1. $i++;
  2. $actualizacion = $conexion->query("UPDATE ps_orders SET id_order = " . $i . ", invoice_number = " . $i . " WHERE id_order = " . $datos["id_order"]);

Y para saber si se realizó la actualización:

Código PHP:
Ver original
  1. echo $actualizacion ? "El dato se ha actualizado" : "No se pudo actualizar el dato";

El bucle While recorrerá los datos del array asociativo $datos, el cual contiene los registros de la consulta a la tabla y en cada iteración de éste bucle, se actualizarán uno a uno los registros encontrados. La función [URL="http://php.net/manual/es/mysqli-result.fetch-array.php"][COLOR="blue"][B]fetch_array()[/B][/COLOR][/URL], crea un array asociativo con los registros de la consulta.

He notado que estás usando la variable $conn y también a la variable $conexion, en el ejemplo, mi variable de conexión se llama $conexion y realiza la conexión en la primera línea, de modo que te sugiero que uses una de ellas y no ambas porque solamente una funcionará.

Saludos
Muchas gracias de nuevo! ya está solucionado!

Un saludo.

Etiquetas: masiva, modificacion, sql
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 09:37.