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

Lo pongo tal cual tu me lo has copiado? O sea pongo lo que has puesto al final?

Te explico, mientras me estrujaba la cabeza he dado con una idea que aunque te das una paliza de trabajo, sirve.

Si van a puntuar los 10 primeros, creo diez variables, les asigno una puntuacion a cada una, y luego las inserto en un campo nuevo, en orden de mas puntos a menos puntos. Dicho campo permanece siempre estatico, pero como el jugador con la maxima puntuacion siempre va a estar arriba, siempre sera el que se lleve los maximos puntos.

¿Se entiende?


EDITO: He estudiado algo de MySQL y Java, lo unico que pasa es que soy un poco torpe jejeje

Y me estoy leyendo varios cursos de PHP sobre la marcha mientras hago esto!
Haciendo lo que dices me sale el contador y se para en 1, perfecto.

Pero como ya es normal en mi hay un problema, y es que en lugar de aparecerme los numeros en una nueva columna de arriba abajo, me aparecen en una nueva fila de derecha a izquierda!!!
Jejejejej... es que estas copiando el código literalmente y, como te dije antes, no te quiero hacer el trabajo: te estoy dando trozos de código para que intentes entender donde van.

La lógica que tienes que seguir es:

1.- Conectarte a la base de datos (y seleccionar la base de datos).
2.- Extraer los datos desde la base de datos (SELECT * blah blah blah).
3.- Recorrer las filas extraídas (while( $row = mysql_fetch_row()...) y, mientras las recorres, presentar el resultado al usuario.

me aparecen en una nueva fila de derecha a izquierda

Ese problema es simplemente porque no tiene el código HTML correcto. Intenta entender cómo vas a presentar la información y recorre los resultados en busca de los errores. El HTML debería sera así:

<tr>
  <td>Valor del contador</td>
  <td>ID Extraído</td>
  <td>Otro Valor extraído</td>
  <td>Etcétera</td>
</tr>

donde valor extraído es una columna existente en la base de datos :P.

Una cosa más: ánimo :P.
Me encuentro con un nuevo problema, y esta vez parece que de diseño, y es que creo que con PHP no puedo hacer lo que quiero, voy a necesitar tirar por la parte complicada con MySQL (Aquella que me indicaste al principio de todo pero que yo mismo dije que era demasiado compleja, ¿recuerdas? jejeje?)

Supongamos que logro hacer el contador y extraer el numero de filas, ok, pero al primer jugador hay que asignarle 10 puntos, al segundo 9, al tercero 8, etc...

El problema es que son 3 deportes, o sea que son 3 tablas iguales.

Y aqui viene el gran problema. Hay que crear una cuarta tabla que sume las puntuaciones de cada jugador en cada deporte para sumarlas y hacer la suma total de puntos.

Si lo hacemos con el contador, el problema es que PHP desconoce qué jugador es el que se lleva una puntuación concreta. Sabe que en un juego voy el primero y me dará 10 puntos, pero desconoce quien soy en el segundo juego, ya que en realidad PHP se ha limitado a dar un numero a cada celda, de arriba a abajo, sin saber qué jugador se los ha llevado.

Si me he explicado mal dimelo que igual lo he dejado todo demasiado confuso, pero vamos creo que se entiende. La unica forma de sumar las puntuaciones de cada juego para un mismo participantes que dichas puntuaciones ya esten en las tablas y PHP las tome de alli. Es la unica forma posible que veo para hacer el sumatorio. Hay que contar por ejemplo con el caso de que un mismo jugador solo participe en 2 deportes.
Se me ocurren dos formas "rapidas" de solucionarlo. Dime si son posibles.

La primera y mas sencilla seria inmovilizar una columna en la tabla, de la misma forma que en EXCEL. ¿Eso es posible lograr con MySQL?

La segunda forma seria insertar automaticamente los puntos a la tabla cada vez que se haga una consulta, asi apareceran siempre ordenados segun el criterio de la consulta.
Te estas complicando mucho, pues no sabes como hacerlo. Mira, esta es la solución:

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

CREATE TABLE puntuacion (
  puntuacion_id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  puntos INT(2) UNSIGNED NOT NULL,
  jugador_id INT(11) UNSIGNED NOT NULL
) ENGINE=InnoDB CHARSET=utf8;

ALTER TABLE puntuacion ADD CONSTRAINT fk_puntuacion_ref_jugador FOREIGN KEY (jugador_id) REFERENCES jugador (jugador_id)
ON UPDATE CASCADE
ON DELETE CASCADE;

Añade columnas si es que es necesario y luego ejecuta la consulta en ese mismo orden. Si las tablas ya existen te aparecerá un error, así que ten cuidado.

El código PHP será este:

Asignar la Puntuación
<?php

if( ( isset( $_POST['nombre_jugador'] ) && ! empty( $_POST['nombre_jugador'] ) ) &&
    ( isset( $_POST['puntos'] ) && ! empty( $_POST['puntos'] ) ) ) {
  $con = mysql_connect( 'localhost', 'usuario', 'contraseña' );
  mysql_select_db( base_datos, $con );

  require_once( 'functiones.php' );

  echo add_points_to_player( get_player_id( $_POST['nombre_jugador'] ), $con );

  mysql_close( $con );
} else {
  echo 'Necesito saber el nombre del jugador y los puntos que se van a asignar';
}
?>

Leer las Puntuaciones
<?php

if( isset( $_POST['nombre_jugador'] ) && ! empty( $_POST['nombre_jugador'] ) ) {
  $con = mysql_connect( 'localhost', 'usuario', 'contraseña' );
  mysql_select_db( base_datos, $con );

  require_once( 'functiones.php' );

  $player = get_player_data( $_POST['nombre_jugador'], $con );

  foreach( $player as $key => $val ) {
    echo "$key => $val";
  }

  mysql_close( $con );
} else {
  echo 'Necesito saber el nombre del jugador';
}
?>

funciones.php
<?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 ) {
  $nombre = filter_var( $nombre, FILTER_SANITIZE_STRING );
  $insert = "INSERT INTO jugador SET nombre_jugador = '$nombre'";
  mysql_query( $insert, $db_con );
  return check_affected( $db_con );
}

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

    if( ! is_numeric( $puntos ) )
      $puntos = 1;
    else
      $puntos = filter_var( $puntos, FILTER_SANITIZE_NUMER_INT );

    $insert = "INSERT INTO puntuacion SET puntos = $puntos, jugador_id = $jugador_id";
    mysql_query( $insert, $db_con );
    return check_affected( $db_con );
  } else {
    return 'El parámetro "jugador_id" debe ser un número entero';
  }
}

