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ás de una fila';
elseif( $affected == 0 )
return 'No se modificaron filas';
elseif( $affected < 0 )
return 'Ocurrió 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ún.</td>
</tr>
<?php
endif;
?>
</tbody>
</table>
</html>
Lo probé y funciona. Espero una explicación completa de todo el código :).
Saludos.