Autore Topic: Interrogazione database MySql da client tramite server php  (Letto 1484 volte)

Offline jonny185

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Interrogazione database MySql da client tramite server php
« il: 26 Settembre 2013, 12:13:51 CEST »
0
Salve a tutti ,ho il seguente problema : cercando nei vari forum su internet ho trovato un modo per interrogare da un client (smartphone android) un database mysql situato sul mio pc di casa tramite apposito e semplice server scritto in php. Peccato che non funzioni.
Vi posto il codice e vi spiego il problema:
Il database è semplice
E' un database MySql (io lo ho chiamato “hellohttp”) che contiene una tabella chiamata “Persone”, dentro la quale abbiamo i campi “id”, “nome”, “cognome”.

Qui di seguito c’è il codice della pagina “richiestaInfo.php” che risiede sul server e verrà invocata dall’applicazione android per prelevare dei dati dal database:
Codice: [Seleziona]
<?php
mysql_connect("localhost:3306","root","");
mysql_select_db("hellohttp");
 
$q=mysql_query("SELECT * FROM persone WHERE id=".$_REQUEST['idnomerichiesto']);
while($e=mysql_fetch_assoc($q))
        $output[]=$e;
 
print(json_encode($output));
 
mysql_close();
?>

Premetto che io sto usando wamp per lanciare il server da casa
Non ho fatto altro che creare il database con mysql ,poi ho creato con il blocco notes il file in php e l'ho copiato nella cartella www di wamp e ho avviato il tutto in mkodo che fosse attivo quando qualche client si connettesse.

Ora vediamo il codice dell’applicazione Android che fa da client e che vuole interrogare il server remoto ed ottenere i dati di un particolare “id”:
Codice: [Seleziona]
public class HelloHttpPostActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        final TextView textviewDatiRicevuti = (TextView) findViewById(R.id.datiRicevuti);
 
        Button buttonInviaDati = (Button) findViewById(R.id.buttonInviaDati);
        buttonInviaDati.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                //invio richiesta
                textviewDatiRicevuti.setText(inviaDati());
            }
        });
    }
 
    public String inviaDati(){
        String result = "";
        String stringaFinale = "";
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("idnomerichiesto","1"));
        InputStream is = null;
 
        //http post
        try{
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://10.0.2.2:8080/helloHttp/richiestaInfo.php");
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
        }catch(Exception e){
                Log.e("TEST", "Errore nella connessione http "+e.toString());
        }
        if(is != null){
            //converto la risposta in stringa
            try{
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                    StringBuilder sb = new StringBuilder();
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                            sb.append(line + "\n");
                    }
                    is.close();
 
                    result=sb.toString();
            }catch(Exception e){
                    Log.e("TEST", "Errore nel convertire il risultato "+e.toString());
            }
 
            //parsing dei dati arrivati in formato json
            try{
                    JSONArray jArray = new JSONArray(result);
                    for(int i=0;i<jArray.length();i++){
                            JSONObject json_data = jArray.getJSONObject(i);
                            Log.i("TEST","id: "+json_data.getInt("id")+
                                    ", cognome: "+json_data.getString("cognome")+
                                    ", nascita: "+json_data.getInt("anno")
                            );
                            stringaFinale = json_data.getInt("id") + " " + json_data.getString("cognome") + " " + json_data.getInt("anno") + "\n\n";
                    }
            }
            catch(JSONException e){
                    Log.e("log_tag", "Error parsing data "+e.toString());
            }
        }
        else{//is è null e non ho avuto risposta
 
        }
 
        return stringaFinale;
    }
}

Qui di seguito c’è il semplice codice dell’interfaccia grafica dell’applicazione Android:
Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
 
    <Button
        android:id="@+id/buttonInviaDati"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Invia dati" />
 
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Dati ricevuti:"
        android:textAppearance="?android:attr/textAppearanceLarge" />
 
    <TextView
        android:id="@+id/datiRicevuti"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Per ora nessun dato ricevuto" />
 
</LinearLayout>

Inoltre ho aggiunto nel file manifest i seguenti permessi
Codice: [Seleziona]
<uses-permission android:name="android.permission.INTERNET" />