// $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 );

  if( mysql_num_rows( $db_con ) == 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'";

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

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ás de una fila';
    else
      return 'Ocurrió un error';
}
?>

A ver si te las arreglas con eso. No esta completo, pero tiene lo básico para funcionar. Comienza un proyecto nuevo para que lo pruebes.
Muchas gracias.

Voy a probarlo ahora.

Estaba pensando como puede ser tan complicado que al primer clasificado se le asignen 40 puntos y al segundo 35, voy a estudiar tu codigo como si fuera oro tenlo por seguro!
Duda tonta, no me pegues.

Los datos, todos, se introducen desde un formulario. De forma que cada jugador introduce su nombre y sus puntos.

Cada Usuario_ID se asocia con un único jugador. Pero como los jugadores introducen sus puntuaciones cada día (juegan todos los días y van mejorando cada día sus marcas), al volver a introducir una nueva puntuación, tienen forzosamente que introducir de nuevo su nombre en el formulario, por lo que se crea un segundo ID asociado al mismo nombre.

¿Voy bien o he dicho una burrada?
Claro, eso ocurriría... me olvidé de verificar que el usuario existiera XD. El nuevo archivo de funciones será este:

<?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 );

  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 );
    return check_affected( $db_con );
  }

  return null;
}

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

    if( ! is_numeric( $puntos ) )
      $puntos = 1;
    else
      $puntos = filter_var( $puntos, FILTER_SANITIZE_NUMER_INT );

    $insert = "INSERT INTO puntuacion SET puntos = $puntos, jugador_id = $jugador_id ON DUPLICATE KEY UPDATE puntos = $puntos";
    mysql_query( $insert, $db_con );
    return check_affected( $db_con );
  } else {
    return 'El parámetro "jugador_id" debe ser un número entero';
  }
}

// $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 );

  if( mysql_num_rows( $db_con ) == 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'";

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

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ás de una fila';
    else
      return 'Ocurrió un error';
}
?>

