Italian OK voglio provare a fare un gioco

LordZenzo

Well-Known Member
Licensed User
Longtime User
un saluto al forum
premetto che è la prima volta che uso mysql, httpjob e php

devo leggere da un mysql su aruba e cercando sul forum ho trovato il codice php

che ho messo sul server
scritto questo codice

B4X:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region
#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim query As String
    Dim job As HttpJob
End Sub
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Private EditText1 As EditText
End Sub
Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("Mondo1") 
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Button1_Click
       query = "Select Nome where ID=0 " ' qui ci scrivi la tua query
       'Dim MD5 As String = MD5calc("xxxxxx" & query) ' la password deve essere la stessa del file PHP
       Dim su As StringUtils
       query = su.EncodeUrl(query,"UTF8")
       job.Initialize("call",Me)
       job.Download("http://www.giannini-lorenzo.com/Mondo1/execute.php?sql=" & query)
       EditText1.Text=job.GetString
End Sub

arrivato a edittext1=job.GetString
si chiude senza alcun messaggio
mi aiutate?
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
Non so se tutto il resto del codice sia esatto ma EditText1.Text = job.GetString devi metterlo in un evento JobDone (puoi trovare esempi così).

Comunque ti consiglio di scrivere le query nel PHP, per motivi di sicurezza.

