Italian Mysql su Aruba

micro

Well-Known Member
Licensed User
Salve ragazzi
ho appena abilitato 1Gb di spazio DB MySql su Aruba.
Vorrei iniziare a fare qualche prova di scrittura sui db da remoto con una applicazione in b4j.
Qualcuno ha già approcciato un esempio di codice per sue esigenze?
Giusto per spianarmi la strada.
Grazie
 

sirjo66

Well-Known Member
Licensed User
Credo che se il DB è su Aruba, l'unico modo per poter accedervi è dal server, per cui dovresti farti delle pagine in PHP per leggere/scrivere sul database

Sergio
 

giannimaione

Well-Known Member
Licensed User
Credo che se il DB è su Aruba, l'unico modo per poter accedervi è dal server, per cui dovresti farti delle pagine in PHP per leggere/scrivere sul database

Sergio
oppure degli script in ASP (con una sintassi molto vicina a b4x)
 

micro

Well-Known Member
Licensed User
Grazie per i reply, per VPS non credo Aruba ne metta a disposizione (forse sbaglio).
Da quello che ho letto sicuramente si potrà accedere solo in php o ASP (Il DB è su Aruba).
Qualcosa come esempio di partenza lo riesco a trovare?
Avevo creato una pagina php tempo fà quando feci una prova con uniserver (mysql, Apache, php) e Basic4ppc ma
ho perso tutto, era un index.php che avevo modficato diverse volete leggendo consigli di qua e di la ma solo a livello di prova.
 

sirjo66

Well-Known Member
Licensed User
Ti passo pari pari quello che uso io nei miei programmi, è una procedura in PHP che funziona con MySQL, e che prevede la gestione del SELECT, UPDATE, DELETE, INSERT e altri.
Ovviamente se hai necessità la puoi adattare alle tue esigenze, per domande sono qui.
E' anche prevista la gestione di una password che devi impostare sia su questo file PHP (alla riga n. 13) sia sul tuo programma in B4A (o B4J non ha importanza) in modo da gestire una comunicazione sicura tra client e server.

File EXECUTE.PHP:
B4X:
<?php

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

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

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

include('config.php');

$md5 = md5("password".$sql);

if ($md5 != strtolower($chk)) {
   echo "E\nErrore parametro chk\nParametro chk non corretto\n"; // 4 righe
   return;
}

//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");

$rs = mysql_query($sql);

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

// estraggo il comando base
$cmd = strtoupper($sql);
$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);

?>
Per chiamare la routine puoi fare (ad esempio) così:
B4X:
  Dim query As String
   query = "Select ......... " ' qui ci scrivi la tua query

   Dim MD5 As String = MD5calc("password" & query) ' la password deve essere la stessa del file PHP
   Dim su As StringUtils
   query = su.EncodeUrl(query,"UTF8")
   HttpJob.Download("http://www.ilnomedelserver.it/execute.php?chk=" & MD5 & "&sql=" & query)
Nel caso di una SELECT il sistema risponderà con il recordset in formato JSON, e vedi che è andato tutto bene perchè il primo carattere della stringa ricevuta è un "{", mentre se il primo carattere ricevuto è una "E" (che vuol dire errore), riceverai una stringa (divisa sempre in 4 righe) con la descrizione dell'errore.

Nel caso di un UPDATE, se tutto è ok, riceverai una stringa di 2 righe, la prima sarà "K" e la seconda riga ti dice quanti record ha modificato, se invece c'è stato un errore riceverai la solita stringa composta da 4 righe con la descrizione dell'errore.