Añadir Usuario y Guardar Puntaje (add_user.php)
<?php
  if( isset( $_POST['nombre'] ) && ! empty( $_POST['nombre'] ) 
      isset( $_POST['puntos'] ) && ! empty( $_POST['puntos'] ) ) {
    $con = mysql_connect( 'localhost', 'usuario', 'contraseña' );
    mysql_select_db( base_datos, $con );
 
    require_once( 'functiones.php' );

    $user = add_player( $_POST['nombre'], $con );
    echo add_points_to_player( get_player_id( $_POST['nombre'], $con ), $puntos, $con );
  } else {
    echo 'Necesito el nombre y el puntaje :P';
  }
?>

Ahora sí debería funcionar como debe. El formulario debería ser algo así (uno de los formularios):

<form action="add_user.php" method="post">
  <input type="text" name="nombre" />
  <input type="text" name="puntos" />
  <input type="submit" />
</form>

Después de un tiempo vas a tener un problema eso sí, porque ¿qué pasaría si un usuario utiliza un nombre y luego lo cambia por otro que tiene más puntos? Eso se soluciona con perfiles de usuario y un sistema de registro, lo cual es mucho mas complejo.

Saludos.
Tengo una duda, antes de que te vayas.

Cuando indicas PUNTOS te refieres a los puntos que logra el jugador, ¿no?

Es que al verlo en otra tabla me ha extrañado. Si Nombre está en una tabla y Puntos en otra tabla, tengo que hacer dos formularios y subir dos veces los datos. ¿O se puede subir datos de un formulario a dos tablas a la vez diciendo que un dato vaya a una tabla y otro dato vaya a la otra tabla?


Recuerdo que lo que quiero es algo asi.

Jugador - Puntos logrados en la prueba (MARCA) - Puntos obtenidos (PUNTOS)
PEPE - 4500 puntos ---------------------------- 40 puntos
JUAN - 3000 puntos ---------------------------- 35 puntos
LUIS - 2750 puntos ----------------------------- 30 puntos
PACO - 2600 puntos -------------------------- 28 puntos
TICO - 1100 puntos ------------------------------ 26 puntos

Y si PACO logra mejorar su marca de 2600 puntos, va al formulario, introduce su nombre "PACO", introduce su nueva marca "3700" puntos y la clasificacion seria la siguiente:

Jugador - Puntos logrados en la prueba (MARCA) - Puntos obtenidos (PUNTOS)
PEPE - 4500 puntos ---------------------------- 40 puntos
PACO - 3700 puntos ------------------------- 35 puntos
JUAN - 3000 puntos ---------------------------- 30 puntos
LUIS - 2750 puntos ----------------------------- 28 puntos
TICO - 1100 puntos ----------------------------- 26 puntos

¿Es esto lo que se consigue con el codigo que me has dado?

Yo hasta ahora habia logrado hacer un ORDER BY MARCA DESC, de forma que me colocaba a los jugadores en orden desde la mejor marca a la peor marca. Mi problema era asociar 40 puntos al primer clasificado. Ya que si creo un campo llamado puntos, se va a desorganizar al hacer el ORDER BY MARCA DESC

Para que te hagas una idea, así me quedaría

Jugador - Puntos logrados en la prueba (MARCA) - Puntos obtenidos (PUNTOS)
PEPE - 4500 puntos ---------------------------- 40 puntos
PACO - 3700 puntos ------------------------- 28 puntos
JUAN - 3000 puntos ---------------------------- 35 puntos
LUIS - 2750 puntos ----------------------------- 30 puntos
TICO - 1100 puntos ----------------------------- 28 puntos
Otra cosa, al introducir datos ahora me da lo sigiuente

Parse error: syntax error, unexpected T_ISSET in /home/bicheand/public_html/add_user.php on line 3

No he tocado nada, he dejado el add_user como estaba. ¿Acaso es que tengo que poner el nombre de mi base de datos, mi usuario y mi contraseña?
Parse error: syntax error, unexpected T_ISSET in /home/bicheand/public_html/add_user.php on line 3

Lo que pasa es que me equivoqué XD:

<?php
  if( isset( $_POST['nombre'] ) && ! empty( $_POST['nombre'] ) &&
      isset( $_POST['puntos'] ) && ! empty( $_POST['puntos'] ) ) {
    $con = mysql_connect( 'localhost', 'usuario', 'contraseña' );
    mysql_select_db( base_datos, $con );
 
    require_once( 'functiones.php' );

    $user = add_player( $_POST['nombre'], $con );
    echo add_points_to_player( get_player_id( $_POST['nombre'], $con ), $puntos, $con );
  } else {
    echo 'Necesito el nombre y el puntaje :P';
  }