Il problema che sussiste è che mi da errore nella connessione
Ho cercato su internet e il problema risiede nel fatto che dovrei separare la richiesta http dal resto del codice usando gli asynctask ma non ci riesco ad applicarli qui
se potreste darmi una mano magari provando il codice sul vostro pc ,perchè altrimenti non saprei come andare avanti

Offline jonny185

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:Interrogazione database MySql da client tramite server php
« Risposta #1 il: 28 Settembre 2013, 17:12:10 CEST »
0
Ho provato a risolvere questo problema ma ho riscontrato un altro problema
Vedendo un pò su internet ho modificato così il codice utilizzando l'asynctask per incapsulare la richiesta da inviare al server.
Tenta di connettersi ma poi mi dà errore nella connessione.
Se cambio la porta da 8080 a 80 sembra connesso ma poi da errore di JSONException ,infatti ho messo una stampa del risultato e sembra ci sia un errore nella lettura della pagina di 403 forbidden.
Ora non so proprio dove sbaglio ,come vi ripeto io sto usando wamp
Vi posto l'ultima versione del codice

server php
Codice: [Seleziona]
<?php
mysql_connect("localhost:3306"," root ","");
mysql_select_db("hellohttp");
 
$q=mysql_query("SELECT * FROM persone WHERE id=".$_REQUEST['idnomerichiesto']);
while($e=mysql_fetch_assoc($q))
        $output[]=$e;
 
print(json_encode($output));
 
mysql_close();
?>

app client android
Codice: [Seleziona]
package com.hellohttppostactivity;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

         //public String str_finale = "";
     TextView textviewDatiRicevuti;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // inizializzo la variabile globale
        textviewDatiRicevuti = (TextView) findViewById(R.id.datiRicevuti);
       
        Button buttonInviaDati = (Button) findViewById(R.id.buttonInviaDati);
        buttonInviaDati.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                //invio richiesta
                    //textviewDatiRicevuti.setText(inviaDati());
                     HttpGetTask task = new HttpGetTask();
                 task.execute();
            }
        });
    }
   
   
   
    private class HttpGetTask extends AsyncTask<String,String,String>  {

        @Override
        protected String doInBackground(String... params) {
                String result = "";
            String stringaFinale = "";
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("idnomerichiesto","1"));
            InputStream is = null;
     
            //http post
            try{
                    HttpClient httpclient = new DefaultHttpClient();
                    HttpPost httppost = new HttpPost("http://192.168.0.2:8080/richiestaInfo.php");
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                    HttpResponse response = httpclient.execute(httppost);
                    HttpEntity entity = response.getEntity();
                    is = entity.getContent();
            }catch(Exception e){
                    Log.e("TEST", "Errore nella connessione http "+e.toString());
            }
            if(is != null){
                //converto la risposta in stringa
                try{
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                                sb.append(line + "\n");
                        }
                        is.close();
     
                        result=sb.toString();
                }catch(Exception e){
                        Log.e("TEST", "Errore nel convertire il risultato "+e.toString());
                }
               
                System.out.println(result);
               
                //parsing dei dati arrivati in formato json
                try{
                        JSONArray jArray = new JSONArray(result);
                        for(int i=0;i<jArray.length();i++){
                                JSONObject json_data = jArray.getJSONObject(i);
                                Log.i("TEST","id: "+json_data.getInt("id")+
                                        ", cognome: "+json_data.getString("cognome")+
                                        ", nascita: "+json_data.getInt("anno")
                                );
                                stringaFinale = json_data.getInt("id") + " " + json_data.getString("cognome") + " " + json_data.getInt("anno") + "\n\n";
                        }
                }
                catch(JSONException e){
                        Log.e("log_tag", "Error parsing data "+e.toString());
                }
            }
            else{//is è null e non ho avuto risposta
     
            }
     
            return stringaFinale;
           
        }

        @Override
        protected void onProgressUpdate(String... values) {
           
        }

        @Override
        protected void onPostExecute(String result) {
            // aggiorno la textview con il risultato ottenuto
                textviewDatiRicevuti.setText(result);
        }
     }
}

