Hola GAMEMAKEROS...
Para mostrar en el juego el nombre de usuario registrado en la base de datos, ¿cómo se haría?
Es decir, para mostrar cualquier campo de la base de datos en el propio juego, ¿cual es la sentencia que se tendría que usar para conseguir tal cosa.?
Saludos !!
Primero que nada no tenes que acceder a la base de datos desde GM, es realmente inseguro. Lo que si podes hacer es usar http_get o http_post_string para hacer una consulta a la base de datos desde un servidor y retornar dichos valores.
Un ejemplo sencillo sería algo como esto:
En GM, evento asincrónico:
[gml]http_post_string("http://www.miservidor.com/usuario.php?id="+global.idUsuario);[/gml]
En el archivo usuario.php:
<?php
include("config.php");
if (isset($_POST['id']) && !empty($_POST['id'])) { //Comprobamos que se haya enviado POST id y que no se encuentre vacío.
$select = mysql_query("SELECT * FROM user WHERE id = ".$_POST['id'].");
if (mysql_num_rows($select)) { //Si hay coincidencias en la DB.
$rowUser = mysql_fetch_array($select);
echo $rowUser['userName'];
} else {
echo "No logueado";
}
} else {
echo "No logueado";
}
?>
Eso sería más o menos la estructura básica, de ahí podes agregarle más seguridad si queres.
No me muestran los "echo".
Tengo el usuario.php
<?
include("config.php");
if (isset($_POST['user']) && !empty($_POST['user'])){ //Comprobamos que se haya enviado POST id y que no se encuentre vacío.
$select = mysqli_query($conex,"SELECT * FROM usuarios WHERE user = ".$_POST['user']);
if(mysqli_num_rows($select)){ //Si hay coincidencias en la DB.
$rowUser = mysql_fetch_array($select);
echo "El usuario ".$rowUser['user']." si que existe";
}else{
echo "El usuario ".$rowUser['user']." no que existe";
}
}else{
echo "Error";
}
?>
En GMS un boton lesft release:
user = "djboro88";
http_post_string("http://www.salvadorreyes.es/juego/usuario.php","user=" + user);
Un objeto llamado obj_logueo:
CREATE
global.Usuario = ""
HTTP
http_post_string("http://www.salvadorreyes.es/juego/usuario.php", "user=" +global.Usuario);
¿Porque no se visualizan los mensajes de respuesta?
Nota: El juego lo ejecuto en Windows. Y en un futuro me gustaría que se vieran en Android.
Me imagino que la idea principal sería comprobar si el nombre de "user" existe o no en la base de datos.
¿Por qué no te sirve? Porque estás usando mal el evento HTTP. Revisa el artículo que hice donde enseño a recibir datos de PHP correctamente y te darás cuenta de cuál es tu error:
http://www.comunidadgm.org/articulos/crea-tu-juego-online-tutorial-php-mysql-gml-(programacion)/msg121459/#msg121459
Lo que pasa es que no estás recogiendo lo que envía PHP en ninguna parte, por lo que las respuestas quedan en el aire
La parte 1 la de añadir a la BD esta clara, le estoy dando vueltas y no veo por donde coger el problema.
He añadido el proyecto con los objetos y demas q tengo, haber si alguien puede explicarmelo.
La base de datos que he creado es la misma que indicas en este post:
http://www.comunidadgm.org/articulos/crea-tu-juego-online-tutorial-php-mysql-gml-%28programacion%29/
Desde el momento de abrir tu proyecto veo tus errores:
1)- Tenías el código que llama a PHP (del obj_logueo) en una alarma, la cual NUNCA se activaba.
2)- En ninguna parte mostrabas la respuesta que habías recibido, así que es lógico que nunca hayas visto las respuestas
3)- En el script PHP haces la consulta con MySQLi, pero cuentas los datos recibidos con MySQL, además de que hay un error de sintaxis en la consulta. Puede que eso cause problemas
4)- Tienes mal el código en HTTP xD, tienes esto:
[gml]
if (ds_map_find_value(async_load,"user")) == ID
[/gml]
Cuando debería ser esto:
[gml]
if (ds_map_find_value(async_load,"id")) == ID
[/gml]
FAIL xD
Ahora, me encargué de hacer pruebas con tu proyecto, e hice estos cambios:
1)- El evento alarm 0 del obj_logueo lo cambié por evento Press <enter>. Y cambié tus códigos por esto:
[gml]
//Press enter event
user = "djboro88";
ID = http_post_string("http://www.salvadorreyes.es/juego/usuario.php","user=" + user);
alarm[0] = room_speed;
[/gml]
En el Create puse estas variables:
[gml]
ID = -1;
stats = -1;
result ="";
[/gml]
Y el evento HTTP, el que más buggeado estaba xD:
[gml]
if (ds_map_find_value(async_load,"id")) == ID
{
stats = ds_map_find_value(async_load,"status");
result = ds_map_find_value(async_load,"result");
}
[/gml]
Ahora, recibo respuesta de tu servidor, pero veo que tu script PHP está mal programado, puesto que recibo un error de parte de PHP:
(https://gyazo.com/35de09c236028cb6373044af34e51d09.png)
Lo que me indica que estoy en lo correcto respecto al punto #3 de los errores que encontré.
Decidí probar en un servidor local un script que hice similar al tuyo, pero con los arreglos que debería tener. Lo dejé así:
<?php
$conex = mysqli_connect("localhost","root","");
mysqli_select_db($conex,"usuarios");
if (isset($_POST['user']) and !empty($_POST['user']))
{
$select = mysqli_query($conex,"SELECT * FROM usuarios WHERE user='".$_POST['user']."'");
if (!$select)
echo mysqli_error($conex);
if (mysqli_num_rows($select) > 0)
{
echo 'El usuario '.$_POST['user']." existe";
}
else
echo 'El usuario '.$_POST['user']." no existe";
}
else
echo 'Error';
?>
Probé con mis bases de datos, y todo funcionó hermosamente de maravilla :love:
PD: no seas tan cruel con tu web, no hagas pruebas en ella, usa un servidor local xDDDD
>:( No consigo, ni que muestre los mensajes ni que salte errores.
Lo del servidor me interesa que sea en hosting (es de pago). Ya que en el futuro me conviene este metodo.
¿Podrias adjuntar el proyecto modificado? Ya no se que hago mal.
Vuelvo a adjuntar el proyecto junto con el PHP de usuarios, porque no veo donde estan los fallos.
Cita de: djboro88 en Febrero 10, 2016, 12:08:41 AM
>:( No consigo, ni que muestre los mensajes ni que salte errores.
Lo del servidor me interesa que sea en hosting (es de pago). Ya que en el futuro me conviene este metodo.
¿Podrias adjuntar el proyecto modificado? Ya no se que hago mal.
Vuelvo a adjuntar el proyecto junto con el PHP de usuarios, porque no veo donde estan los fallos.
Ya lo tienes bien! xD
Sólo cambia el evento de alarma por el que quieras activarlo, por ejemplo Press <enter>, y en el alarma debería ir esto:
[gml]
if stats == 0
show_message(result);
[/gml]
Sobre el servidor, me refería a las pruebas, haz las pruebas en un servidor local. Porque con el hosting, entre prueba y prueba te quedarás sin ancho de banda xD
XD Porfin !!!
Muchisimas gracias NiuWeb
Mañana mas tranquilo, me miraré bien bien el codigo y entenderé o al menos lo intentaré comprender.
Una duda que me viene a la mente.
Partiendo de este mismo ejemplo.
Si quiero mostrar el email del usuario que se ha conectado, como hacerlo para que se muestre durante el juego.
La consulta MySQL está clara, seria algo como esto:
SELECT email FROM usuarios WHERE user="$_POST[user]"
La duda es ¿como o donde se guarda el valor que devuelve la consulta?
Pienso yo que es mejor que hagas una consulta que almacene todos los campos. Y en vez de escribir:
SELECT email FROM usuarios WHERE user="$_POST[user]"
Podrías escribir:
SELECT * FROM usuarios WHERE user='$_POST[user]'
Y almacenar la petición en una variable, así:
<?php
$sql = mysqli_query($conexion,"SELECT * FROM usuarios WHERE user='"."'");
$contenido = mysqli_fetch_array($sql);
?>
Y entonces convertirás la variable $contenido en un array que tendrá almacenados todos los campos, por ejemplo $contenido['email'] tendría almacenado el campo "email" de la fila que se extrajo con la petición SQL
Vale, a lo que me refiero es que si el usuario se ha conectado por ejemplo "Carlos" y quiero que se me muestre en el juego el email del usuario "Carlos"
La consulta deberia de ser:
$sql = mysqli_query($conexion,"SELECT * FROM usuarios WHERE user='carlos'");
$contenido = mysqli_fetch_array($sql);
O bien guardar en una variable $_POST[user] el nombre.
$sql = mysqli_query($conexion,"SELECT * FROM usuarios WHERE user='$_POST[carlos]'");
$contenido = mysqli_fetch_array($sql);
La cuestion es, ¿como muestro el valor de $contenido["email"] en GameMaker Studio?
Pues si sabes que $contenido['email'] tiene el correo del usuario, sólo lo envías con la función echo de PHP, así
echo $contenido['email'];
Y yap :V