Tomar datos de Base de datos y mostrarlos en la web [Ayuda]

Pero me ha aparecido un mensaje en la web que no debería de haber salido. "Una fila afectadaErrores:"

Ese mensaje lo puse por si es que ocurre un error, pero si dice "Cualquier cosaErrores:" y nada sigue de Errores:, entonces no hay problema, el script funcionó.

Otra cuestión, el campo puntos INT (2) ¿tiene que ser 2 por algún motivo? A mi me interesa que por lo menos sea un INT (10) ya que se van a introducir...

No, no pasa nada si lo cambias. Yo puse 2 porque supuse que iban a ser 99 a lo mucho el puntaje máximo.

Las pruebas que tu has hecho han sido con las ID comenzando en 1,2,3,4. etc... sin haber borrado ninguna fila de datos. Eso hace que en ambas tablas coincidan las ID

Eso es porque el script anterior (que yo hice) tenía varios fallos y las referencias no eran correctas. Pero ya lo resolviste, así que felicitaciones :D.
Estoy probando ahora creando una tercera columna e insertando el contador... vamos a ver...
He hecho el contador de la siguiente manera

 <tr>
     <td>
       <?php 
	   echo $row['nombre_jugador']; 
	?>
	</td>
         
        <td>
	<?php 
	   echo $row['puntos']; 
	 ?>
	</td>
		
	<td>
	<?php 
	    $contador = 1;

	    while( $contador < ($rows+1) ) {
  	    echo $contador . '<br />';
	    $contador++ ;
	                 				}  
	 ?>
								
	</td>

         </tr>
        <?php

Entiendo que estoy cerca del objetivo, ya que el numero de rows es el número de jugadores que hay en la clasificación (el +1 lo pongo porque empiezo a contar en 1, y no en 0)

El problema es que yo quiero que salga asi:

ZID -- 44 -- 1
RAR -- 33 -- 2
RER -- 22 -- 3

Pero me sale esto otro

ZID - 44 -- 1
----------- 2
----------- 3
RAR --33 --1
----------- 2
----------- 3
RER--22 -- 1
----------- 2
----------- 3


Asi que lógicamente algo estoy haciendo mal.

Por otro lado, ese sería el contador fácil. Luego querría hacer otro que no solo vaya descontando de 1 en 1, sino que para los 3 primeros reste 5, del cuarto al decimo reste 2, y a partir de ahi reste de 1 en 1. Tendria que salir algo asi


ZID -- 44 -- 1 -- 40
RAR -- 33 -- 2 -- 35
RER -- 22 -- 3 -- 30
LEL -- 19 -- 4 -- 28
POP -- 17 -- 5 -- 26
RRR -- 12 -- 6 -- 24

Columna 1: Nombre (Ya los tenemos)
Columna 2: Puntos introducidos en el formulario (Ya los tenemos)
Columna 3: Posicion en la clasificacion (Estoy en ello :P )
Columna 4: Puntos obtenidos por haber quedado en esa posición en la clasificación. Algo así como en la formula 1, que el primero se lleva 25 puntos el segundo 18, etc...
Y ya la ultima de las cosas. Si consigo hacer eso, ¿PHP luego sabrá que quien ha obtenido ese 2 y ese 35 ha sido RAR o en realidad PHP solo sabe que tanto 2 como 35 han ido a parar al segundo dato de la tabla una vez hecha la consulta, sin saber realmente que el segundo jugador de la clasificacion es RAR
Asi que lógicamente algo estoy haciendo mal.

Definitivamente hay algo malo :P. Un par de pistas: debe haber un único while() y $contador = 1; debes escribirlo antes del while que recorre las filas.

Por otro lado, ese sería el contador fácil. Luego querría hacer otro que no solo vaya descontando de 1 en 1, sino que para los 3 primeros reste 5, del cuarto al decimo reste 2, y a partir de ahi reste de 1 en 1. Tendria que salir algo asi


ZID -- 44 -- 1 -- 40
RAR -- 33 -- 2 -- 35
RER -- 22 -- 3 -- 30
LEL -- 19 -- 4 -- 28
POP -- 17 -- 5 -- 26
RRR -- 12 -- 6 -- 24