Offline matttt

Re:Interrogazione database MySql da client tramite server php
« Risposta #2 il: 29 Settembre 2013, 07:51:29 CEST »
0
Mi sembra che il problema qui sia lato server.
Lo script PHP che stai usando non è messo tanto bene... non c'è praticamente alcun controllo di errore. Ognuna delle funzioni mysql ti ritorna qualcosa che ti indica lo stato dell'operazione.

Probabilmente il problema è che hai messo degli spazi prima e dopo il nome utente. Password vuota? Utente root? (pratiche sconvenienti sul lato sicurezza... ma se è per test ok)

Prova comunque a cambiare la riga:
Codice (PHP): [Seleziona]
mysql_connect("localhost:3306"," root ","");
con:
Codice (PHP): [Seleziona]
mysql_connect("localhost","root","");
Puoi provare anche con un browser qualsiasi...
http://localhost/tua_pagina.php?idnomerichiesto=blablabla
Le mie apps su Google Play Store:

Offline jonny185

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:Interrogazione database MySql da client tramite server php
« Risposta #3 il: 29 Settembre 2013, 11:01:30 CEST »
0
ho fatto la prova che dicevi tu ,ci ho aggiunto password root e nella pagina del web browser mi appare la stringa corretta
Codice: [Seleziona]
[{"id":"1","nome":"Giuseppe","cognome":"Rossi"}]

Poi ho fatto partire l'app android ,innanzitutto se metto come porta 8080 mi da errore nella connessione .Allora l'ho sostituita con 80 e non mi dà più quell'errore ,bensì mi dice
Error parsing data org.json.JSONException:Value <!DOCTYPE of type java.lang.String cannot be converted to JSONArray

infatti nel codice ho messo una stampa del risultato della risposta http ed effettivamente mi stampa questa cosa qui su console

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to acces /richiestaInfo.php on this server.</p>
</body></html>


Potresti aiutarmi a capire cos'è che non va?
Io nel codice PHP non ho messo il DOCTYPE

Offline matttt

Re:Interrogazione database MySql da client tramite server php
« Risposta #4 il: 29 Settembre 2013, 11:24:54 CEST »
0
+ 80 è corretto, la configurazione di default di Apache è sulla 80 (ma puoi sempre cambiare se vuoi...)

+ Errore 403: forse c'è qualcosa che non va con l'URL?
Sicuro che l'indirizzo che hai messo nella tua app sia lo stesso (come pagina PHP) che hai inserito nel browser? Ovviamente usando l'IP del PC col webserver, non localhost...

+ In alternativa come ulteriore test: apri il browser nel cell e prova la connessione alla pagina PHP, così vedi se il problema è collegato all'accesso dalla rete locale (che è diverso da accedere da localhost)
« Ultima modifica: 29 Settembre 2013, 11:29:44 CEST da matttt »
Le mie apps su Google Play Store:

Offline jonny185

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:Interrogazione database MySql da client tramite server php
« Risposta #5 il: 29 Settembre 2013, 11:32:30 CEST »
0
Codice: [Seleziona]
HttpPost httppost = new HttpPost("http://192.168.0.2:80/richiestaInfo.php");

Il file richiestaInfo.php è situato nella cartella www di wamp
Io non faccio altro che aprire wamp ,clicco su server online e basta.Non apro alcun file

Poi dall'app android scusa cosa dovrei inserire ,non è questo l'url giusto?

Offline matttt

Re:Interrogazione database MySql da client tramite server php
« Risposta #6 il: 29 Settembre 2013, 16:22:41 CEST »
0
Ma se sul cell (o su un altro PC della rete) apri il browser e metti: "http://192.168.0.2/richiestaInfo.php" funziona?
Le mie apps su Google Play Store:

Offline jonny185

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:Interrogazione database MySql da client tramite server php
« Risposta #7 il: 29 Settembre 2013, 17:20:24 CEST »
0
Ho trovato il problema ,era che non avevo i privilegi per accedere ,dovevo modificare i permessi all'interno del file di configurazione httpd.conf e aggiungere l'indirizzo ip del secondo computer da cui accedevo