?>

Eso sí funciona (teóricamente, porque no lo he probado XD).

En cuanto al otro problema. Esto: jugador - Puntos logrados en la prueba (MARCA) ya lo tienes con el código que te dí. Lo que te falta es utilizar un contador para crear la tercera columna. Ese último puntaje (40, 30, 20, etc.) se puede generar con PHP, puesto que es un puntaje estático; en cambio el puntaje obtenido por los usuarios cambia constantemente.

Eso debería ser fácil de hacer :P. Esto es un contador funcionando:

$contador = 0;

while( $contador < 100 ) {
  echo $contador . '<br />';
  $contador++;
}

Tarea:

1.- Modifica el código para que comience a contar desde 10.
2.- Modifica el código para que cuente hasta 375.
3.- Intenta hacer que únicamente muestre números pares.

Saludos :P.

PD.: espero que hagas las tareas ¬¬. Luego me muestras el código (es por tu bien :P).
Bueno, ante todo muchas gracias por la paciencia que estás teniendo conmigo. Me pongo lo primero con el contador que son las tareas, pero tengo algunas dudas sobre el código que me has puesto que luego te pregunto.

1.- Modifica el código para que comience a contar desde 10.

$contador = 10;

while( $contador < 100 ) {
  echo $contador . '<br />';
  $contador++;
}  

2.- Modifica el código para que cuente hasta 375.

$contador = 0;

while( $contador < 376 ) {
echo $contador . '<br />';
$contador++;
}

3.- Intenta hacer que únicamente muestre números pares.

$contador = 0;

while( $contador < 376 ) {
echo $contador++ . '<br />';
$contador++;
}
Bueno voy ahora a comentar mis dudas. Creo que si logro entender paso a paso el código que me has ofrecido tan gentilmente, habré aprendido muchísimo. Pero antes necesito digerirlo. Así que cuento como lo veo y tu me vas corrigiendo si no te importa.

Empezamos por el formulario, que hemos dicho que puede ser este

<form action="add_user.php" method="post">
  <input type="text" name="nombre" />
  <input type="text" name="puntos" />
  <input type="submit" />
</form>

Bien, los datos van a add_user.php, que está aquí

  if( isset( $_POST['nombre'] ) && ! empty( $_POST['nombre'] ) &&
      isset( $_POST['puntos'] ) && ! empty( $_POST['puntos'] ) ) {
    $con = mysql_connect($host, $db_user, $db_pass);
    mysql_select_db( database, $con );
 
    require_once( 'functiones.php' );

    $user = add_player( $_POST['nombre'], $con );
    echo add_points_to_player( get_player_id( $_POST['nombre'], $con ), $puntos, $con );
  } else {
    echo 'Necesito el nombre y el puntaje :P';
  }
	

Aquí me surgen varias dudas. La primera es qué es lo primero que aparece, ¿una especie de control para evitar que puedas darle a enviar sin haber escrito nada en el formulario?

 if( isset( $_POST['nombre'] ) && ! empty( $_POST['nombre'] ) &&
      isset( $_POST['puntos'] ) && ! empty( $_POST['puntos'] ) ) 

Luego lo siguiente, entiendo yo que es para conectar con la base de datos. ¿Es asi?

 $con = mysql_connect( 'localhost', 'usuario', 'contraseña' );
    mysql_select_db( base_datos, $con );

Si es eso me surge una nueva duda, donde pones 'usuario' y 'contraseña' debo de poner yo mi usuario y contraseña o de lo contrario fallará, ¿verdad? Es que da cosa preguntar porque como no me has dicho que cambie nada de tu código pues he dudado de que igual ya estaba todo controlado. De hecho debe ser así porque sin tocar nada de tu código me da errores de acceso, los cuales ya he corregido al poner mi usuario y contraseña en esos apartados. Pero hay algo que todavía no entiendo. ¿Como se sabe cual es mi base de datos?

En esta línea que ya he puesto antes...

mysql_select_db( base_datos, $con );

¿Tengo que borrar base_datos y poner el nombre de mi base de datos? No puedo saber si eso sirve porque tampoco me da ningún error ponga lo que ponga, y porque tampoco puedo pasar de aquí por los errores que te voy a mostrar ahora, que son estos:

