Italian B4A - Connessione a database Remoto

rds

Member
Ciao a tutti,
qualcuno ha qualche codice sorgente per capire come effettuare connessione con database remoto? Nello specifico utilizzo database PostgreSQL.

Sto provando con jRDC2 ma non è che mi sia molto chiaro.

Grazie.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
puoi accedere al tuo database PostgreSQL con codice PHP ??
Se sì, io ho pubblicato un script scritto in PHP che accede al database MySQL ma puoi modificarlo a tuo piacimento per connetterti a PostgreSQL, e poi ho pubblicato anche il codice B4A per accedere allo script, puoi così colloquiare con il tuo database senza troppe difficoltà

Sergio
 

rds

Member
puoi accedere al tuo database PostgreSQL con codice PHP ??
Se sì, io ho pubblicato un script scritto in PHP che accede al database MySQL ma puoi modificarlo a tuo piacimento per connetterti a PostgreSQL, e poi ho pubblicato anche il codice B4A per accedere allo script, puoi così colloquiare con il tuo database senza troppe difficoltà

Sergio

Grazie per la risposta.

Sì, il DB è accessibile tramite PHP (ho sviluppato un applicativo WEB che si interfaccia con il DB in questione tramite Apache/PHP): dove posso trovare il tuo codice?
 

rds

Member
Ciao,
gentilissimo.

Ho però dei problemi: ho semplificato un po' il tuo php, giusto per fare delle prove di connessione.

Questo è il file (monbile_access.php) per la connessione al DB


<?php

include("include/dbconn.php");

// esegue un comando SQL (SELECT - UPDATE - DELETE - INSERT o altri)

$sql = '';
if (isset($_GET['sql'])) $sql = $_GET['sql'];

$conn = pg_connect("$dbHost $dbPort $dbName $dbUser $dbPassword");
if(!$conn)
{
die("Connessione Database Fallita");
}
else
{
echo "Connessione riuscita";
}

$rs = pg_query($sql);

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

switch ($cmd) {
case "SELECT":
$lst=pg_fetch_array($rs);
echo json_encode($lst);
break;

default:
echo "K\n";
}
pg_free_result($rs);
pg_close($conn);



- Da browser, su pc, se punto a "http://xxx.yyy.zzz.www:porta/chiamate/mobile_access.php", mi stampa a video Connessione Riuscita.
- Da browser, su pc, se punto a "http://xxx.yyy.zzz.www:porta/chiamate/mobile_access.php?sql=SELECT * FROM tecnici mi stampa a video Connessione Riuscita e un record della tabella su cui ho fatto la query (la stringa inizia con { )

Quindi sembrerebbe tutto ok...

Da B4A invece:


Dim Job1 As HttpJob
Job1.Initialize("Job1",Me)

Job1.Download2("http://xxx.yyy.zzz.www:porta/chiamate/mobile_access.php", Array As String ("sql","SELECT * FROM tecnici"))

If Job1.Success Then
Msgbox("OK","")
End If

...ecco... il Job1.Success è sempre FALSE

Sbaglio qualcosa? Sicuramente dovrò capire ancora molte logiche di questo programma/funzionamento, però così, a naso, non mi sembra molto sbagliato :)
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
quando chiami Job1.Download2 devi dare poi il tempo al server di elaborare il comando ricevuto, estrarre i dati dal database e risponderti, per cui non puoi farlo nella riga subito dopo.

Guardati bene alcuni esempi nell'uso di HttpJob, dato che il comando Job1.Download puoi farlo praticamente in qualsiasi punto del programma, ma poi il tuo programma deve andare in "idle" (cioè praticamente non fare più nulla), perchè quando arriverà la risposta dal server, verrà chiamata la routine JobDone dove dovrai quindi gestire il tutto.