[il primo JobDone che ho trovato sul Forum: https://www.b4x.com/android/forum/t...od-return-value-in-a-class.56028/#post-376763 ]
lo avevo detto che sono imbranato!!:(:(
certo, quando il gioco comincerà a essere operativo mettero anche un password
per ora mi serve di capire come usare mysql per avere i dati
 

LordZenzo

Well-Known Member
Licensed User
Longtime User

sirjo66

Well-Known Member
Licensed User
Longtime User
devi studiarti i HttpJob
quando invii un comando tramite HttpJob, poi devi dare il tempo al server di risponderti, mentre tu hai fatto un job.Getstring subito dopo aver inviato il comando.
Dopo il job.Download devi quindi uscire dalla routine, e quando il server ti risponderà verrà chiamata una Sub per gestire questo evento, che si chiama proprio JobDone (come ti ha detto Luca).
Dentro questa Sub devi quindi gestire il tutto.
Non è proprio così intuitivo, quindi prima di tutto vai a vederti qualche esempio

Sergio

P.S.: ottimo il suggerimento che ti hanno dato di mettere le query nel PHP e/o di mettere una password, comunque penso che per ora puoi proseguire così, poi se vorrai aumentare il livello di sicurezza della tua app potrai mettere password, inserire le query nel PHP, crittografare i dati eccetera, ma credo che per ora sia un lavoro inutile.
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
ok, ho seguito i vari consigli
ho creato questo php in una cartella del server

B4X:
<?php
$sql = '';
if (isset($_GET['sql'])) $sql = $_GET['sql'];
include('config.php');
//avvio connessione al database
$db = @mysql_connect($mysql_host,$mysql_user,$mysql_password);
if (!$db) {
   echo "E\nErrore connessione al database\n".mysql_error()."\n"; // 4 righe
   return;
}

mysql_select_db($mysql_database);
mysql_query("SET CHARACTER SET utf8");

$sqla = "SELECT nome FROM `Mondo1` WHERE id=$sql";   <--- qui creo la sql col parametro passato
$rs = mysql_query($sqla);

if ($rs === false) {
   echo "E\nErrore query\n".mysql_error()."\n".$sqla;
   mysql_close($db);
   return;
}

// estraggo il comando base
$cmd = strtoupper($sqla);
$vn = strpos($cmd, " ");
if ($vn !== false) $cmd = substr($cmd, 0, $vn);

switch ($cmd) {
case "SELECT":
   $nrs = mysql_num_rows($rs); // record count
   for ($i = 0; $i < $nrs; $i++) { $lst[] = mysql_fetch_assoc($rs); } // porto i risultati sull'array $lst
   echo json_encode($lst);
   break;
case "UPDATE":
   echo "K\n".mysql_affected_rows();
   break;
case "DELETE":
   echo "K\n";
   break;
case "INSERT":
   echo "K\n".mysql_insert_id();
   break;
default:
   echo "K\n";
}

@mysql_free_result($rs);
mysql_close($db);

?>

che funziona benissimo ritornando come risulato
[{"nome":"lorenzo"}]

quindi seguendo un esempio trovato nel forum ho scritto questo codice in jobdone

B4X:
     If jobd.JobName = "CallName" Then
       'Label1.Text=job.GetString
        Dim res As String
        res = jobd.GetString
        'Log("Back from Job:" & Job.JobName )
        Log("Response from server: " & res)
  
        Dim parser As JSONParser
        parser.Initialize(res)

        Dim m As Map
        m = parser.NextObject
        'Log(m.Get("nome"))
        Label1.Text = m.Get("nome")   
    End If
alla riga
m = parser.NextObject
il programma si chiude
dove sbaglio? nella discussione si parla di tutto ma non di quella riga che "sembra" data per esatta


se modifico cosi
Dim m As List <-- list invece di map
m.Initialize
m = parser.Nextarray
Label1.Text = m.Get(0)

ottengo
{nome:lorenzo}
che non e' quello che mi serve

NB. anche nella spiegazione del JSONParser viene usata la map
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Lo script scritto in PHP ti restituisce una Array (cioè List) di oggetti Map, per cui devi "aprirli" con una giusta sequenza.
Nel tuo caso:
B4X:
Dim Mm As Map
Dim Ll As List
Ll = parser.NextArray
Mm = Ll.Get(0)
Label1.Text = Mm.Get("nome")
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Attento Lorenzo che non hai applicato proprio NESSUN tipo di protezione e quindi sono entrato nel tuo server in meno di 1 minuto !!
Per farti capire che è vero ciò che dico ti informo che il tuo database si chiama Sql941664_1
e che la tabella Mondo1 ha i seguenti campi:
ID, Nome, DataInizio, set1D, set1T, set2D, set2T, .... fino a set45D, set45T, punti, legno, pietra, cibo, colla, soldi, diamanti
Nella tabella Mondo1 c'è un solo record

ok per fare le prove, però un minimo di sicurezza ci vuole, mi raccomando, cerca di aggiungere almeno la password al file PHP appena possibile

Sergio
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
Attento Lorenzo che non hai applicato proprio NESSUN tipo di protezione e quindi sono entrato nel tuo server in meno di 1 minuto !!
Per farti capire che è vero ciò che dico ti informo che il tuo database si chiama Sql941664_1
e che la tabella Mondo1 ha i seguenti campi:
ID, Nome, DataInizio, set1D, set1T, set2D, set2T, .... fino a set45D, set45T, punti, legno, pietra, cibo, colla, soldi, diamanti
Nella tabella Mondo1 c'è un solo record

ok per fare le prove, però un minimo di sicurezza ci vuole, mi raccomando, cerca di aggiungere almeno la password al file PHP appena possibile

Sergio
e si il file config e' in chiaro.....
non voglio essere proprio sprovveduto e ho tolto i permessi di lettura e scrittura dei file php
dove devo mettere la password? dentro il file php ?
md5calc a quale libreria fa riferimento?
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
Nel file PHP la password va inserita su questa riga:
B4X:
$md5 = md5("lamiapassword".$sql);
Nel codice B4A ti serve la routine md5calc per calcolare il checksum, eccotela qui:
B4X:
Sub MD5calc(Value As String) As String

   Dim bc As ByteConverter
   Dim md As MessageDigest

   Dim data() As Byte = bc.StringToBytes(Value, "UTF8")
   Dim hash() As Byte = md.GetMessageDigest(data, "MD5")
     Return bc.HexFromBytes(hash)

End Sub
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
Nel file PHP la password va inserita su questa riga:
B4X:
$md5 = md5("lamiapassword".$sql);
Nel codice B4A ti serve la routine md5calc per calcolare il checksum, eccotela qui:
B4X:
Sub MD5calc(Value As String) As String
.....cut

ti ringrazio, non riuscivo proprio a trovarla...
ho implementato il tutto, vediamo se ora entri in un minuto...;);););)