Eso es distinto, porque el contador sólo servirá para la tercer columna y no la cuarta. La cuarta columna tendría que sera otra variable, pero no te daré la solución ahora porque te tendría que dar la solución para arreglar el contador XD.

Y ya la ultima de las cosas. Si consigo hacer eso, ¿PHP luego sabrá que quien ha obtenido ese 2 y ese 35 ha sido RAR o en realidad PHP solo sabe que tanto 2 como 35 han ido a parar al segundo dato de la tabla una vez hecha la consulta, sin saber realmente que el segundo jugador de la clasificacion es RAR

Lo que pasa es que las últimas dos columnas son datos estáticos, o sea, se pueden construir en base a variables en PHP y no necesitan estar asociados a un usuario. De hecho, si asociaras el 40 y la posición 1 a ZID (que obtuvo 44 puntos), entonces nunca ganaría otro jugador. Lo único que se debe asociar es el jugador y el puntaje, porque no sabes quién realmente será el primer lugar.

Falta una cosa. En el archivo index.php, busca la línea $query = "SELECT * FROM jugador LEFT JOIN puntuacion USING (jugador_id)"; y modificala:

$query = "SELECT * FROM jugador LEFT JOIN puntuacion USING (jugador_id) ORDER BY puntos DESC";

De esta forma quedará ordenado en base a los puntos obtenidos de mayor a menor.

Hace un rato preguntaste esto:

No tendría más sentido poner <input type="numb"?

Sí, tendría más sentido. No obstante tienes que tener en cuenta que <input type="number" /> no esta soportado por todos los navegadores y se convertirá en un <input type="text" /> cuando no lo este.
Definitivamente hay algo malo :P. Un par de pistas: debe haber un único while() y $contador = 1; debes escribirlo antes del while que recorre las filas.

Mmm, entiendo que cuando dices que debe haber un único while, el while que recorre las filas no cuenta, porque si cuenta, ese y el while de $contador ya serían 2.

Bueno haré pruebas de las dos maneras a ver que sale :D

EDIT: Bien, lo logre!! Tenía que cambiar el while por un if!!!!! Hurraaaaa!!!

Ahora voy a intentar el segundo contador, y este en realidad tendrían que ser o tres contadores o uno con una formulación bastante larga, porque primero resta de 5 en 5, luego de 2 en 2, y luego de 1 en 1, veamos.... asi a simple vista imagino que sera con 3 IF encadenados...

Eso es distinto, porque el contador sólo servirá para la tercer columna y no la cuarta. La cuarta columna tendría que sera otra variable, pero no te daré la solución ahora porque te tendría que dar la solución para arreglar el contador XD.

Si consigo hacer uno creo que seré capaz de hacer el otro. Mi problema ahora mismo como ves no es de hacer el contador, que lo hago, sino de saber donde ponerlo para que los numeros salgan donde yo quiero que salgan xD


Lo que pasa es que las últimas dos columnas son datos estáticos, o sea, se pueden construir en base a variables en PHP y no necesitan estar asociados a un usuario. De hecho, si asociaras el 40 y la posición 1 a ZID (que obtuvo 44 puntos), entonces nunca ganaría otro jugador. Lo único que se debe asociar es el jugador y el puntaje, porque no sabes quién realmente será el primer lugar.

Bueno, estoy ya no me preocupa tanto. Entiendo que la unica manera es tener todos los datos en tablas y obtenerlo todo mediante consultas. Precisamente este año curso MySQL asi que tendre toooooodo el año para ser capaz de hacerlo con tablas :D

Falta una cosa. En el archivo index.php, busca la línea $query = "SELECT * FROM jugador LEFT JOIN puntuacion USING (jugador_id)"; y modificala:

Gracias!! Pero por fin puedo decir que ya lo habia modificado yo!! Por una vez he hecho algo bien adelantandome :D


-----

Te cuento como tenia yo hecho todo lo que llevamos hecho hasta ahora. Es muy muy basico pero da el mismo resultado.

Tengo solo una tabla, y creo un usuario_id como clave primaria.
Luego el campo nombre lo hago UNIQUE
Y ahora las entradas de datos las hago con REPLACE

De esta forma cuando un usuario volvia a introducir una nueva puntuacion, tanto el nombre como la puntuacion nuevas borraban las antiguas.

