Autore Topic: json_decode. Vi prego, aiutatemi!!  (Letto 975 volte)

Offline Tk.3

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: +2
    • Mostra profilo
  • Sistema operativo:
    Windows 7
json_decode. Vi prego, aiutatemi!!
« il: 29 Aprile 2011, 21:42:08 CEST »
0
Salve ragazzi, sono un nuovo utente di questo magnifico forum.
Volevo chiedervi una sorta di consulenza:
Sono da diversi giorni fermo su questo codice. Davvero non so più come fare. Ho visto diversi link del forum, e vi prego, siate clementi con me, non ditemi questa discussione è già stata discussa qui qui e qui.  :-)
Lo dico perchè ho già girato in lungo e in largo questo forum, ma dove parlavate di questo problema non ho trovato risposta.

In pratica cosa voglio fare:
voglio semplicemente registrare un nuovo utente su un database posto su internet (ho messo l'intent sul Manifest).
nome | cognome | citta | email | password

(in realtà ci saranno dei "controlli, ma li faccio dopo). Ora voglio solo scrivere questi dati nel mio database.

Quale è il problema:
non ho errori. E' assurdo, ma non ho errori.
Solo che quando passo i miei dati al php, per memorizzarli nel database, se li passo come JSONObject,
mi alloca in memoria un "utente" con tutti i campi vuoti.
Se invece li passo come JSONArray, mi alloca un utente in cui i dati passati non risultano quelli corretti, ma sempre stringhe "Array".
(quindi ho un utente con i dati:  array | array | array | array| array invece di tizio | caio |cittàdicaio | email | pssw )

Ora cosa ho provato a fare:
ho messo un flag nel programma, per vedere se entrava in qualche Exception. No, il flag non entra in nessuna di queste.
ho provato a mettere un "blocco" sul lato android: if(valore_passato!="Array") {continua...}
risultato? sul database mi scrive sempre Array | Array |....

Cosa penso sia il problema:
Credo che dal lato Android mando i file correttamente (altrimenti i controlli sopra fatti non sarebbero stati fatti) mentre su php, per qualche
strano motivo, mi da dei problemi.
Posto il codice qui sotto.

Vi prego, aiutatemi! E' per una Tesi di Laurea e... se non faccio questo non posso finire!

IL CODICE PHP
Codice: [Seleziona]
<?php
$nome =  json_decode($_POST['name']);
$cognome = json_decode(($_POST['surname']), true);
//$citt = $decoded["citt"];
//$mail = $decoded["mail"];
//$pass1 = $decoded["pass"];

mysql_query("INSERT INTO utenti
             (nome , cognome , citta , email, password )
             VALUES
             ('$nome', '$cognome', '$citt', '$mail', '$pass1' )") OR DIE(mysql_error());

?>


Codice (Java): [Seleziona]
public class login3 extends Activity {
   
        //dichiaro due tipi di stringe
    String temp;
    String jsonText;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //definisco il mio oggetto JSON di nome j
       
        JSONArray a =new JSONArray();
        JSONArray b =new JSONArray();  
        JSONArray c =new JSONArray();
        JSONArray d =new JSONArray();
        JSONArray f =new JSONArray();
        a.put("tizio");
        b.put("caio");
        c.put("Milano");
        d.put("tizio@caio.it");
        f.put("prova");
       
            int val=0;
           /* try {
                    //e inserisco i miei valori al suo interno
                        JSONObject j = new JSONObject();
               
                    j.put("nome", "Tizio");
                    j.put("cognome", "Caio");
                    j.put("citta", "Milano");
                    j.put("email", "tizio@caio.it");
                    j.put("password", "prova");
                    j.toString();
            }
            catch(JSONException e){
                    e.printStackTrace();
                    val=1;
            }*/

            try {
                    //definisco l'url a cui passare i valori in questione
                        String url = "http://activepolis.altervista.org/registrazione3.php";
                    Map <String, String> kvPairs = new HashMap <String, String>();
                    //e li passo attraverso la seguente
                    if((a.toString()!="Array")&&(b.toString()!="Array")){
                    kvPairs.put("name", a.toString());
                    kvPairs.put("surname", b.toString());
                    //qui invece ottengo i valori di risposta e li inserisco in temp come string
                    HttpResponse re = HTTPPoster.doPost(url, kvPairs);
                    temp = EntityUtils.toString(re.getEntity());
                    Toast.makeText(login3.this, "\n"+kvPairs+"\n", Toast.LENGTH_LONG).show();
                    }
            }
            catch(ClientProtocolException e){
                    e.printStackTrace();
                    val=2;
            }
            catch(IOException e){
                    e.printStackTrace();
                    val=3;
            }    
            //se temp è = a SUCCESS la registrazione è completata
            if (temp.compareTo("SUCCESS")== 0) {
                    Toast.makeText(login3.this, "REGISTRAZIONE COMPLETATA!", Toast.LENGTH_LONG).show();
            }
            //altrimenti qualcosa non ha consentito la corretta registrazione
            else{
                    Toast.makeText(login3.this, "REGISTRAZIONE NON EFFETTUATA! "+val, Toast.LENGTH_LONG).show();
            }
           
    }
}
Codice (Java): [Seleziona]
public class HTTPPoster {
    //doPost deve essere formata dall'url (stringa) e da kvpairs(map<string, string>)
    public static HttpResponse doPost(String url, Map<String, String> kvPairs)throws ClientProtocolException, IOException {
            //dichiaro httpclient e httppost (a cui associo la url)
                HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            //e se kvpairs è valida
            if (kvPairs != null && kvPairs.isEmpty() == false) {
                    //creo una lista nameValuePairs
                        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(kvPairs.size());
                    //dichiaro poi due stringe k e v per i controlli interni
                        String k, v;
                    Iterator<String> itKeys = kvPairs.keySet().iterator();
                    while (itKeys.hasNext()) {
                            k = itKeys.next();
                            v = kvPairs.get(k);
                            nameValuePairs.add(new BasicNameValuePair(k, v));
                    }
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            }
            //creo poi response a cui associo la "risposta" del php e la ritorno ad android
            HttpResponse response;
            response = httpclient.execute(httppost);
            return response;
    }
}


Sono nelle vostre mani. Io proprio non so come fare.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:json_decode. Vi prego, aiutatemi!!
« Risposta #1 il: 29 Aprile 2011, 22:40:44 CEST »
0
Non è una buona presentazione aprire un topic del tipo "vi prego aiutatemi bla bla bla", ma sorvoliamo.

Per capire il problema secondo me dovresti loggare lato php cosa contiene la variabile $_POST quando lo script viene invocato.

PS: non ho ben capito perchè usi 5 array...

Offline Tk.3

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: +2
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:json_decode. Vi prego, aiutatemi!!
« Risposta #2 il: 29 Aprile 2011, 22:57:17 CEST »
0
Anzitutto, grazie per la risposta.
Sò che non è bene iniziare così, ma ho davvero bisogno di aiuto. Ho la tesi quasi pronta e mi manca solo questa parte (inizialmente il database era sul dispositivo, poi è stato messo in rete e ora mi trovo in fretta e furia a modificare il codice).

Partiamo dal presupposto che di php ne so davvero poco.
Come faccio a vedere su lato php cosa contiene la variabile?
Se uso il comando echo($variabile) non mi mostra nulla a schermo. 

Comunque uso cinque array per "tentativo", perchè in realtà inizialmente usavo un solo Object JSON ma non mi dava un risultato corretto
e ho provato, piuttosto che con un object unico, con tanti array. Era solo un tentativo (tra l'altro "andato a male").
« Ultima modifica: 29 Aprile 2011, 23:12:29 CEST da Tk.3 »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:json_decode. Vi prego, aiutatemi!!
« Risposta #3 il: 29 Aprile 2011, 23:11:39 CEST »
0
Per loggare su php puoi semplicemente andare a scrivere (facendo l'append ovviamente) su un file di testo.

Offline Tk.3

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: +2
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:json_decode. Vi prego, aiutatemi!!
« Risposta #4 il: 29 Aprile 2011, 23:51:59 CEST »
0
ma guardando il codice, magari lascia stare i 5 array e vedi l'object (sotto commento)... ti sembra ci siano errori?
Sto decisamente impazzendo per capire questa cosa da ormai diversi giorni.
E proprio non riesco a venirne a capo.

P.s. quello che mi hai suggerito non credo di saperlo fare.. ti ripeto, in php sono messo maluccio!  ;-)

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:json_decode. Vi prego, aiutatemi!!
« Risposta #5 il: 30 Aprile 2011, 00:06:19 CEST »
+1
Allora, prima cosa : per fare un controllo su stringhe NON usare

Codice (Java): [Seleziona]
if((a.toString()!="Array")&&(b.toString()!="Array"))
ma usa il metodo equals() della classe String.

Seconda cosa, stando alla documentazione ufficiale di Android, il metodo toString() di un JSONArray restituisce una cosa del tipo :

Codice: [Seleziona]
[valore1,valore2,valore3]
Ergo, questo per PHP, dato che non è tipizzato come Java, è a tutti gli effetti un Array !
Quindi quando passi i valori alle tue variabili $nome,$cognome ecc gli stai passando un Array, che poi contenga solo un dato o meno è sempre un Array.

In conclusione o usi il metodo get() del JSONArray per riprenderti i dati o li estrai dal PHP lato server. Comunque non ha senso passare 5 JSONArray, tanto vale passare i valori direttamente senza usare JSON.

Offline Tk.3

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: +2
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:json_decode. Vi prego, aiutatemi!!
« Risposta #6 il: 30 Aprile 2011, 11:27:12 CEST »
0
Si, si lo sò che non ha senso usare 5 array, vi ripeto, io stavo lavorando solo con un Object. I 5 Array li ho presi ad usare semplicemente ieri, nella mia più disperata voglia di passare i dati (quanto meno per capire come diamine fanno a comunicare php e android. Sulla carta è semplice, ma nella parte pratica mi ha dato parecchio filo da torcere). Provo a fare come mi hai consigliato tu, vedo se almeno funzionano i 5 array...
cerco almeno di fare le cose con ordine :)
 

Offline Tk.3

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: +2
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:json_decode. Vi prego, aiutatemi!!
« Risposta #7 il: 30 Aprile 2011, 12:11:17 CEST »
0
Allora ragazzi, ho risolto in parte. Mi spiego. Riesco a popolare il db senza tutti quei JSONArray.
E vi ringrazio, non fosse stato per le vostre risposte non avrei mai capito dove diamine sbagliavo.

Ora ho un secondo, credo piccolissimo problema:
nel php voglio mettere un flag che mi dice se la registrazione è ok, o meno.
(A prescindere dal fatto che l'email esiste già, o che hai lasciato un campo vuoto, ...)
Se è ok, ad esempio, mi dice flag=1; se no flag=0;
e ritornare questa variabile ad android.
Questo per poter dire all'utente: "bravo, ti sei registrato con successo". o "tizio, vedi che non ti sei registrato".
Ora il mio quesito. Come faccio a "leggere" da android questa variabile?
Solo questo. So che non è chissà cosa.. ma il fatto che devo consegnare tutto a breve mi sta caricando di ansia
e non riesco a ragionare come si deve, quindi mi perdo facilmente in un bicchier d'acqua.

Offline Tk.3

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: +2
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:json_decode. Vi prego, aiutatemi!!
« Risposta #8 il: 30 Aprile 2011, 21:14:35 CEST »
0
raga, scusate se insisto, ma nessuno mi riesce ad aiutare?
Ho solo un "vincolo". L'email non può essere ripetuta.
quindi devo dire: se l'email è già presente flag=1;
se l'email non è presente inserisci nel db (e il flag resta 0).
Ora, come faccio a dire ad android "hai effettuato la registrazione"
o "non hai registrato i tuoi dati: email già presente"?
Cioè, come faccio a passare questo flag?

perchè con l'if che ho messo nel codice

 if (temp.compareTo("SUCCESS")== 0)

mi dice sempre "registrazione non effettuata. Invece i dati li inserisce correttamente.
Non sto proprio capendo dove sbaglio.
Spero qualcuno possa aiutarmi!