Italian ancora php b4x help

Xfood

Expert
Licensed User
buona serata a tutti,
ormai sono giorni che provo a gestire al meglio un db remoto su altervista com script php
in pratica riesco a fare tutte le query, tranne inserire il campo blob con una foto, oppure leggere un record
dove e' contenuto un campo blob con foto ("caricata a mano direttamente dal portale altervista")

qualcuno puo' darmi una mano per favore,
in pratica in tutte le tabelle dove mi serve il campo blob con la foto, creo un campo sempre con lo stesso nome
cioe FotoBlob cosi che posso verificare l'esistenza del campo, ma anche utilizzando questo script non mi restituisce nulla

:script php
B4X:
<?php

$databasehost = "localhost";
$databasename = "nomedb";
$databaseusername ="utente";
$databasepassword = "password";



error_reporting(E_ALL ^ E_WARNING);
error_reporting(0);
$con = mysqli_connect($databasehost,$databaseusername,$databasepassword, $databasename) or die(mysqli_error($con));
mysqli_set_charset ($con , "utf8");
$query = file_get_contents("php://input");
$sth = mysqli_query($con, $query);

if (mysqli_errno($con)) {
   header("HTTP/1.1 500 Internal Server Error");
   echo $query.'\n';
   echo mysqli_error($con);
}
else
{
   $rows = array();
   while($r = mysqli_fetch_assoc($sth)) {
     if ($r['FotoBlob'] instanceof mysqli_stmt) {
        // Field is of type BLOB
       $r["FotoBlob"] = base64_encode($r["FotoBlob"]);
       }
       $rows[] = $r;
   }
   $res = json_encode($rows);
    echo $res;
    mysqli_free_result($sth);
}
mysqli_close($con);
?>

se lancio questo codice, mi ritorna l'elenco

B4X:
dim metodoas string ="Cerca"
    Dim query As String = $"Select idCategoria, DesCategoria from Categorie where idCategoria<10 ;"$
    Wait For (connessionePhp.ExecuteRemoteQuery(query,metodo)) Complete (Valore As String)
    Log("valore " & metodo &": " & Valore)

ma se lancio questo codice, non mi ritorna nulla ritorna solo [] quindi vuoto

B4X:
dim metodo as string ="Cerca"
    'Dim query As String = $"Select idCategoria, DesCategoria from Categorie where idCategoria<10 ;"$
    Dim query As String = $"Select * from Categorie where idCategoria<10 ;"$
    Wait For (connessionePhp.ExecuteRemoteQuery(query,metodo)) Complete (Valore As String)
    Log("valore " & metodo &": " & Valore)

chiaramente tutte le query $"Select * from ;"$ mi ritornano il contenuto della tabella, se non ci sono campi blob popolati
qualche suggerimento?

anche un suggerimento di come inserire un record della tabella categorie, avente solo 3 campi idCategoria, DesCategoria,FotoBlob

allego anche la funzioncina executeremotequery

B4X:
Sub ExecuteRemoteQuery(Query As String, JobName As String) As ResumableSub
    Dim res As String
    Dim job As HttpJob
    Log(Query)
    
    job.Initialize(JobName, Me)
    job.PostString(Main.cRemoteStringa, Query)
    Wait For (job) JobDone(job As HttpJob)
    
    Log("successo?")
    Log(job.Success)
    Log(job.GetString)
    Log("fine successo")
    If job.Success Then
        res = job.GetString
        Log("res: " & res)
        If JobName="Insert" Then res="OK"
        If JobName="Delete" Then res="OK"
        If JobName="Cerca" And  res.Length < 5 Then res="0"
'        Return res
    Else
        res = "ERR"
        
        'Return "errore"
    End If
    
    job.Release
    Return res

End Sub
 

sirjo66

Well-Known Member
Licensed User
Longtime User
se possibile io evito campi blob, danno solo problemi dato che sono campi binari

due soluzioni:

1) la foto viene memorizzata su di una cartella, nel db hai un campo con il nome del file (oppure al file dai un nome con l'id del record)

2) prima di memorizzare la foto nel DB la trasformi in Base64 e quindi diventa un campo di tipo testo. Nel momento in cui vai a leggerla la ritrasformi in un array binario e quindi non hai problemi nel leggere/scrivere il campo

visto che sei su altervista penso ti convenga la soluzione numero due
 
Last edited:

Xfood

Expert
Licensed User
se possibile io evito campi blob, danno solo problemi datoi che sono campi binari

due soluzioni:

1) la foto viene memorizzata su di una cartella, nel db hai un campo con il nome del file (oppure al file dai un nome con l'id del record)

2) prima di memorizzare la foto nel DB la trasformi in Base64 e quindi diventa un campo di tipo testo. Nel momento in cui vai a leggerla la ritrasformi in un array binario e quindi non hai problemi nel leggere/scrivere il campo

