PHP - Actualizar un campo en varias filas de una tabla mysql de manera incremental

 
Vista:

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por Santiago (185 intervenciones) el 08/05/2020 15:58:03
Hola amigas/os, verán tengo un problema a ver si me pueden ayudar.

Estoy intentando, sin exito, poder actualizar con el "update" de mysql, un mismo campo

que está en varias filas de una misma tabla es decir algo asi:

tabla llamada accesos:

campo_id, campo_numero_acceso

El campo llamado "campo_numero_acceso", debe ser incremetal, es decir

en la primera fila de la tabla debe valer 1, en la segunda fila de la tabla 2, .....etc

pero el código que tengo no me funciona bien, ya que me rellena el campo "campo_numero_acceso" en todas las filas con el mismo valor osea 5 en vez de rellenarmelos con:
1
2
3
4
5

Miren este es el código que tengo:

1
2
3
4
5
6
for ($i=1; $i <= 5; $i++)
{
    $sql = "UPDATE accesos SET numero_acceso=$i";
 
    mysqli_query($con,$sql) or die (mysqli_error($con));
}

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Julio
Val: 2.007
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por Julio (830 intervenciones) el 08/05/2020 17:17:14
Hola.

Es evidente lo que te pasa, ahora verás, y es porque no le estás dando ninguna condición. La sentencia UPDATE accesos SET numero_acceso=$i te está cambiando TODAS LAS FILAS de la tabla, absolutamente todas.

Entonces tienes que, cuando $i vale 1, te cambia todas las filas y te pone numero_acceso con valor 1 en todas las filas. En la siguiente iteración te pone todas las filas con valor 2, luego con 3, luego con 4 y, al final, todas con valor 5 que es lo que acabas viendo.

Por tanto, tendrás que especificarle qué fila quieres cambiar cada vez (tendrás que ponerle un id a la fila o algo que la identifique).

-----------------------------
Aprende la programación desde una perspectiva básica y simplista en Programación Básica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por Sam (185 intervenciones) el 08/05/2020 17:22:38
Hola Julio, gracias de ante mano. mira:
Si, he probado ya a ponerle una condición en modo "where id=3", por ejemplo.

Pero solo me cambia para esa fila con id = 3 y en su respectivo campo me pone el 5.

Pero no me cambia el resto de campos de las demas filas. Y menos aun que vaya de menos a mas es decir 1,2,3,4,5