Io di solito faccio così:
1) definisco una variabile "Fase As String" in modo globale per tenere traccia di quello che sto facendo
2) quando devo fare una chiamata al server, uso (ad esempio):
B4X:
Fase = "lettura tecnici"
ProgressDialogShow("Attendi...")
Jobb.Download(http://xxx.yyy.zzz.www:porta/chiamate/mobile_access.php?sql=SELECT * FROM tecnici")
Exit Sub
in questo modo, essendoci il ProgressDialog mostrato, l'utente non può fare nulla
Poi:
B4X:
Sub JobDone (Job As HttpJob)
   Dim Vs As String = ""

   If Job.Success = True Then Vs = Job.GetString
   Job.Release
  
   If Vs = "" Then
     ProgressDialogHide
     Msgbox("Errore connessione","ERRORE")
     Return
   End If
  
   ' elaboro le risposte
  
   If Fase = "lettura tecnici" Then
  
     If Vs.SubString2(0, 1) <> "[" Then
       lblLibro.Text = ">> ERRORE PROTOCOLLO DI COMUNICAZIONE (1) <<"
       ProgressDialogHide
       Return
     End If
    
     If Vs = "[]" Then ' record non trovato
       lblLibro.Text = ">> NON TROVATO <<"
       ProgressDialogHide
       Return
     End If
    
     Dim JSON As JSONParser
     Dim Mm As Map
     Dim Ll As List
    
     JSON.Initialize(Vs)
     Ll = JSON.NextArray
     Mm = Ll.Get(0)
    
     ' faccio quello che devo fare ..............

     lblLibro.Text = Mm.Get("lib_titolo")
    
     ' inserisco in "posizione"
     Fase = "inserimento tabella posizione"
     Job.Download(http://xxx.yyy.zzz.www:porta/chiamate/mobile_access.php?sql=INSERT INTO POSIZIONE ......")
     Return
    
   End If
  
   If Fase = "inserimento tabella posizione" Then
    
     ' ...... faccio quello che serve

       ProgressDialogHide
  
     Return
  
   End If
  
   If Fase = "quello che vuoi" Then
    
     ' ...... faccio quello che serve

       ProgressDialogHide
    
     Return
  
   End If
 
  
End Sub

Devi solo quindi capire un po' questa tecnica di programmazione basata più sugli eventi che non sulla normale procedura lineare
 
Last edited:

rds

Member
Grazie come sempre...smanettando un po' avevo infatti trovato la soluzione con il JobDone...e a tutti glie effetti qualche risposta dal webserver ce l'ho...il problema ora è che pare che il json_encode mi restituisca una strnga che il Parser non riconosce come JSON.
Nella fattispecie il risultato è questo
{"codtecnico":"2","tecnico":"PIPPO","marchio":"123456","marchio2":"ABC","firma":null}{"codtecnico":"3","tecnico":"PLUTO","marchio":"789012","marchio2":"DEF","firma":null}

Non inizia e non finisce con le parentesi quadre.
Tra i due gruppi racchiusi tra parentesi graffe non c'è la virgola.

Ho modificato il codice php di modo da forzare l'aggiunta di ciò che manca per rendere la stringa di modo che sia JSON....ma il parser si arrabbia lo stesso...

Boh, non so, mi pare troppo macchinoso poter accedere al mio DB PostgreSQL in questo modo...mi sa che cerco altre soluzioni...anche se mi pare di capire non ce ne siano altre, oltre a questa e al jRDC2...
 

sirjo66

Well-Known Member
Licensed User
Longtime User
beh, non puoi modificare il codice PHP in modo errato e poi pretendere che funzioni ;)
è ovvio che se la linea
for ($i = 0; $i < $nrs; $i++) { $lst[] = mysql_fetch_assoc($rs); }
me la trasformi in
$lst=pg_fetch_array($rs);
non viene eseguito il ciclo for e quindi è normale che non ci siano le parentesi quadre nel file JSON ed è quindi normale che non venga interpretato giusto

Prova a modificare la riga in
for ($i = 0; $i < $nrs; $i++) { $lst[] = pg_fetch_assoc($rs); }
oppure in
for ($i = 0; $i < $nrs; $i++) { $lst[] = pg_fetch_array($rs); }
Sergio
 
Last edited:

rds

Member
..... sei riuscito a risolvere ???

ciao scusami ma sono stato male e quindi per tutta la scorsa settimana non mi sono collegato.
Avevo già risolto in precedenza, riuscendo a capire che il risultato prodotto dal PHP era un Object e non un Array...di conseguenza il parsing andava fatto in modo diverso.

Appena riesco provo con il ciclo for che mi hai consigliato e ti farò sapere (o while, che mi piace di più :) )
 

zakker

Member
Licensed User
beh, non puoi modificare il codice PHP in modo errato e poi pretendere che funzioni ;)
è ovvio che se la linea
for ($i = 0; $i < $nrs; $i++) { $lst[] = mysql_fetch_assoc($rs); }
me la trasformi in
$lst=pg_fetch_array($rs);
non viene eseguito il ciclo for e quindi è normale che non ci siano le parentesi quadre nel file JSON ed è quindi normale che non venga interpretato giusto

Prova a modificare la riga in
for ($i = 0; $i < $nrs; $i++) { $lst[] = pg_fetch_assoc($rs); }
oppure in
for ($i = 0; $i < $nrs; $i++) { $lst[] = pg_fetch_array($rs); }
Sergio

sono sempre io...con altro nick, dopo aver acquistato la licenza.
Ho risolto usando for ($i = 0; $i < $nrs; $i++) { $lst[] = pg_fetch_assoc($rs); }

Grazie per la dritta...ora che ho capito il meccanismo vado come un treno ;)
 

zakker

Member
Licensed User
...ma in questo modo si può lavorare in modo asincrono? Il DB può essere interrogato da più dispositivi contemporaneamente, ognuno ricevendo la risposta corretta alle query che stanno "sottoponendo" al server ?
 

sirjo66

Well-Known Member
Licensed User
Longtime User
1) spiega meglio cosa vuoi dire per "modo asincrono"

2) certo, il DB può essere interrogato da più dispositivi contemporaneamente, dato che sul server dove risiede la pagina PHP che viene chiamata sarà sicuramente presente un programma per gestire il tutto (ad esempio Apache)
 
Top