Luego hacia la consulta con un simple SELECT * FROM jugador ORDER BY PUNTOS DESC

y con un while obtenia todas clasificaciones actualizadas.

El unico "fallo" era que cada vez que un usuario introducia una nueva puntuacion, el usuario_id hacia +1, pero para una tabla con un usuario_id INT (11) no creo que nunca faltaran numeros para usuario_id :D

¿Que te parece? Simple pero efectivo :D
Jejeje, acabo de ver que has introducido tu nombre pero sin ningun puntaje, ¿algun tipo de prueba a ver si funciona o falla?

Ahora tienes la ID 6 en la tabla de nombres, pero no tienes nada asociado en la otra.
Lo logré!! He logrado el cuarto contador :D

Creo que los contadores es de lo poco que se me da bien :D


EDIT: Bueno, me falta un pequeño detalle, y es que al llegar a 0, si se introduce una nueva puntuacion PHP asigna -1, -2 etc... ¿Que podria hacer para parar en 0?

EDIT: Conseguido tambien, con un IF, dos ELSE IF, y un ELSE :D
Jejeje, acabo de ver que has introducido tu nombre pero sin ningun puntaje, ¿algun tipo de prueba a ver si funciona o falla?

Ahora tienes la ID 6 en la tabla de nombres, pero no tienes nada asociado en la otra.

La verdad es que falló XD, pero no me apareció ningún error. Supongo que en algún lugar estas cortando los nombres, ¿no? (para que aparezcan solo tres letras). Si es así, entonces ten cuidado donde lo haces. Ahora lo modifiqué y funcionó. Tengo 99 puntos (aunque no se de qué ¬¬).

Lo logré!! He logrado el cuarto contador :D

Creo que los contadores es de lo poco que se me da bien :D


EDIT: Bueno, me falta un pequeño detalle, y es que al llegar a 0, si se introduce una nueva puntuacion PHP asigna -1, -2 etc... ¿Que podria hacer para parar en 0?

EDIT: Conseguido tambien, con un IF, dos ELSE IF, y un ELSE :D

Me alegro :D. No sé lo que has hecho, pero una solución era:

<?php
  $columna4 = 40;

  while( $row = blah_blah... ) {
    if( $columna4 > 1 ) {
      if( $contador <= 3 )
        $columna4 -= 5;
      elseif( $contador > 3 && $contador < 11 )
        $columna4 -= 2;
      else
        $columna4 -= 1;
    }
?>
  <td><?php echo $columna4 ?></td>
<?php
    $contador++;
  } // Fin While.
?>

Saludos.
skaparate escribió:La verdad es que falló XD, pero no me apareció ningún error. Supongo que en algún lugar estas cortando los nombres, ¿no? (para que aparezcan solo tres letras). Si es así, entonces ten cuidado donde lo haces. Ahora lo modifiqué y funcionó. Tengo 99 puntos (aunque no se de qué ¬¬).

Me alegro :D. No sé lo que has hecho, pero una solución era:

<?php
  $columna4 = 40;

  while( $row = blah_blah... ) {
    if( $columna4 > 1 ) {
      if( $contador <= 3 )
        $columna4 -= 5;
      elseif( $contador > 3 && $contador < 11 )
        $columna4 -= 2;
      else
        $columna4 -= 1;
    }
?>
  <td><?php echo $columna4 ?></td>
<?php
    $contador++;
  } // Fin While.
?>

Saludos.

Te falló porque la tabla de la base de datos tiene un VARCHAR(3). Esto lo he hecho porque en realidad no se va a poner nombre, sino las iniciales. La competicion va a ser de videojuegos, asi que asi se parece mas. Luego en el formulario limitare a 3 letras la recogida de datos, pero como todavia no lo habia hecho, por eso te dejo poner tu nombre y luego la tabla no lo aceptó.

En tu caso tienes 99 puntos... al Tetris :D

Mi contador es este, mira a ver que te parece

if ($puntos > (32) ) {
  					    echo $puntos . '<br />';
								$puntos--;$puntos--;$puntos--;$puntos--;$puntos--;
								} 
								else if ($puntos >16)
								{echo $puntos . '<br />';
								$puntos--;$puntos--;
								}
								else if ($puntos > 0)
								{echo $puntos . '<br />';
								$puntos--;
								}
								else {
  					    echo $puntos . '<br />';
								}