Warning: require_once(functiones.php) [function.require-once]: failed to open stream: No such file or directory in /home/bicheand/public_html/add_user.php on line 8

Fatal error: require_once() [function.require]: Failed opening required 'functiones.php' (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/bicheand/public_html/add_user.php on line 8


Y esto último es... a ver si lo he entendido, la primera línea envía los datos a 'funciones.php', la cual es la que envía los datos a la base de datos, ¿verdad?

  require_once( 'functiones.php' );

    $user = add_player( $_POST['nombre'], $con );
    echo add_points_to_player( get_player_id( $_POST['nombre'], $con ), $puntos, $con );
  } else {
    echo 'Necesito el nombre y el puntaje :P';
  }

Y luego el resto de código imagino que será algún tipo de control.

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

Me estás sirviendo mucho explicarte todo esto porque así estoy teniendo que entender el código. Bueno ahora voy a ponerme a probar cosas a ver si logro responderme yo solo.
La primera es qué es lo primero que aparece, ¿una especie de control para evitar que puedas darle a enviar sin haber escrito nada en el formulario?

Eso es exactamente. isset() verifica que exista el índice en el arreglo $_POST; si existe devuelve true y false en caso de no existir. empty() se utiliza para saber si la variable esta vacía o no y devuelve true o false respectivamente.

$con = mysql_connect( 'localhost', 'usuario', 'contraseña' );
mysql_select_db( base_datos, $con );

Claro, aquí debes modificar los datos con los tuyos. 'localhost' ese el host donde esta la base de datos; 'usuario' el nombre de usuario de la base de datos y 'contraseña' de la base de datos.

mysql_select_db( base_datos, $con );

Debes reemplazar base_datos con el nombre de tu base de datos: 'nombre_base_datos'.

Warning: require_once(functiones.php) [function.require-once]: failed to open stream: No such file or directory in /home/bicheand/public_html/add_user.php on line 8

Fatal error: require_once() [function.require]: Failed opening required 'functiones.php' (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/bicheand/public_html/add_user.php on line 8

Esos errores significan que el archivo functiones.php (en realidad se debería llamar funciones.php, pero le agregué una t XD) no ha sido encontrado. Asegúrate de que el archivo este en la misma carpeta que el archivo que lo esta incluyendo y que tenga el mismo nombre: functiones.php.

a ver si lo he entendido, la primera línea envía los datos a 'funciones.php', la cual es la que envía los datos a la base de datos, ¿verdad?

No, no es correcto.

require(), require_once(), include() e include_once() son funciones que te permiten incrustar el código de otro archivo al archivo que llama la función. La diferencia es que require interrumpirá la ejecución del script si es que no encuentra el archivo, mientras que include solo mostrará una advertencia o warning. Esto sirve para que el contenido el archivo entre los paréntesis de la función quede a disposición del archivo actual, que en este caso es add_player.php.

Lee esto y quizás entiendas lo que hacen :).

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

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.

Me estás sirviendo mucho explicarte todo esto porque así estoy teniendo que entender el código. Bueno ahora voy a ponerme a probar cosas a ver si logro responderme yo solo.

Una de las razones por las que te ayudo (y que ayudo a los que puedo) es justamente esa: me permite aprender más o reforzar lo conocido :P (lamentablemente también hay un interés de mi parte).

PD.: la tarea número 3 no muestra sólo los números pares. Para saber si un número es par o no, esta es la fórmula: x % y = 0. El porcentaje (%) te da el resto de la división, entonces x % 2 debería devolver 0 si es par y 1 si es impar.
skaparate escribió:Esos errores significan que el archivo functiones.php (en realidad se debería llamar funciones.php, pero le agregué una t XD) no ha sido encontrado. Asegúrate de que el archivo este en la misma carpeta que el archivo que lo esta incluyendo y que tenga el mismo nombre: functiones.php.


Bien, el error era ese. El archivo llamaba a functiones.php y el archivo se llama funciones.php así que lógicamente no se encontraban.

He corregido ese fallo y ya no me da el error de antes, ahora me da otro nuevo:

Warning: Missing argument 2 for get_player_id(), called in /home/bicheand/public_html/funciones.php on line 5 and defined in /home/bicheand/public_html/funciones.php on line 54

Warning: mysql_num_rows() expects parameter 1 to be resource, null given in /home/bicheand/public_html/funciones.php on line 58

Warning: mysql_num_rows() expects parameter 1 to be resource, null given in /home/bicheand/public_html/funciones.php on line 58
El parámetro "jugador_id" debe ser un número entero