Nel caso di un INSERT, se tutto è ok, riceverai una stringa di 2 righe, la prima sarà "K" e la seconda riga ti dà un eventuale ID del record inserito (se è previsto la generazione dell'ID), se invece c'è stato un errore riceverai la solita stringa composta da 4 righe con la descrizione dell'errore.

Spero che questa cosa ti sia utile

Per qualsiasi domanda chiedi pure

Sergio

Edit: per iniziare a fare un po' di prove puoi temporaneamente disabilitare il test del checksum MD5, basta che nel file PHP cancelli le seguenti righe:
B4X:
if ($md5 != strtolower($chk)) {
      echo "E\nErrore parametro chk\nParametro chk non corretto\n"; // 4 righe
     return;
}
e nel tuo codice fai a meno di calcolare l'MD5 e non lo invii come parametro
 
Last edited:

micro

Well-Known Member
Licensed User
Grazie Sergio
il tempo di preparare l'attrezzatura e fare delle prove.....
Ti faccio sapere se è ok.

Perdonami Sergio, qui
B4X:
$sql = '';
metto il nome del database?
 

sirjo66

Well-Known Member
Licensed User
No.
Tutti i parametri per accedere al database sono dentro il file config.php che come vedi viene letto all'inizio della procedura e che contiene le variabili necessarie alla connessione, eccoti un esempio di un file config.php:
B4X:
<?php
  $mysql_host = "localhost";
  $mysql_database = "database_name";
  $mysql_user = "username";
  $mysql_password = "password";
?>
 

micro

Well-Known Member
Licensed User
Ok, avviate le prime prove.
questa la query che dovrebbe essere giusta ma mi ritorna l'errore dicendo che la sintassi della query non è corretta
B4X:
query = "INSERT INTO Varie (Id, CodiceFiscale, Nome, Cognome, Via, Attivita, Anni, Data, Ora) VALUES (Null, 'XXXXXXXXXXXXXXXX', 'PALLINO', 'PINCO', 'CORSO ITALIA', 'IMPRENDITORE', '27', '30/01/2016', '19:22:14');"
In JobDone mi ritorna con successo la connessione ma in GetString trovo l'errore.
Ho messo gli apici anche a null ma nulla, sempre lo stesso errore.
 

sirjo66

Well-Known Member
Licensed User
Sicuramente hai un problema con il formato della data, prova con
'2016-01-30'
oppure con
'01-30-2016'

purtroppo in questo momento non sono davanti al PC e non posso provare, comunque sono sicuro che MySQL non vuole la data in formato dd/MM/yyyy come hai fatto tu

togli anche il punto e virgola finale che non serve a nulla

inoltre io non inserirei il campo ID nella query, perchè da quello che ho capito viene poi gestito e incrementato direttamente da MySQL, giusto ??
Togli ID e anche il null dalla query
 

micro

Well-Known Member
Licensed User
la data è come campo di tipo 'Text' così come l'ora, quindi non è quello il problema.
provo a togliere il ; e il campo Id e ti faccio sapere.
Grazie per la disponibilità.

....nulla.
Fato subito la prova senza ; e/o Id ma stesso tipo di errore.
Eppure non ne vedo errori di formattazione query (o forse vedo male).
 
Last edited:

micro

Well-Known Member
Licensed User
Sono andato direttamente dal pannello di phpMyAdmin e provato con il tool a disposizione ad inserire questa stringa SQL (ho visto come la generava direttamente da lì)
B4X:
INSERT INTO `Varie` (`Id`, `CodiceFiscale`, `Nome`, `Cognome`, `Via`, `Attivita`, `Anni`, `Data`, `Ora`) VALUES (Null, 'XXXXXXXXXXXXXXXX', 'PALLINO', 'PINCO', 'CORSO ITALIA', 'IMPRENDITORE', '27', '30/01/2016', '19:22:14')
e l'ha inserita senza errori.

Se la invio con il programma di prova in B4J mi ritorna sempre lo stesso errore di errata formattazione.
 

micro

Well-Known Member
Licensed User
prova a passare una stringa vuota per l'ID, anziché il Null
Gia fatto Luca.
Ma ripeto se la stessa stringa la invio dal pannello di MyphpAdmin, un tool disponibile di aruba, il record viene inserito.

Questo è l'errore che mi ritorna da execute.php
B4X:
E
Errore query
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'XXXXXXXXXXXXXXXX\', \'PALLINO\', \'PINCO\', \'CORSO ITALIA' at line 1
INSERT INTO `Varie` (`Id`, `CodiceFiscale`, `Nome`, `Cognome`, `Via`, `Attivita`, `Anni`, `Data`, `Ora`) VALUES (Null, \'XXXXXXXXXXXXXXXX\', \'PALLINO\', \'PINCO\', \'CORSO ITALIA\', \'IMPRENDITORE\', \'27\', \'30/01/2016\', \'19:22:14\')
La cosa strana è perchè dove dice 'at line 1' si ferma alla colonna Via e non mi mostra il seguito.
 

LucaMs

Expert
Licensed User
Non conosco la strana sintassi di PHP (usato molto poco, ma con molti copia e incolla :p).

Ma quelle barre \'xxxx...\' ?

Non dovresti passare: VALUES (Null, "xxx", "PALLINO",...
?


P.S. sto rileggendo; quella stringa è un parametro dell'URL.
 

micro

Well-Known Member
Licensed User
Io non vorrei fosse un problema del php
rivedendolo ho trovato un = di troppo ma non è questo il problema.
B4X:
$rs = mysql_query($sql);
if ($rs === false) {
   echo "E\nErrore query\n".mysql_error()."\n".$sql;
   mysql_close($db);
   return;
}
Questa è comunque la parte che fallisce, $rs ritorna sempre false.

Ora faccio la prova che mi dici Luca.
Ciao

P.S.
Mi ritorna l'errore di query empty
ho provato sia con
B4X:
job.Download2("http://www.xxxxxxxxx.it/execute.php?", Array As String("chk=", MD5, "&sql=", query))
che con
B4X:
job.Download2("http://www.xxxxxxxxx.it/execute.php?", Array As String("chk", MD5, "&sql", query))
ma l'errore è lo stesso.
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Ma quelle barre \'xxxx...\' ?
Il problema sono proprio le barre, non dovrebbero essere inviate !!

Ci sono quindi due soluzioni
1) trovi il sistema che le barre non vengano inviate
2) modifichi EXECUTE.PHP in modo che tolga le barre cioè dopo la riga
include('config.php');
aggiungi la riga:
$sql = stripslashes($sql);

Sergio
 
Top