Por ultimo, se van a jugar a 3 videojuegos a la vez, de forma que se subiran puntuaciones de cada juego a la vez. De aqui me surgen varias dudas.

Primero, en el formulario se pueden tomar los datos de los tres juegos a la vez o tiene que hacerse uno por vez. Yo he creado de prueba un formulario que permite meter varios puntajes y aunque digo que cada puntaje vaya a una tabla, todos llegan a la primera tabla asi que se pisan y solo se queda grabado el ultimo puntaje.

Segunda, y ¿cuantas tablas tendria que crear para 3 juegos? ¿4 o 6? Si fueran 4, seria la tabla jugador y la las tablas puntos1, puntos2 y puntos3. Si fueran 6, jugador1, puntos1, jugador2, puntos2, jugador3, puntos 3.

Esto son mas bien curiosidades para mejorar. Yo no tengo problema en hacer 3 formularios y 6 tablas, es solo saber si puede optimizarse.

Aparte de todo eso, tengo dos cosas que me gustaria añadir a la web pero no tengo claro como. Estoy por abrir un hilo aparte para no mezclar porque ya no son cosas de bases de datos. Una que los datos de la clasificacion puedan descargarse en un archivo Excel, y la otra es que los jugadores puedan subir sus partidas grabadas (son unos 50 Kb por partida). Esto ultimo lo se hace sin problema, pero lo que no se hacer (y lo que quiero) es que cuando subas tu partida te aparezca el enlace de descarga de dicha partida para que luego puedan postelarlo en el foro donde jugamos. ¿Es eso muy dificil de hacer?

Para lo del Excel, he abierto este hilo

http://www.comocreartuweb.com/consultas/showthread.php/56207-Genera…

Y aqui el de los archivos subidos a la web

http://www.comocreartuweb.com/consultas/showthread.php/56208-Subir-…
skaparate escribió:<?php
$columna4 = 40;

while( $row = blah_blah... ) {
if( $columna4 > 1 ) {
if( $contador <= 3 )
$columna4 -= 5;
elseif( $contador > 3 && $contador < 11 )
$columna4 -= 2;
else
$columna4 -= 1;
}
?>
<td><?php echo $columna4 ?></td>
<?php
$contador++;
} // Fin While.
?>


Por cierto donde pones bla bla bla... ¿que habria que poner? ¿Que opciones hay?
if ($puntos > (32) ) {
echo $puntos . '<br />';
$puntos--;$puntos--;$puntos--;$puntos--;$puntos--;
}
else if ($puntos >16)
{echo $puntos . '<br />';
$puntos--;$puntos--;
}
else if ($puntos > 0)
{echo $puntos . '<br />';
$puntos--;
}
else {
echo $puntos . '<br />';
}

Funciona, que es lo importante. Para restar X, no necesitas repetir $puntos-- X veces, sino que puedes hacer esto: $puntos -= X;.

Primero, en el formulario se pueden tomar los datos de los tres juegos a la vez o tiene que hacerse uno por vez. Yo he creado de prueba un formulario que permite meter varios puntajes y aunque digo que cada puntaje vaya a una tabla, todos llegan a la primera tabla asi que se pisan y solo se queda grabado el ultimo puntaje.

Vas muy rápido y te falta conocimiento :P. Eso se puede hacer enviando arreglos a PHP. Lee esto primero, entiéndelo y luego intenta implementarlo.

Segunda, y ¿cuantas tablas tendria que crear para 3 juegos? ¿4 o 6? Si fueran 4, seria la tabla jugador y la las tablas puntos1, puntos2 y puntos3. Si fueran 6, jugador1, puntos1, jugador2, puntos2, jugador3, puntos 3.

Necesitarías una tabla de juegos relacionada de igual forma que las últimas dos, pero esto implicaría la modificación de las tablas anteriores (por eso es que se debe planificar la creación de una base de datos). Las tablas serían estas:

DROP TABLE IF EXISTS puntuacion; # Esto eliminará la tabla de puntuaciones y los datos en ella.
DROP TABLE IF EXISTS jugador;