Si revisamos el codigo parece que el error se encuentra aqui, siendo la primera linea la 54

//54
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'";

//58
  if( mysql_num_rows( $result ) == 1 ) {
    $id = mysql_fetch_array( $result, MYSQL_ASSOC );
    return (int) $id['jugador_id'];
  } else {
    return 'El jugador no existe';
  }
}
No, no es ese el problema.

Missing argument 2 for get_player_id()

Eso significa que no se le esta pasando el segundo parámetro a la función cuando se le llama. Revisa el archivo add_player.php (y cualquier otro que utilice las funciones) y asegúrate de que este así:

get_player_id( $_POST['nombre_jugador'], $con )

No importa si hay otra función envolviéndolo, esa es la forma que le dí a la función y eso es lo que espera. Los siguientes errores tienen que ver con el primero, así que al resolver el primero los demás deberían desaparecer.
Pero en tu código llamado user_add aparece así [

 get_player_id( $_POST['nombre'], $con )  

en lugar de asi

get_player_id( $_POST['nombre_jugador'], $con )  

¿Tengo que mirar en funciones.php y donde ponga
get_player_id( $_POST['nombre'], $con )
sustiurlo siempre por lo que has puesto?

Lo acabo de corregir en el user_add.php y me da el mismo error :-S

Warning: Missing argument 2 for get_player_id(), called in /home/bicheand/public_html/funciones.php on line 5 and defined in /home/bicheand/public_html/funciones.php on line 54

Warning: mysql_num_rows() expects parameter 1 to be resource, null given in /home/bicheand/public_html/funciones.php on line 58

Warning: mysql_num_rows() expects parameter 1 to be resource, null given in /home/bicheand/public_html/funciones.php on line 58
El parámetro "jugador_id" debe ser un número entero
Imagino que ya lo sabrás, pero te confirmo que al introducir datos, el nombre del jugador llega a la primera tabla (tabla jugador) como estaba previsto, pero en la segunda tabla (tabla puntuacion) no ha llegado ningun dato, esta vacia


Por si quieres introducir tu mismo datos y ver los errores que te digo, aqui tienes

http://bicheando.comocreartuweb.es/
Vale, solucionado, el problema estaba en la primera pantalla, la que toma los datos. Una de las casillas no se llamaba igual que el campo de la base de datos. Se llamaba name="nombre" y se deberia de llamar name="nombre_jugador"

Ahora, al poner los datos me sale la frase "Necesito el nombre y el puntaje :P"


Ahora ya no llega nada, ni el nombre ni los puntos a las tablas de la base de datos.


Si vuelvo a poner name="nombre_jugador" me vuelve a dar el error de antes, llega el nombre a la tabla, pero no llegan los puntos
Puede ser entonces que el problema está ahí, en el formulario?

<input type="TEXT" name="nombre" />
<input type="NUM" name="puntos" />
Lo importante de $_POST['algo'] es que ese 'algo' sea el name de la etiqueta INPUT que aparece en el formulario HTML.

<form>
  <input name='algo' />
</form>

echo $_POST['algo']

Eso funcionaría. Pero en cambio

<form>
  <input name='algo' />
</form>

echo $_POST['no_existe'];

Mostrará un error o advertencia similar a "Undefined Index 'no_existe' on archivo.tanto línea NN".

Debes entender la diferencia entre la definición de una función y la llamada a la misma. La definición de una función es esta:

function mi_funcion( $parametro1, $p2, $p3, $etc ) {
  // Aquí iría lo que hará la función
  echo "mi_funcion() ejecutada<br />";
}

Esa es una definición de función. La llamada es cuando uno utiliza la función para algo:

mi_funcion( $a, $b, $c, $etc );

Si te fijas, los parámetros (que es lo que esta entre paréntesis y separado por comas) no tienen los mismos nombres, pues lo que la función espera es un valor, sin importar el nombre de la variable que contenga este valor. Los valores también pueden ser llamadas a otras funciones, por lo que sintácticamente hablando, no tendrían un nombre de variable (pues ni siquiera son variables):

mi_funcion( $a, trim( $b ), $c, $etc );

Ahora el segundo parámetro es una llamada a función. trim() elimina los espacios en blanco del comienzo y final en una cadena de caracteres.

Esta es la explicación para esto:

Pero en tu código llamado user_add aparece así [

Código PHP:
get_player_id( $_POST['nombre'], $con )
en lugar de asi

Código PHP:
get_player_id( $_POST['nombre_jugador'], $con )
¿Tengo que mirar en funciones.php y donde ponga
Código PHP:
get_player_id( $_POST['nombre'], $con )
sustiurlo siempre por lo que has puesto?

Ahora sí, el código esta probado y funcionando. Copia y pega esto en sus respectivos archivos:

funciones.php
<?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 );
    return get_player_id( $nombre, $db_con );
  } else {
  	return $id;
  }
}

