Hola GAMEMAKEROS !!
Tengo una BD llena de registros de puntuaciones.
La cuestion es que me gustaria mostrar solo los 3 ultimos dentro de mi juego en GMS.
La conexion la tengo:
config.php
$dbhost="localhost"; // host del MySQL (generalmente localhost)
$db="database"; // Seleccionamos la base con la cual trabajar
$dbusuario="user"; // nombre de usuario
$dbpassword="passw"; // password
$conex = mysqli_connect($dbhost,$dbusuario,$dbpassword,$db) or die("Error " . mysqli_error($conex));
Y el archivo que hace la consulta también:
records.php
include("config.php");
$sql_mostrarRecords = mysqli_query($conex,"SELECT * FROM records LIMIT 0,3 ORDER BY puntos DESC");
$mostrarRecords = mysqli_fetch_array($sql_mostrarRecords);
La cuestion es... ¿como se hace en GMS para mostrar (no en forma de ventana) los nombres que hay en la base de datos?
¿Con un DRAW o hay otro metodo?
El método es el que quieras. Cuando Game Maker recibe la información de PHP la recibe en forma de cadena, después puedes hacer lo que quieras con ella. Por ejemplo, mostrarla en forma de ventana con show_message(), dibujarla en el mismo juego con funciones de dibujo como draw_text() o cualquier otra cosa que se te ocurra. PHP no tiene nada que ver con eso puesto que él sólo envía la información. GM es quien le da el uso que desees. Es lo mismo que dibujar un simple texto "hola", tú eres quien lo dibuja como quieras ;)
Vale.
¿La cuestión es como se muestra?
Es algo que no me queda del todo claro.
Tengo un obj_record
CREATE
stats = -1;
result = "";
ID = -1;
HTTP
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");
}
¿Qué mas me faltaría?
La conexion entre GMS y la BD, me imagino que será con http_post_string, ¿pero donde se coloca o como?
La respuesta del servidor se almacena en la variable "result" cuando la petición se haya completado. Es decir, cuando GM termine de recibir la información, la almacenará en la llave result de async_load, y la misma es almacenada en la variable result que tienes en tu código
Perdona mi ignorancia sobre el tema...
Si tengo solo esos dos eventos sobre el obj_record ¿como sabe GMS donde consultar?
Se lo tendré que decir de algún modo.
Me imagino que sería con el http_post_string, pero no se en que evento colocarlo.
¿Donde sería ese lugar?
GMS consulta en donde http_post_string, o la función de HTTP que estés usando haga la petición. Por lo que si haces http_post_string("http://www.google.com",""), GMS esperará la respuesta de Google.com, lo que equivale al código fuente de la página google.com. Y si haces http_post_string("http://www.mipagina.com", "algo=hola");, GM esperará la respuesta de mipagina.com con el valor "hola" en la variable POST "algo". Y si tienes esto en mipagina.com:
<?php
if($_POST['algo'] == 'hola')
echo 'Hola que hace';
?>
GMS recibirá una cadena con "Hola que hace".
este es un tema que yo personalmente e respondido bastantes veces ya, lo bueno es que gracias a niuweb y su tutorial me ahorra bastante escritura.
http://www.comunidadgm.org/articulos/crea-tu-juego-online-tutorial-php-mysql-gml-%28programacion%29/
ahora sin embargo hay algo que su tutorial no abarca o omite, no es que se le olvido, es que se supone que cualquiera que trabaje con php tiene que saberlo, y eso es como usar los datos sacados de la base de datos. no me alargare, solo pondre el codigo y te dire como usarlo
<?php
$result=mysql_query("SELECT * FROM $mysql_table WHERE 1");//haces la consulta y la guardas en la variable result
while($row = mysql_fetch_array($result))//no se bien como explicar esto, pero basicamente lee una linea del result, lo guarda en la variable row y suma uno para el siguiente pase a menos que no hayan mas lineas en el result
if ($row <= 0)
{
echo "0";//si no hay variables muestra 0
}
else
{
echo $row['campo_de_tabla1']." ".$row['campo_de_tabla2'];//si las hay, imprime la variable en forma de texto, esto es lo que tu tendras dentro del ds_map async_load en su key result
}
?>
el codigo de arriba te mostrara todas las lineas del result repitiendose en un bucle hasta el final, estos codigos usa la funcion despreciada en php 7.0 de mysql, y deberias de usar la funcion mysqli, solo seria unos cambios en la conexion con base de datos, pero las sentencias son las mismas.
ps: esto va en el php, lo digo porque veo que el tuyo no imprime los valores obtenidos de la consulta sql.
pss:no me di cuenta que ya usas la extension mysqli, de todas maneras el codigo que te pase sigue siendo util, solo cambia mysql por mysqli
La cuestion es que no tiene que esperar nada.
Solo es una consulta a la base de datos y ésta que devuelva los ultimos 3 registros en orden descendente.
A diferencia de lo que comenta jmbs19, en la consulta añade el WHERE y en la mia no existe tal condicion.
$sql_mostrarRecords = mysqli_query($conex,"SELECT * FROM records LIMIT 0,3 ORDER BY puntos DESC");
En PHP, seria muy facil el mostrarlos:
while($mostrarRecords = mysqli_fetch_array($sql_mostrarRecords)){
echo $mostrarRecords['nombre'];
}
¿... y en GMS?
Todavia no tengo claro donde colocar el http_post_string.
¿En el evento HTTP junto con el resto?
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");
}
http_post_string(www.mipagina.com/record.php,"");
el http_post_string tiene que ir dentro de un evento gatillador, puede ser click, alarma, create, step(asegurandote de que no se repita la consulta cada paso),collision....
pero el [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]
tiene que ir dentro del evento asyncrono http, eso se explica en el tutorial de niuweb, otra cosa, las consultas sql si no esta bien redactadas no arrojaran resultado, aunque tu codigo no te mande una alarma o warning no necesariamente significa que tu consulta esta bien realizada, y con respecto a obtener el resultado de la consulta tienes que hacer si o si lo que te dije, haciendo echo de los resultados, ya que ese echo es lo que el ds_map async_load en su key result guardara.
Vale.
Entonces la cosa se queda de la siguiente forma.
En el obj_record
CREATE
http_post_string("http://www.miweb.com/juego/record.php","");
HTTP
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");
}
DRAW
draw_set_font(fnt_records);
draw_set_color(c_fuchsia);
draw_set_halign(fa_left);
draw_text(180,650,result);
¿De esta forma deberia de mostrarme solo los 3 registros en orden descendente como indico en la consulta MySQL?
No has asignado la identificación de la petición a la variable ID.
En create debería ser algo como esto:
[gml]
ID = http_post_string("http://www.miweb.com/juego/record.php","");
[/gml]
Por lo demás, y si tu PHP está bien programado, supongo que no hay problemas
si y no, el result es todo el codigo html de la pagina, te mostrara los tres registros, pero si no me equivoco pegado, ya en este punto tienes 2 opciones, explotar el string en un array usando un caracter x como divisor, o desde el php agregar el salto de linea.
algo asi
echo "
";
ps:niu te me adelantaste, este mensaje va para el ultimo de djboros
Me salta el siguiente error:
FATAL ERROR in
action number 1
of Draw Event
for object obj_version:
Push :: Execution Error - Variable Get 100014.result(100015, -2147483648)
at gml_Object_obj_version_DrawEvent_1 (line 42) - draw_text(180,650,result);
EDITO: Fallo mio, no habia declarado en create la variable RESULT.
Funciona perfecto...
Gracias a los dos :D :D :D :D
Te cito
exactamente lo mismo que dije hace poco:
Cita de: NiuWeb en Febrero 27, 2016, 09:22:33 PM
Te puedo asegurar que si no has declarado esa variable, ese es el problema.
No importa qué cosas estés haciendo, si partículas, físicas, 3D, multiplayer, cualquier cosa; si intentas comprobar o ejecutar alguna acción con una variable que no existe, sencillamente habrá un error.
¿Por qué no intentas declararla como te dije a ver si te funciona? ;)
Declara la variable
result en el create, como una cadena vacía
Estuviste atento a la respuesta, solucionado.
Fallo mio, no habia declarado en create la variable RESULT.
Funciona perfecto...
Gracias a los dos :D :D :D :D
Y el explode... ? he estado indagando en el help de GMS...
Y me he quedado igual.
¿Existe alguna forma sencilla de separar la cadena si el separados es || ?
te recuerdo que las reglas del foro son una pregunta por tema, de todas maneras te digo que gms ni gm8 ni ningun gm tiene la funcion explode_string como en php, sin embargo hay varios script que hace precisamente eso, aqui te dejo uno que yo tengo desde hace mucho, no se de donde lo saque XD http://www.comunidadgm.org/desarrollo-de-scripts/string_explode%28string-delimiter%29/
una cosa, este explode solo explota con delimitadores de un solo caracter, mas de eso no funciona bien, y te devuelve un arreglo en la variable level.
Te vengo a spamear en un nivel insuperable. Lo acabé de subir xDDDD
http://www.comunidadgm.org/desarrollo-de-scripts/division-de-cadenas-por-un-separador-(explode)/msg124071/?topicseen#new
Y este sí permite separadores de más de un caracter, y devuelve el array con las separaciones