un altra domanda
se il job mi torna il nome lo recupero con list e map, ma se e' un errore lo recupero con un NextValue
percui pensavo di fare cosi
B4X:
       Dim val As String = parser.NextValue
       
        If val<>"E" Then 
          Dim Mm As Map
          Dim Ll As List
          Ll = parser.NextArray
          Mm = Ll.Get(0)
          Label1.Text = Mm.Get("nome")   
        Else 
          Label1.Text =parser.NextValue 
        End If
ma mi da errore perche' se non e' un errore non e' un Value e mi chiude con errore il programma
c'e' un modo per saper prima che tipo di dato ho in jsonparser?
ho devo usare try catch ? per gestire l'errore?
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
ok,
dal database leggo i dati
ora sto provando a fare una animazione
o la mia formichina che cammina su un punto fisso, per muoverla userò le coordinate top e left che cambio con un tocco o con un gamepad (poi vedrò)
ma se voglio farla ruotare su se stessa?
per camminare ho usato
B4X:
    Dim Formica As AnimationPlus
    Dim Cammina As AnimationDrawable
    Private ImageView1 As ImageView
    Private Panel2 As Panel
End Sub
Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Mondo1")    
    Cammina.Initialize
    Cammina.AddFrame(LoadBitmap(File.DirAssets,"unaformica.jpg")  ,100)
    Cammina.AddFrame(LoadBitmap(File.DirAssets,"unaformica1.jpg") ,100)
    Cammina.AddFrame(LoadBitmap(File.DirAssets,"unaformica2.jpg") ,100)
    Cammina.AddFrame(LoadBitmap(File.DirAssets,"unaformica3.jpg") ,100)
    Cammina.OneShot=False
    ImageView1.Background=Cammina 
    cammina.start
per farla ruotare dovrei usare
InitializeRotateCenter( "" , 0 ,x,...) per cui ho aggiunto

Formica.InitializeRotateCenter("",1,0,ImageView1)
Formica.Duration=1000
Formica.RepeatCount=-1
Formica.RepeatMode=Formica.REPEAT_INFINITE
Formica.Start(ImageView1)

che non funziona....
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
ops.....
funziona, avevo messo da 1 a 0 gradi... invece che da 0 a x gradi(360 un giro)

però finita la rotazione mi torna al punto iniziale, e se invece deve rimanere ruotata e poi successivamente ri-ruotare verso una o l'altra direzione?
insomma se deve da move....
 
Last edited:

LordZenzo

Well-Known Member
Licensed User
Longtime User
risolto in maniera un po sporca cosi
Formica.Initializerotatecenter("",gradi,gradi,ImageView1)
Formica.Duration=100
Formica.RepeatMode=Formica.REPEAT_INFINITE
Formica.RepeatCount =-1
Formica.Start(ImageView1)
in pratica ruota in maniera infinita tra lo stesso angolo
 

sirjo66

Well-Known Member
Licensed User
Longtime User
c'e' un modo per saper prima che tipo di dato ho in jsonparser?
ho devo usare try catch ? per gestire l'errore?

Certo, è molto molto semplice :)
Nella Sub JobDone, hai una riga che legge i dati ricevuti, ad esempio
B4X:
testo = job.GetString
A questo punto basta che analizzi il primo carattere della stringa ricevuta.
Se il primo carattere è una "E" vuol dire che c'è stato un errore, dividi la stringa ricevuta (ti trovi quattro righe) e analizzando la stringa capisci quale è l'errore.
Se invece ricevi il carattere "K", oppure "[", oppure "{" (basta insomma che sia diverso da "E"), allora tutto ok e prosegui.

Sergio

P.S.: se il primo carattere è un "[" devi iniziare con parser.NextArray, se è un "{" devi iniziare con parser.NextObject
 
Top