:-(
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Julio
Val: 2.007
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por Julio (830 intervenciones) el 08/05/2020 17:34:58
¿Pero cómo lo haces? A ver, tienes que hacer 5 consultas distintas:

1
2
3
4
5
$sql = "UPDATE accesos SET numero_acceso=1 WHERE id=1";
$sql = "UPDATE accesos SET numero_acceso=2 WHERE id=2";
$sql = "UPDATE accesos SET numero_acceso=3 WHERE id=3";
$sql = "UPDATE accesos SET numero_acceso=4 WHERE id=4";
$sql = "UPDATE accesos SET numero_acceso=5 WHERE id=5";

Si coincide el id con el número de acceso que quieres, perfecto, podrás ponerlo en un while como el que has puesto. Pero si no es así (y sintiéndolo mucho es normal que no coincida), entonces tendrás que hacerlo uno por uno.

-----------------------------
Aprende la programación desde una perspectiva básica y simplista en Programación Básica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de javier
Val: 1.542
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por javier (547 intervenciones) el 08/05/2020 19:52:16
Hola,

si el campo ha de ser incremental, hazlo en MySQL, dfinelo en PHPMyADMIN como AUTOINCREMENT, no le pases valores, se incrementa solo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por Santiago (185 intervenciones) el 13/05/2020 12:05:34
Hola, lo primero de todo agradecer a todos por vuestras ayudas.

Decir que ya he encontrado la solución, razón por la cual mi tardanza en responder.

Paso a explicar:

Son varias filas con un campo en cada una de ellas llamado "numero_acceso".

debo utilizar el update de sql , por que en mi caso si borro alguna fila, el resto de filas deben reenumerarse es decir si tengo

1
2
3
y borro el 2

quedaría
1
3

pero con este código que os voy a poner que es la solución, quedaría
1
2

Una vez dicho esto pongo el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Conecto con la bd
$con = $this->ConectarBbdd();
 
 
// Selecciono los ids de cada una de las filas
$sql_ficheros = "SELECT id FROM tabla_accesos_ficheros";
 
$res_accesos = mysqli_query($con,$sql_ficheros) or die ('Lo siento no se han mostrado los datos.' . mysqli_error($con));
 
 
// Mediante dos bucles anidados, el primer foreach servirá para obtener las keys(claves) de dicho bucle que servirán para usarlas como los números ordenados que necesito para cada uno de los accesos
 
foreach($res_accesos as $nums_accesos=>$accesos)
 
    {
 
// Este segundo foreach servirá para obtener los ids de cada una de las filas
 
// para crear la sentencia update de sql
 
        foreach ($accesos as $id)
 
            {
// La siguiente linea suma 1, ya que un array , el primer valor, su key (clave), vale cero.
 
// Y claro las id en una tabla empiezan por uno y no por cero. por eso se suma 1.
 
                $incremento_nums_accesos = ($nums_accesos+1);
 
 
// La siguiente linea es para colocar 2 ceros delante del "numero de acceso", ya que el numero de acceso debe tener 3 digitos, por ejemplo si el numero de acceso es 5, pues quedaría 005.
 
                $formato_nums_accesos = str_pad($incremento_nums_accesos, 3, "00", STR_PAD_LEFT);
 
 
// Y aquí estaría la sentencia update sql, que actualiza cada campo de cada fila de manera 001,002,003,004,005
//y que si borro por ejemplo 003 , se actualizaría quedando así:
 
//001,002,003,004
 
                $sql = "UPDATE tabla_accesos_ficheros SET numero_acceso='".$formato_nums_accesos."' WHERE id=".$id;
 
 
                mysqli_query($con,$sql) or die (mysqli_error($con));
            }
    }

Espero que se entienda bien y que sirva a quien necesite algo parecido a esto.

Si pudieran decirme, comentarme que les parece el código, se los agradecería mucho.

Un cordial saludo a todos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Julio
Val: 2.007
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por Julio (830 intervenciones) el 13/05/2020 12:15:57
Hola.

Es difícil decirte qué nos parece el código sin entender qué quieres hacer. Yo, sinceramente, no entiendo cuál es la lógica de lo que quieres hacer en cuanto a actualizar esa tabla.

-----------------------------
Aprende la programación desde una perspectiva básica y simplista en Programación Básica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por Santiago (185 intervenciones) el 13/05/2020 12:21:59
Hola Julio, lo he comentado en mi anterior post.

Tengo una serie de filas con un campo en comun en cada una de ellas llamado "numero_accesos", estos numero de accesos.

Si borro un numero de acceso intermedio el resto debe reordenarse actualizando claro.

En el mundo real seria :

Existen una serie de ficheros y cada uno de ellos con un numero de acceso.

Al borrar un fichero , el resto de ficheros que queden deben reordenar , reenumerar sus respectivos numeros de acceso para que estén en orden.

No deben quedar numeros salteados .

Espero que ahora me entiendas mejor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de javier
Val: 1.542
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por javier (547 intervenciones) el 13/05/2020 12:38:48
Hola, el codigo esta bien si hace lo que tu quieres, lo unico es que no veo donde haces esto:

// Y aquí estaría la sentencia update sql, que actualiza cada campo de cada fila de manera 001,002,003,004,005
//y que si borro por ejemplo 003 , se actualizaría quedando así:

//001,002,003,004

donde se ordenan o actualizan?

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por Santiago (185 intervenciones) el 13/05/2020 14:23:49
Hola Javier te explico:

Imagina:

tabla_accesos_ficheros
------------------------------------------------------
id = 34 | numero_acceso 001
id = 57 | numero_acceso 002
id = 65 | numero_acceso 003

Imagina que borras la fila con id = 57, entonces te quedaria esto:

tabla_accesos_ficheros
------------------------------------------------------
id = 34 | numero_acceso 001
id = 65 | numero_acceso 003

Y esta linea

1
$sql = "UPDATE tabla_accesos_ficheros SET numero_acceso='".$formato_nums_accesos."' WHERE id=".$id;

lo que hace es dejartelo asi:

tabla_accesos_ficheros
------------------------------------------------------
id = 34 | numero_acceso 001
id = 65 | numero_acceso 002

Quedando los "numeros_accesos", correlativos 001,002

¿Lo entiendes ahora mejor Javier?

En el mundo real bien podrían ser facturas y cada una de ellas con un codigo. La 001, 002,003 etc...
Al borrar una factura, el resto se reenumerarian, se reordenarian sus numeros para no dejar huecos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de javier
Val: 1.542
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por javier (547 intervenciones) el 13/05/2020 14:33:28
en el mundo real si una factura tiene una referencia, la tiene para siempre, se elimine o no

no digo que un dia tiene una refencia tal y al dia siguiente, como he borrado una factura, ahora reordeno y cambio las referencias de todas las facturas que vienen despues.

imagina que a un cliente le mandas una factura con una referencia, perfecto

pero tu al dia siguiente, como has borrado una factura intermedia, te viene el cliente con una refencia que tu le diste y ya o no existe o esa referencia pertenece a otra persona o a otra factura. Por que como has reordenado.....

sabes algo del modelo relacional de BBDD? este es uno de sus principios, una factura, una referencia que nunca cambia

Y esta linea:
1
$sql = "UPDATE tabla_accesos_ficheros SET numero_acceso='".$formato_nums_accesos."' WHERE id=".$id;

no reordena nada, lo reordena el bucle. Por eso te hice la pregunta, por que crees que es esa linea la que reordena algo y esa fila solo hace UPDATE en una tabla.

A mi entender, es absurdo e innecesario lo que estas haciendo si es que es para usar, como comentas, en la vida real, con facturas.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Julio
Val: 2.007
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por Julio (830 intervenciones) el 13/05/2020 14:27:53
Si es así, es así, pero, ¿por qué no deben quedar números salteados? Quiero decir, a nivel de ordenar los elementos da igual que sean 1, 2, 3, 4 que 1, 5, 7, 9.

De todas formas, el código puede mejorar. ¿Por qué recorres la primera vez para obtener las claves, si las claves son simplemente numéricas? Puedes ahorrarte ese paso y tener simplemente una variable que empiece en 1 y en cada iteración vaya sumando uno más, ¿no? De la forma que haces es ineficiente, estás recorriendo el array la primera vez para obtener simplemente los valores 0, 1, 2, 3, 4, 5, 6, 7, 8, etc. No necesitas recorrer el array para obtenerlos.

-----------------------------
Aprende la programación desde una perspectiva básica y simplista en Programación Básica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por Santiago (185 intervenciones) el 13/05/2020 15:38:15
Hola Julio, veras:

El que no puedan haber números salteados no tiene que ver con un capricho de programación. Sino con las necesidades

del usuario. Ya que el usuario en este caso necesita que sean números que no sean salteados. Y lo que pide el cliente-usuario hay que obedecerle, ya me entiendes.

Por otro lado te comento:

El primer foreach me proporciona dos cosas, por un lado, las claves de cada uno de los items del array que usuaré como ese numero incremental que necesito y por otro lado me proporciona un array (valor del item) que debo recorrer con un segundo foreach (el anidado), que ese me proporciona los ids de cada una de las filas.

De ningún otro modo puedo conseguir ambas cosas a la vez, ya que , por ejemplo, con un contador while solo me daría los números incrementándose +1 pero no los ids de las filas que también necesito.

Con los foreach anidados se hacen las dos cosas a la vez, simultáneamente.

Te diría también que esto es así ya que se trata de un array que está dentro de otro array, así que por eso uso dos foreach anidados, revisa el código que he puesto , se puede ver ahí.

Pero si se puede mejorar el código con alguna nueva propuesta mas optimizada, por mi parte será bien recibida siempre :-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de javier
Val: 1.542
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por javier (547 intervenciones) el 13/05/2020 16:27:24
sigue siendo absurdo e innecesario, has de comentarselo al cliente, que el sabrá lo que quiere, pero tu, le has de decir lo que es mas conveniente en programacion.

hoy me das una factura nº 2 y a otro una factura nº3, si mañana borras la 1ª , mi factura ahora no es la nº2 !!es la nº 1

valla lio le vas a organizar al cliente.

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Julio
Val: 2.007
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por Julio (830 intervenciones) el 13/05/2020 16:33:25
Ok a lo primero.

Pero no me has entendido lo segundo. Tú tienes algo así (he puesto muchos echo para verlo):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$res_accesos = array(
	0 => array('id' => 3),
	1 => array('id' =>5),
	2 => array('id' => 7)
);
 
foreach ($res_accesos as $num_accesos => $accesos) {
	echo 'ITERACIÓN DEL PRIMER FOREACH<br>';
	echo '$num_accesos = ' . $num_accesos . '<br>';
	echo '$accesos = '; var_dump($accesos); echo '<br>';
 
	foreach ($accesos as $id) {
		echo 'ITERACIÓN DEL SEGUNDO FOREACH<br>';
		echo '$id = ' . $id . '<br>';
 
		$incremento_nums_accesos = ($num_accesos + 1);
		$formato_nums_accesos = str_pad($incremento_nums_accesos, 3, '00', STR_PAD_LEFT);
 
		echo $formato_nums_accesos . '<br>';
	}
 
	echo '<br>';
}

Que por pantalla me muestra esto:

ITERACIÓN DEL PRIMER FOREACH
$num_accesos = 0
$accesos = array(1) { ["id"]=> int(3) }
ITERACIÓN DEL SEGUNDO FOREACH
$id = 3
001

ITERACIÓN DEL PRIMER FOREACH
$num_accesos = 1
$accesos = array(1) { ["id"]=> int(5) }
ITERACIÓN DEL SEGUNDO FOREACH
$id = 5
002

ITERACIÓN DEL PRIMER FOREACH
$num_accesos = 2
$accesos = array(1) { ["id"]=> int(7) }
ITERACIÓN DEL SEGUNDO FOREACH
$id = 7
003


Lo que te digo es que estás recorriendo el primer array para recoger el 0, el 1, el 2, etc. y luego recorriendo de nuevo el segundo array para obtener el id, ¡y no necesitas hacer eso! Ya tienes todo eso recorriéndolo una vez. Fíjate, si yo cambio todo lo de arriba y pongo esto:

1
2
3
4
5
foreach ($res_accesos as $indice => $acceso) {
	$formato_nums_accesos = str_pad($indice + 1, 3, '00', STR_PAD_LEFT);
 
	echo 'El número de acceso es ' . $formato_nums_accesos . ' para cambiar el id ' . $acceso['id'] . '<br>';
}

Por pantalla me imprime:

El número de acceso es 001 para cambiar el id 3
El número de acceso es 002 para cambiar el id 5
El número de acceso es 003 para cambiar el id 7


Por eso te decía que estás haciendo trabajo innecesario recorriendo dos veces el bucle cuando no lo necesitas. Con esto te debería valer:

1
2
3
4
5
foreach ($res_accesos as $indice => $acceso) {
	$formato_nums_accesos = str_pad($indice + 1, 3, '00', STR_PAD_LEFT);
	$sql = "UPDATE tabla_accesos_ficheros SET numero_acceso='". $formato_nums_accesos . "' WHERE id=". $acceso['id'];
	mysqli_query($con, $sql) or die (mysqli_error($con));
}

Recorres el array (que ya tiene el índice numérico que necesitas), creas el número con el formato que quieres y actualizas accediendo directamente al campo 'id' del array.

-----------------------------
Aprende la programación desde una perspectiva básica y simplista en Programación Básica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Actualizar un campo en varias filas de una tabla mysql de manera incremental

Publicado por Santiago (185 intervenciones) el 15/05/2020 13:29:16
Hola Julio, perdona la tardanza en contestarte, no he podido antes.

Decirte que he probado tu código optimizado y efectivamente tienes razón.

Tu código está mas optimizado, estaba tan inmerso en solucionar el problema, que me había pasado de frenada.

Lo solucione, sí, pero lo complique añadiendo mas código sobrante.

Gracias por simplificármelo.

Ya dice el dicho: Menos es mas.

Un cordial saludo Julio y a la comunidad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar