PHP/MySQL, cómo editar valores de una columna de una tabla con un WHILE?

  • Autor Autor punteral
  • Fecha de inicio Fecha de inicio
P

punteral

Beta
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Hola a todos. Estoy intentado crear una web para adentrarme en el mundo de la programación web. Estoy utilizando XAMPP para administrar la base de datos de la web y por ahora sólo estoy trabajando en modo local desde mi ordenador para ir probando y aprendiendo, todavía no he subido nada a ningún hosting web.

Un apartado de la web consiste en un ranking de jugadores por lo que contiene una tabla donde se indican el nombre y puntuación de los jugadores. Estos datos están ya contenidos en una tabla en la base de datos.

La tabla tiene 6 columnas (POSICIÓN, ID_Jugador, Nombre, Apellido_1, Apellido_2, PUNTOS) con los datos de 5 jugadores.

Utilizando código PHP he conseguido consultar a la base de datos la lista de los jugadores ordenados de mayor a menor según su puntuación y almacenar el resultado en la variable $result.

Insertar CODE, HTML o PHP:
$sql = "SELECT * FROM `FICHAS_JUGADORES` ORDER BY `PUNTOS` DESC";

$result = mysql_query($sql);


Necesitaba un código que me permitiese obtener la posición de cada jugador en el ranking según la cantidad de puntos acumulados, es decir, que después de ordenarlos me dijera el número de fila en el que había quedado cada jugador.

Encontré por internet un código que me permite obtener esa información y mostrar una lista en pantalla indicando la posición, nombre del jugador y cantidad de puntos. Es el siguiente.


Insertar CODE, HTML o PHP:
$i=0;
while($row = mysql_fetch_array($result)) {

    	$i++;
    	echo "rank ".$i." is ".$row['Nombre']." with point ".$row['PUNTOS'];
    	echo "<br/>";
}

El resultado en pantalla es el siguiente:

rank 1 is Israel with point 500
rank 2 is Jairo with point 400
rank 3 is Dámaso Alonso with point 300
rank 4 is Antonio Manuel with point 200
rank 5 is Javier with point 100

Ahora viene el problema. Una de las columnas de la tabla de la base de datos almacena la posición de cada jugador. Me gustaría actualizar en la tabla de la base de datos el valor de la columna "POSICIÓN" con el valor de la posición de cada jugador, pero no tengo ni idea de como conseguirlo.

Llevo bastantes horas intentándolo pero no lo consigo. Con el siguiente código puedo actualizar el valor de la columna, pero todos a un único valor, por lo que no me vale. Yo quiero que se almacene la posición de cada jugador.

Insertar CODE, HTML o PHP:
$pos = mysql_query("UPDATE fichas_jugadores SET POSICIÓN='4'");

Si pudierais darme alguna pista os lo agradecería. Hasta ahora había podido solucionar los problemas por mi cuenta buscando información, pero con esto me he quedado realmente atascado.

Un saludo y gracias por adelantado.
 
[MENTION=34658]punteral[/MENTION] No funcionaria algo como...

PHP:
$i=0;
while($row = mysql_fetch_array($result)) {

    	$i++;
        mysql_query("UPDATE fichas_jugadores SET POSICIÓN='$i' WHERE ID_Jugador='$row['ID_Jugador']'");
    	echo "rank ".$i." is ".$row['Nombre']." with point ".$row['PUNTOS'];
    	echo "<br/>";
}
 
Hola TeltsinGraphs, muchas gracias por responder y además tan rápido. Esa es una de las opciones que he probado y no funciona. Me deja los valores de la columna "POSICIÓN" tal y como estaban. Aunque de todas maneras creo que tiene un fallo.

Por ejemplo en la primera ronda con "i=1" actualizaría a 1 el valor de "POSICIÓN" del jugador con ID_Jugador = 1, el cual en este caso no es el jugador que más puntos tiene, por lo que no sería correcto.

De todas maneras ni siquiera consigo eso. Me deja los valores tal y como están y no sé por qué.

Un saludo y gracias otra vez. Si se te ocurre alguna posibilidad para probar estoy encantado de intentarlo porque ya no sé que más intentar.
 
[MENTION=34658]punteral[/MENTION] pero si organizaste los jugadores por mayor puntuacion cuando hagas el while entonce $i seria = 1 y ID_Jugador seria $row['ID_Jugador'] el cual tendra el id del primer jugador no específicamente 1, no se si me entiendes!
 
Ok, es cierto, precisamente ahora me estaba dando cuenta de lo que comentas, creo que tienes razón. Voy a copiar el código entero (es corto) para ver si puede ser que esté metiendo la pata en algo en otro lado.

PHP:
<!DOCTYPE html>
	<html lang="en">
		<head>
			<meta charset="UTF-8">
			<title>Jugadores</title>
		</head>

		<body>

			<h3>JUGADORES<h3>

			<?php
				//REALIZA LA CONEXION
			$link = mysql_connect("localhost","root","");
				//SELECCIONA LA BASE DE DATOS "USUARIOS"
			mysql_select_db("rankingtenis",$link);
				//Para que se muestren las tildes
			mysql_query("SET NAMES 'utf8'"); 
				//CONSULTA TODOS LOS DATOS DE LA TABLA "FICHAS_JUGADORES", LOS ALMACENA EN LA VARIABLE $RESULT Y LOS ORDENA SEGÚN LA COLUMNA "PUNTOS"
			$sql = "SELECT * FROM `FICHAS_JUGADORES` ORDER BY `PUNTOS` DESC";
			$result = mysql_query($sql);

			$i=0;
while($row = mysql_fetch_array($result)) {

        $i++;
        mysql_query("UPDATE fichas_jugadores SET POSICIÓN='$i' WHERE ID_Jugador='$row['ID_Jugador']'");
        echo "rank ".$i." is ".$row['Nombre']." with point ".$row['PUNTOS'];
        echo "<br/>";
}  

			mysql_free_result($result);
			mysql_close($link);

			?>
		</body>
	</html>

Y esta sería la tabla:

tabla fichas_jugadores.webp
 
Última edición:
[MENTION=34658]punteral[/MENTION] la veo bien, no te esta funcionando?
 
Acabo de dar con un error, pero no lo voy a decir porque me da vergüenza no haberme dado cuenta, sólo diré que no era un error de código. Sin embargo todavía no sé si funciona ya que ahora me indica el siguiente error:

Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\xampp\htdocs\Proyectos\rankingtenis\Jugadores_7.php on line 27

La línea 27 es esta:

PHP:
mysql_query("UPDATE fichas_jugadores SET POSICIÓN='$i' WHERE ID_Jugador='$row['ID_Jugador']'");

PHP:
<!DOCTYPE html>
	<html lang="en">
		<head>
			<meta charset="UTF-8">
			<title>Jugadores</title>
		</head>

		<body>


			<h3>JUGADORES<h3>

			<?php
				//REALIZA LA CONEXION
			$link = mysql_connect("localhost","root","");
				//SELECCIONA LA BASE DE DATOS "USUARIOS"
			mysql_select_db("rankingtenis",$link);
				//Para que se muestren las tildes
			mysql_query("SET NAMES 'utf8'"); 
				//CONSULTA TODOS LOS DATOS DE LA TABLA "FICHAS_JUGADORES", LOS ALMACENA EN LA VARIABLE $RESULT Y LOS ORDENA SEGÚN LA COLUMNA "PUNTOS"
			$sql = "SELECT * FROM `FICHAS_JUGADORES` ORDER BY `PUNTOS` DESC";
$result = mysql_query($sql);
$i=0;
while($row = mysql_fetch_array($result)) {

        $i++;
        mysql_query("UPDATE fichas_jugadores SET POSICIÓN='$i' WHERE ID_Jugador='$row['ID_Jugador']'");
        echo "rank ".$i." is ".$row['Nombre']." with point ".$row['PUNTOS'];
        echo "<br/>";
}  

			mysql_free_result($result);
			mysql_close($link);

			?>

		</body>

	</html>
 
[MENTION=34658]punteral[/MENTION] Prueba de esta forma a ver!

PHP:
mysql_query("UPDATE fichas_jugadores SET POSICIÓN='".$i."' WHERE ID_Jugador='".$row['ID_Jugador']."'");
 
Me indica el siguiente error en la misma línea.

Parse error: syntax error, unexpected '". ' "' (T_CONSTANT_ENCAPSED_STRING) in C:\xampp\htdocs\Proyectos\rankingtenis\Jugadores_7.php on line 27

- - - Actualizado - - -

FUNCIONAAA!!!

No se muy bien que ha pasado. Lo copié tal cual y no funcionaba. Probé quitando y poniendo comillas en varios sitios y nada. Lo borré todo, lo volví a copiar otra vez igual y ahora funciona perfecto. Mil gracias YeltsinGraphs!!
 
Última edición:
Me indica el siguiente error en la misma línea.



- - - Actualizado - - -

FUNCIONAAA!!!

No se muy bien que ha pasado. Lo copié tal cual y no funcionaba. Probé quitando y poniendo comillas en varios sitios y nada. Lo borré todo, lo volví a copiar otra vez igual y ahora funciona perfecto. Mil gracias YeltsinGraphs!!

Que bien man :encouragement:
 
Una recomendación, no almacenes la posición.

La posición es lo que llamaríamos un campo calculado, es decir, que puedes obtenerlo con los datos de la tabla y por tanto no es necesario almacenarlo.

Un ejemplo claro de esto es la edad de un usuario. Si tienes un campo donde almacenas la fecha no te hace falta otro para almacenar la edad ya que tendrías que estar cambiándolo constantemente, simplemente cuando necesites la edad haces la consulta a la fecha y la calculas.
 
Ok, gracias Carrega. Había leído sobre los campos calculados precisamente buscando información para resolver el problema de la posición. Pero ante las dificultades que estaba teniendo para obtener este dato pensé en almacenarlo a buen recaudo en la base de datos.

La edad es otro dato que utilizaré en la tabla. Para ese sí que pensé en hacerlo como tú comentas, sin embargo el dato de la posición me ha parecido más complejo de obtener y no sabía si iba me iba a causar problemas para volver a conseguirlo más adelante.

De todas maneras me falta muuucha experiencia, supongo que uno se da cuenta de esas cosas a medida que va practicando. Gracias por el apunte y encantado de seguir aprendiendo con vosotros. Un saludo :encouragement:
 
Me indica el siguiente error en la misma línea.



- - - Actualizado - - -

FUNCIONAAA!!!

No se muy bien que ha pasado. Lo copié tal cual y no funcionaba. Probé quitando y poniendo comillas en varios sitios y nada. Lo borré todo, lo volví a copiar otra vez igual y ahora funciona perfecto. Mil gracias YeltsinGraphs!!


Copiar y pegar cuando hay comillas simples o dobles de por medio malo, casi siempre se interpretan mal.

Me alegro de que se solucionara aunque llego tarde.
 
Se agradece el consejo. Lo copié y pegué porque no me fiaba de mí mismo transcribiendo tantas comillas simples, dobles, paréntesis, espacios, etc.

Estaba seguro que en alguno metería la pata y pensaba que el copia y pega funcionaba bien. Pero a partir de ahora lo identificaré como una posible fuente de errores. Gracias y un saludo. :encouragement:
 
Una solución mas simple es que cuando te traes la lista de usuarios en vez de recorrerla y realizar un update (lo cual es una burrada ya que si tienes 1000 usuarios realizaras 1000 consultas), con la posición en la que se encuentra los datos de un usuario concreto dentro de la lista obtienes la posición del usuario (teniendo en cuenta que empieza en 0).
 
Hola Carrega, tienes razón, gracias por la ayuda. El problema es que no sé como obtener la posición de cada jugador de otra manera. La única manera que encontré fue con el WHILE y el "mysql_fetch_array" para cada fila de la tabla y me costó conseguirlo

¿Cómo puedo obtener la posición en la que se encuentran los datos de los jugadores después de haberlos ordenado según su puntuación?
 
Para empezar el mysql_fetch esta obsoleto, puedes comprobarlo en la documentación oficial de PHP. En mi caso para atacar a la bse de datos utilizo PDO aunque hay diferentes opciones.

PHP: PDO - Manual

Ahora tu realiza a la base de datos la siguiente consulta:

SELECT * FROM usuario ORDER BY puntos DESC

La cual se almacenara en una variable que dependiendo el sistema que utilices para atacar a la base de datos tendrás un método para recorrer esos resultados.

En el caso de PDO por ejemplo con fetchAll() puedes guardar esos datos en un array:

PHP: PDOStatement::fetchAll - Manual

Por ultimo, solo tienes que recorrer ese array y conforme vayas imprimiendo cada usuario indicas el indice del array.

No se si ahora lo ves mas claro.
 
Ok, muchas gracias Carrega. Voy aprendiendo con la información que voy encontrando según voy hallando problemas al desarrollar la web, por lo que la mayoría de los métodos que utilizo son los de las explicaciones que consigo entender con mis conocimientos básicos.

Es por esto que seguramente en muchos casos mis métodos son ineficientes o incluso anticuados. Pero gracias a vuestros consejos puedo orientarme e investigar con más acierto los métodos adecuados.

El tema de PDO sólo lo he escuchado de pasada y no lo conozco. Mañana buscaré información sobre el método que propones a ver si consigo aprender sobre él para después aplicarlo a mi web.

Por lo que indicas en tu mensaje creo que la clave para realizar la tarea está en obtener el índice del array. Buscaré como hacer eso.

Un saludo y muchas gracias por la ayuda. :encouragement:
 
Última edición:
PHP CRUD Tutorial (part 1)

Es normal que al principio cometas esos errores y mas si eres autodidacta, ya que rara vez encuentra uno un buen curso con todo bien desglosado.

Si tienes cualquier duda o problema solo tienes que preguntar 😉

EDIT:

Si recorres el array con un bucle, el propio indice que utilizas en el bucle para avanzar es el que utilizas para la posicion, recordando siempre que empieza en 0 y no 1. O puedes crear una variable auxiliar que haga de contador y por cada usuario que recorras sumas 1.
 
Última edición:
Ok, gracias Carrega. Creo que lo voy viendo más claro gracias a tu ayuda. En principio lo he entendido, pero lo comprobaremos cuando llegue a esa parte de la página web y tenga que aplicarlo. :witless:
 
Atrás
Arriba