Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: djboro88 en Febrero 09, 2016, 05:16:01 PM

Título: Mostrar informacion de una base de datos MySQL en el juego
Publicado por: djboro88 en Febrero 09, 2016, 05:16:01 PM
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 !!

Título: Re:Mostrar informacion de una base de datos MySQL en el juego
Publicado por: Iros en Febrero 09, 2016, 05:51:04 PM
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.
Título: Re:Mostrar informacion de una base de datos MySQL en el juego
Publicado por: djboro88 en Febrero 09, 2016, 08:51:24 PM
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.
Título: Re:Mostrar informacion de una base de datos MySQL en el juego
Publicado por: bygdle en Febrero 09, 2016, 09:04:00 PM
¿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
Título: Re:Mostrar informacion de una base de datos MySQL en el juego
Publicado por: djboro88 en Febrero 09, 2016, 09:38:18 PM
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/
Título: Re:Mostrar informacion de una base de datos MySQL en el juego
Publicado por: bygdle en Febrero 09, 2016, 10:26:53 PM
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
Título: Re:Mostrar informacion de una base de datos MySQL en el juego
Publicado por: 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.

Título: Re:Mostrar informacion de una base de datos MySQL en el juego
Publicado por: bygdle en Febrero 10, 2016, 12:17:12 AM
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
Título: Re:Mostrar informacion de una base de datos MySQL en el juego
Publicado por: djboro88 en Febrero 10, 2016, 12:43:03 AM
 XD Porfin !!!

Muchisimas gracias NiuWeb

Mañana mas tranquilo, me miraré bien bien el codigo y entenderé o al menos lo intentaré comprender.
Título: Re:Mostrar informacion de una base de datos MySQL en el juego
Publicado por: djboro88 en Febrero 14, 2016, 02:13:40 AM
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?
Título: Re:Mostrar informacion de una base de datos MySQL en el juego
Publicado por: bygdle en Febrero 14, 2016, 02:17:48 AM
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
Título: Re:Mostrar informacion de una base de datos MySQL en el juego
Publicado por: djboro88 en Febrero 14, 2016, 10:24:56 AM
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?
Título: Re:Mostrar informacion de una base de datos MySQL en el juego
Publicado por: bygdle en Febrero 14, 2016, 11:17:08 AM
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