visto che sei su altervista penso ti convenga la soluzione numero due
grazie, pensavo alla stessa soluzione, ma non riesco a fare funzione il tutto
 

sirjo66

Well-Known Member
Licensed User
Longtime User
se il campo blob diventa un campo testo non riesco a capire quale problema hai
tu hai detto che i campi testo riesci a leggerli, perchè quello no ?

hai ristrutturato il DB cambiando la struttura della tabella modificando il campo blob in campo testo ?
 

Xfood

Expert
Licensed User
se il campo blob diventa un campo testo non riesco a capire quale problema hai
tu hai detto che i campi testo riesci a leggerli, perchè quello no ?

hai ristrutturato il DB cambiando la struttura della tabella modificando il campo blob in campo testo ?
in effetti no, faccio qualche prova e vedo come va
 

Xfood

Expert
Licensed User
se il campo blob diventa un campo testo non riesco a capire quale problema hai
tu hai detto che i campi testo riesci a leggerli, perchè quello no ?

hai ristrutturato il DB cambiando la struttura della tabella modificando il campo blob in campo testo ?
Oggi purtroppo sono tutta la giornata fuori proverò a dargli un'occhiata a questa sera,
 

Xfood

Expert
Licensed User
Per caso @sirjo66 saresti così gentile da potermi girare un piccolo esempio, una semplice form in b4j con due campi descrizione e foto, descrizione una texteview e foto una imageview, il classico bottone sotto la foto seleziona, posso selezionare la foto e visualizzarla nella imageview, è un bottone salva che mi salva diciamo sul DB Altervista remoto la descrizione e la foto convertita Nel formato come mi suggerisci tu e un altro bottone load dove leggo il dato dal db di Altervista e visualizzo la descrizione e la foto scaricata da Altervista, te ne sarei veramente grato perché sono giorni che provo a lavorarci sopra e non riesco a venirne a capo. Grazie mille anticipatamente
 

giannimaione

Well-Known Member
Licensed User
Longtime User
e se invece posizioni le foto in una cartella (sempre su altervista) e poi con http job esegui il download ?
 

Xfood

Expert
Licensed User
e se invece posizioni le foto in una cartella (sempre su altervista) e poi con http job esegui il download ?
Credo che sia più complicato, trasferire se foto in ftp, recuperarle ogni volta che si fa la selezione, mi sembra più agile ( e semplice) avere un capo foto da gestire nel bd, sono riuscito a prelevare le foto dal campo blob di mysql su altervista, adesso devo capire come inviare la stringa in byte per inserire / aggiornare la foto
 

Xfood

Expert
Licensed User
Non pensavo di trovare tante difficoltà, nel gestire 3 semplici tabelle , in un db remoto,
In Pratica devo creare una piccola applicazione di catalogo , con 3 tabelle, utenti, gruppi e articoli, la parte b4j, come amministratore Per inserire / cancellare / modificare i dati , con foto praticamente su tutti e 3 le tabelle, e la parte b4a, che preleva i dati e li inserisce in una sorta di carrello,

Simile a questo, ma su altervista , questo e con rdc2
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Per caso @sirjo66 saresti così gentile da potermi girare un piccolo esempio, una semplice form in b4j con due campi descrizione e foto, descrizione una texteview e foto una imageview, il classico bottone sotto la foto seleziona, posso selezionare la foto e visualizzarla nella imageview, è un bottone salva che mi salva diciamo sul DB Altervista remoto la descrizione e la foto convertita Nel formato come mi suggerisci tu e un altro bottone load dove leggo il dato dal db di Altervista e visualizzo la descrizione e la foto scaricata da Altervista, te ne sarei veramente grato perché sono giorni che provo a lavorarci sopra e non riesco a venirne a capo. Grazie mille anticipatamente

Purtroppo non uso B4J mi dispiace

Comunque i passi da fare:
1) modificare la struttura del database, togliendo il campo BLOB e mettendo un campo di tipo testo
2) nel momento i cui fai "insert" devi prima trasformare la foto in Base 64 e inviarla come testo al database
3) nel momento in cui devi leggere dal database, il campo foto ti arriverà come testo e lo ritrasformi in binario sempre con le routine Base64
4) lo visualizzi sul form

Sei sicuro che il codice scritto in PHP funzioni bene ??
 

Xfood

Expert
Licensed User
grazie @sirjo66 per la tua check list,
per prelevare le foto sembra tutto ok lato php ( mi ha aiutato IA) poi posto il codice corretto,
adesso devo prelevare la foto dal pc, trasformala, e inviarla, non ho avuto modo di creare questa procedura, stavo provando ad utilizzare la libreria di @Kluas xResizeAndCrop, ( https://www.b4x.com/android/forum/threads/b4x-xui-xresizeandcrop.100109/ )
per prelevare l'immaggine dal pc, e dopo averla selezionata , salvarla sucome tmp.jpg, rileggerla in modalita byte, e inviarla al server php, vediamo cosa riesco a fare
 
Top