CREATE TABLE jugador (
  jugador_id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  nombre_jugador VARCHAR(3) NOT NULL
) ENGINE=InnoDB CHARSET=utf8;

CREATE TABLE jugador_juego (
  jugador_id INT(11) UNSIGNED NOT NULL,
  juego_id INT(11) UNSIGNED NOT NULL,
  puntos INT(11) UNSIGNED NOT NULL
) ENGINE=InnoDB CHARSET=utf8;

CREATE TABLE juego (
  juego_id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  nombre_juego VARCHAR(200) NOT NULL UNIQUE
) ENGINE=InnoDB CHARSET=utf8;

ALTER TABLE jugador_juego ADD CONSTRAINT pk_jugador_juego PRIMARY KEY (jugador_id, juego_id);
ALTER TABLE jugador_juego ADD CONSTRAINT fk_jugjue_ref_jugador FOREIGN KEY (jugador_id) REFERENCES jugador (jugador_id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE jugador_juego ADD CONSTRAINT fk_jugjue_ref_juego FOREIGN KEY (juego_id) REFERENCES juego (juego_id) ON DELETE CASCADE ON UPDATE CASCADE;

Nuevamente, ejecuta todo en ese exacto orden. Ahora el código PHP (el anterior ya no funciona):

index.php
<html>
	<body>
		<?php
			require_once( 'funciones.php' );
			
			$con = mysql_connect( 'localhost', 'root', 'mpccnFER21#02#2005' );
			mysql_select_db( 'test', $con );
		?>
		<form action="add_user.php" method="post">
		  <p><label>Nombre: </label><input type="text" name="nombre" /></p>
		  <p><label>Juego: </label><?php get_game_list( $con ); ?></p>
		  <p><label>Puntos: </label><input type="text" name="puntos" /></p>
		  <input type="submit" />
		</form>
	</body>
	<?php
		require_once( 'funciones.php' );
	?>
	<h4>Jugadores y sus Puntajes</h4>
	<table>
		<thead>
			<tr>
				<th>Jugador</th>
				<th>Juego</th>
				<th>Puntos</th>
			</tr>
		</thead>
		<tbody>
		<?php
			$query = "SELECT * FROM jugador LEFT JOIN jugador_juego USING (jugador_id) LEFT JOIN juego USING (juego_id) ORDER BY puntos DESC";
			$result = mysql_query( $query, $con );
			$rows = mysql_num_rows( $result );
			
			if( $rows >= 1 ) :
				while( $row = mysql_fetch_assoc( $result ) ) :
		?>
			<tr>
				<td><?php echo $row['nombre_jugador']; ?></td>
				<td><?php echo $row['nombre_juego']; ?></td>
				<td><?php echo $row['puntos']; ?></td>
			</tr>
		<?php
				endwhile;
			else :
		?>
			<tr>
				<td colspan="2">No hay jugadores registrados a&uacute;n.</td>
			</tr>
		<?php
			endif;
		?>
		</tbody>
	</table>
</html>

add_game.php -> Para añadir los juegos.
<html>
	<head>
		<title>A&ntilde;adir Juego</title>
	</head>
	<body>
		<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
			<p><label for="juego">Nombre del juego: </label><input type="text" name="juego" /></p>
			<input type="submit" />
		</form>
		<?php
			require_once( 'funciones.php' );
			$con = mysql_connect( 'localhost', 'root', 'mpccnFER21#02#2005' );
			mysql_select_db( 'test', $con );
			
			if( isset( $_POST['juego'] ) && ! empty( $_POST['juego'] ) ) {
				$return = add_game( $_POST['juego'], $con );
				
				if( is_numeric( $return ) )
					echo "<p>Juego Guardado.</p>";
				else
					echo mysql_error( $con );
			}
		?>
		<div id="resultados">
			<?php get_game_list( $con, false ); ?>
		</div>
	</body>
</html>

add_user.php -> Para añadir los usuarios, los puntos y el juego seleccionado.
<?php
  if( isset( $_POST['nombre'] ) && ! empty( $_POST['nombre'] ) &&
      isset( $_POST['puntos'] ) && ! empty( $_POST['puntos'] ) ) {
    $con = mysql_connect( 'localhost', 'root', 'mpccnFER21#02#2005' );
    mysql_select_db( 'test', $con );
 
    require_once( 'funciones.php' );

    $user = add_player( $_POST['nombre'], $con );
    echo add_points_to_player( $user, $_POST['puntos'], $_POST['juego'], $con );
    echo "<br />Errores: " . mysql_error( $con );
    mysql_close( $con );
  } else {
    echo 'Necesito el nombre y el puntaje :P';
  }
  echo "<a href='index.php'>Volver</a>";
?>

funciones.php -> El archivo que hace todo XD.
<?php
// Este código debes ponerlo en un archivo e incluirlo en todos los que manipulen a los jugadores.

function add_player( $nombre, $db_con ) {
  $id = get_player_id( $nombre, $db_con );
  
  if( ! is_numeric( $id ) ) { // El usuario no existe
    $nombre = filter_var( $nombre, FILTER_SANITIZE_STRING );
    $insert = "INSERT INTO jugador SET nombre_jugador = '$nombre'";
    mysql_query( $insert, $db_con );
    
    if( mysql_affected_rows( $db_con ) == 1 )
    	return get_player_id( $nombre, $db_con );
  } else {
  	return $id;
  }
  
  return null;
}

function add_points_to_player( $jugador_id, $puntos, $juego, $db_con ) {
  if( ( is_numeric( $jugador_id ) && $jugador_id > 0 ) && 
  		( is_numeric( $juego ) && $juego > 0 ) ) {
    $jugador_id = filter_var( $jugador_id, FILTER_SANITIZE_NUMBER_INT );

    if( ! is_numeric( $puntos ) )
      $puntos = 1;
    else
      $puntos = filter_var( $puntos, FILTER_SANITIZE_NUMBER_INT );
    
    $juego = filter_var( $juego, FILTER_SANITIZE_NUMBER_INT );
    $insert = "INSERT INTO jugador_juego SET puntos = $puntos, jugador_id = $jugador_id, juego_id = $juego ON DUPLICATE KEY UPDATE puntos = $puntos";
    
    if( mysql_query( $insert, $db_con ) === TRUE )
    	return check_affected( $db_con );
    else
    	return 'No pude guardar los puntos: ' . mysql_error( $db_con );
  } else {
    return 'Los parámetros "jugador_id" y "juego" deben ser números enteros mayores a 0';
  }
}

// $jugador puede ser el id o el nombre del jugador:

function get_player_data( $jugador, $db_con ) {
  $query = "SELECT * FROM jugador LEFT JOIN puntuacion USING(jugador_id) WHERE ";
  
  if( is_numeric( $jugador ) ) {
    $jugador = filter_var( $jugador, FILTER_SANITIZE_NUMBER_INT );
    $query .= "jugador_id = $jugador";
  } elseif( is_string( $jugador ) ) {
    filter_var( $jugador, FILTER_SANITIZE_STRING );
    $query .= "nombre_jugador = '$jugador'";
  }

  $result = mysql_query( $query, $db_con );
  $rows = mysql_num_rows( $result ); 
  if( $rows == 1 )
    return mysql_fetch_array( $result, MYSQL_ASSOC );
  else
    return 'No hubieron resultados';
}

function get_player_id( $nombre_jugador, $db_con ) {
  $nombre_jugador = filter_var( $nombre_jugador, FILTER_SANITIZE_STRING );
  $query = "SELECT jugador_id FROM jugador WHERE nombre_jugador = '$nombre_jugador'";
  $result = mysql_query( $query, $db_con );
  $rows = mysql_num_rows( $result );

  if( $rows == 1 ) {
    $id = mysql_fetch_array( $result, MYSQL_ASSOC );
    return (int) $id['jugador_id'];
  } else {
    return 'El jugador no existe';
  }
}

function add_game( $nombre, $db_con ) {
	$id = get_game_id( $nombre, $db_con );
	
	if( ! is_numeric( $id ) ) {
		$nombre = filter_var( $nombre, FILTER_SANITIZE_STRING );
		$insert = "INSERT INTO juego SET nombre_juego = '$nombre'";
		mysql_query( $insert, $db_con );
		
		if( mysql_affected_rows( $db_con ) == 1 )
			return get_game_id( $nombre, $db_con );
	} else {
		return $id;
	}
	
	return null;
}

function get_game_id( $nombre_juego, $db_con ) {
	$nombre_juego = filter_var( $nombre_juego, FILTER_SANITIZE_STRING );
	$query = "SELECT juego_id FROM juego WHERE nombre_juego = '$nombre_juego'";
	$result = mysql_query( $query, $db_con );
	$rows = mysql_num_rows( $result );
	
	if( $rows == 1 ) {
		$id = mysql_fetch_array( $result, MYSQL_ASSOC );
		return (int) $id['juego_id'];
	} else {
		return 'El juego no existe';
	}
}

function get_game_list( $db_con, $select = true ) {
	$out = '';
	
	if( $select )
		$out = '<select name="juego">';
	else
		$out = '<ul>';
	
	$query = "SELECT * FROM juego";
	$result = mysql_query( $query, $db_con );
	
	if( mysql_num_rows( $result ) > 0 ) {
		
		while( $row = mysql_fetch_assoc( $result ) ) {
			if( $select )
				$out .= "<option value='$row[juego_id]'>$row[nombre_juego]</option>";
			else
				$out .= "<li>$row[nombre_juego]</li>";
		}
		
		if( $select )
			$out .= '</select>';
		else
			$out .= '</ul>';
		
		echo $out;
	} else {
		echo 'No hay juegos registrados a&uacute;n';
	}
}

function check_affected( $db_con ) {
  $affected = mysql_affected_rows( $db_con );
  
  if( $affected == 1 )
  	return 'Una fila afectada';
  elseif( $affected > 1 )
  	return 'Se ingresaron m&aacute;s de una fila';
  elseif( $affected == 0 )
  	return 'No se modificaron filas';
  elseif( $affected < 0 )
  	return 'Ocurri&oacute; un error' . mysql_error( $db_con );
}
?>

A ver como te va. Yo lo probé y funciona :P.
skaparate escribió:Vas muy rápido y te falta conocimiento :P. Eso se puede hacer enviando arreglos a PHP. Lee esto primero, entiéndelo y luego intenta implementarlo.

Acabo de leer esto. Gracias, muy interesante, es algo que he usado a la hora de tomar datos de una tabla para ponerlos en la web, creaba una variable y iba tomando dato por dato <td>$variable[1]</td> <td>$variable[2]</td> ...

lo que no sabía es que también se podía usar en los formularios de HTML


Necesitarías una tabla de juegos relacionada de igual forma que las últimas dos, pero esto implicaría la modificación de las tablas anteriores (por eso es que se debe planificar la creación de una base de datos). Las tablas serían estas:

Bueno, pero eso solo en el caso de querer hacer solo 4 tablas, por aquello de optimizar,¿no? Tampoco pasa nada por hacer 6 tablas, en pares de dos. Además, la persona que introduce sus datos en el formulario no se va a dar cuenta de esto. Y la eficiencia va a ser la misma, ¿no?

Además, hacerlo con 4 tablas puede crear un problema, y es que si más adelante se pasa de 3 juegos a la vez a 2 o a 4 (cosa que va a pasar seguro), todo el código vuelve a ser inservible como ha pasado ahora y toca rehacerlo, con lo que habría que estar tocando código unas dos o tres veces al año. No compensa. En cambio haciéndolo por pares de tablas, da igual el número de juegos que sean. Se crean las tablas para todo el año y uno puede olvidarse de la web.

Por cierto, que te pareció mi sistema de REPLACE INTO para meter los datos? ¡Se lograba todo con una sola tabla! :D
Buenas de nuevo, una duda, de la fantástico código que has hecho para que salgan los datos de la tabla, ¿qué habría que retocar para que solo salieran los 3 primeros y luego se parara? Estoy haciendo muchas pruebas pero no logro que pare.

EDIT: Conseguido! Con una consulta de MySQL :D

Ya solo me falta poder subir archivos .zip y que me aparezca el enlace de descarga, lo digo por si quieres echarme una mano :D
ZID escribió:Pero en este último código hay algo que no entiendo. Si los datos se envían a funciones.php, no veo ni aquí ni en funciones.php que es lo que ocurre si todo está correcto. Quiero decir, pongamos que los datos llegan a la base de datos. ¿Y luego que aparece en pantalla? ¿A qué página te envían? Es que las otros códigos que me has dado ya no se donde encajan, digamos que no entiendo qué viene después o cual es el recorrido a seguir

skaparate escribió:No, no es correcto.
No te compliques por ahora porque hay errores en el código. Primero hay que resolverlos para ver como funciona. Cuando este funcionando como debe vuelve a analizarlo y preguntas.

Avísame sobre cualquier error que muestre.


Hola de nuevo! Pues he llegado ya al siguiente paso, el de complicarme. Resulta que quiero añadir campos en la tabla. Son datos superficiales que no influyen en todo lo demas, como por ejemplo la fecha, etc...

El problema es que a la hora de tocar el codigo estoy teniendo algunos problemas para comprender donde debo tocar sin que todo lo demás deje de funcinar.

Sigo probando cosas...
Mi idea es introducir
nombre: PPP
puntos: 555
fase: 22
y la fecha, aunque eso lo tomo del servidor y lo introduzco en un nuevo campo.

Me pongo a ver si logro al menos introducir la fase... que ya he logrado introducir el dato, pero la tabla toma el dato de la puntuacion...
Probando esto lo he conseguido!

jugador_id = $jugador_id ON DUPLICATE KEY UPDATE puntos=$puntos, fase=$fase";

Genial, lo mejor de todo es que tras releerme tu codigo he logrado entender casi todo, y ademas ahora me he puesto a poner comentarios casi en cada linea para cuando vuelva a tener que tocar algo saber donde tengo que tocar jejeje

Ahora me falta el campo fecha! (Espero que me salga)

No diras que no le estoy echando horas! jejeje


EDIT: Nada, con la fecha no doy en el clavo. Ayuda!

Bueno te comento lo que hago a ver si me ayudas a dar con el error.

En la tabla puntuacion, creo el campo "fecha" justo despues del campo "fase" que ya he creado antes

en user_add.php añado esto
$fecha = date("Y-m-d"); 
//Lo he colocado aqui y tambien en funciones.php, pero tampoco hace ningun efecto.

$user = add_player( $_POST['nombre'], $con );
echo add_points_to_player( $user, $_POST['puntos'], $_POST['fase'], $fecha, $con );

luego en la funcion hago lo siguiente
function add_points_to_player( $jugador_id, $puntos, $fase, $fecha, $db_con ) 
......
......
$insert = "INSERT INTO puntuacion SET puntos = $puntos, fase = $fase, fecha = $fecha, jugador_id = $jugador_id ON DUPLICATE KEY UPDATE puntos=$puntos, fase=$fase, fecha=$fecha";

No me da error al insertar los datos, y todo los datos llegan a las tablas, pero en el campo fecha no llega nada, todo queda en 0:0:0

Buscando por google no he dado con la clave.

EDITO: Parece que lo he solucionado. He borrado todos los cambios que he mostrado antes y solo he modificado el codigo en el INSERT TO, dejando esto:

		$insert = "INSERT INTO puntuacion SET puntos = $puntos, fase = $fase, fecha = Now(), jugador_id = $jugador_id ON DUPLICATE KEY UPDATE puntos=$puntos, fase=$fase, fecha=Now()";

Y parece que funciona.

Espero tu beneplacito!
Gracias a ti, sin tu ayuda no lo habría logrado.

Ahora tengo una duda. Estoy buscando otro hosting gratuito donde llevar la web (porque la direccion es mas corta) y la base de datos no me permite crear tablas InnoDB (que son las que me dijiste que permitian claves foraneas).

En su lugar me permiten crearlas MyISAM, MRG_MYISAM, CSV y MEMORY

¿Sabes si alguna de ellas me va a permitir trabajar como si fuera InnoDB?

Es que en caso de que no sea así, me temo que todo el trabajo va a quedar en balde ya que hasta ahora, de los hosting gratuitos, CCTW es el unico que conozco que ofrece InnoDB entre sus motores de bases de datos.

Si hubiera que hacerlo sin claves foraneas... seria una posible resumir las dos tablas en una sola, siendo usuario_id clave PRIMARY KEY, nombre_jugador UNIQUE, y usando un REPLACE INTO?

Lo estoy probando a ver que tal. ¿Se desaconseja por algun motivo?