function add_points_to_player( $jugador_id, $puntos, $db_con ) {
  if( is_numeric( $jugador_id ) ) {
    $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 );
    
    $insert = "INSERT INTO puntuacion SET puntos = $puntos, jugador_id = $jugador_id ON DUPLICATE KEY UPDATE puntos=$puntos";
    if( mysql_query( $insert, $db_con ) === TRUE )
    	return check_affected( $db_con );
    else
    	return 'No se pudo guardar los puntos: ' . mysql_error( $db_con );
  } else {
    return 'El parámetro "jugador_id" debe ser un número entero';
  }
}

// $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 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 );
}
?>

add_user.php
<?php
  if( isset( $_POST['nombre'] ) && ! empty( $_POST['nombre'] ) &&
      isset( $_POST['puntos'] ) && ! empty( $_POST['puntos'] ) ) {
    $con = mysql_connect( 'localhost', 'usuario', 'contraseña' );
    mysql_select_db( 'test', $con );
 
    require_once( 'funciones.php' );

    $user = add_player( $_POST['nombre'], $con );
    echo add_points_to_player( $user, $_POST['puntos'], $con );
    echo "Errores: " . mysql_error( $con );
    mysql_close( $con );
  } else {
    echo 'Necesito el nombre y el puntaje :P';
  }
?>

También tendrás que ejecutar esto en PHPMyAdmin:

ALTER TABLE puntuacion ADD CONSTRAINT UNIQUE (jugador_id); # Esto es para que sólo exista un único puntaje asociado al jugador.
ALTER TABLE jugador ADD CONSTRAINT UNIQUE (nombre_jugador); # Esto es para que no hayan nombres duplicados.

Y por último, este es el archivo donde va el formulario:

index.php
<html>
	<body>
		<form action="add_user.php" method="post">
		  <p><label>Nombre: </label><input type="text" name="nombre" /></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>Puntos</th>
			</tr>
		</thead>
		<tbody>
		<?php
                        // Modifica los datos aquí, no lo olvides.
			$con = mysql_connect( 'localhost', 'usuario', 'contraseña' );
			mysql_select_db( 'test', $con );
			$query = "SELECT * FROM jugador LEFT JOIN puntuacion USING (jugador_id)";
			$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['puntos']; ?></td>
			</tr>
		<?php
				endwhile;
			else :
		?>
			<tr>
				<td colspan="2">No hay jugadores registrados a&uacute;n.</td>
			</tr>
		<?php
			endif;
		?>
		</tbody>
	</table>
</html>

Lo probé y funciona. Espero una explicación completa de todo el código :).

Saludos.
Gracias!

Lo estoy probando y me surge una duda.

El primero es ¿por qué si los puntos que introduces en el formulario son números se pone esto <input type="text"?

No tendría más sentido poner <input type="numb"?
Vale, me ha dado una cantidad de errores importante, pero es algo que ya me esperaba. Te cuento mi teoria.

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.

En cambio en mi tabla de nombres he tenido que borrar los que habia, pero el ID como se incremente ya va por el 19 o 20, mientras que la tabla de puntos no ha recibido nada, asi que su primer dato sera ID 1

Eso hace que la base de datos se vuelva loca, asi que tendre que borrar las tablas y hacerlo todo de nuevo.

¿Voy bien?


Rehaciendo tablas...
Bueno, tras rehacer las tablas he hecho la primera prueba y los datos han llegado a ambas tablas con su ID 1, todo en orden.

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

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 por el formulario puntajes de más de un millón de puntos. No pasa nada si lo cambio, ¿no?


Una ultima cosa. He introducido los datos de 5 personas. Y como puedes ver, en la portada la consulta no se obtiene de forma que la puntuacion mayor sea la primera.

http://bicheando.comocreartuweb.es/index.php

¿Esto no es un fallo, esto es que tu lo has querido hacer asi verdad?