Autore Topic: Update php/mysqli  (Letto 761 volte)

Offline paul78

  • Utente normale
  • ***
  • Post: 357
  • Respect: +1
    • Mostra profilo
    • Android Code
  • Sistema operativo:
    Linux - Windows
Update php/mysqli
« il: 12 Agosto 2015, 23:39:17 CEST »
0
ciao a tutti!

stò cercando di capire come funziona l'update (e dopo il delete) dei dati di un php/mysqli.

in php scrivo:

Codice (Java): [Seleziona]
<?php

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "android_mysql";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

if (mysqli_connect_errno()) {
        exit('Connect failed: '. mysqli_connect_error());
}          

if(isset($_GET["id"]) && isset($_GET["nome"]) && isset($_GET["cognome"]) &&isset($_GET["messaggio"])){
$id=$_GET['id'];  
$nome=$_GET['nome'];
$cognome=$_GET['cognome'];
$messaggio=$_GET['messaggio'];  
$result = $conn->query("SELECT * FROM persone2");
if ($result->num_rows > 0){

        $conn->query("UPDATE persone2 SET nome='$nome', cognome='$cognome', messaggio='$messaggio' WHERE id = '$id'");
}
}


?>

in android per modificare i dati scrivo questo codice:
Codice (Java): [Seleziona]
class updDate extends AsyncTask<String, String, JSONObject> {

        /**
         * Before starting background thread Show Progress Dialog
         */

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(UpdateDeleteData.this);
            pDialog.setMessage("Updating accound..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }


        protected JSONObject doInBackground(String... params) {

                String url = "http://192.168.*.*/android_connect/update_data.php";
               
                idString = e_id.getText().toString();
                        nomeString = e_nome.getText().toString();
                        cognomeString = e_cognome.getText().toString();
                        messaggioString = e_messaggio.getText().toString();


            List<NameValuePair> param = new ArrayList<NameValuePair>();
            param.add(new BasicNameValuePair("id", idString));
            param.add(new BasicNameValuePair("nome", nomeString));
            param.add(new BasicNameValuePair("cognome", cognomeString));
            param.add(new BasicNameValuePair("messaggio", messaggioString));

           
                        JSONObject json = jsonParser.makeHttpRequest(url, "POST", param);

            try {

                int success = json.getInt("success");

                if (success == 1) {
                    // successfully updated
                    Intent intent = new Intent(UpdateDeleteData.this, UpdateDeleteData.class);
                    String ID = getIntent().getExtras().getString("id");
                    intent.putExtra("id", ID;
                    startActivity(intent);
                    finish();

                } else {
                    // failed to update product
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }


            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * *
         */

        protected void onPostExecute(JSONObject json) {
            // dismiss the dialog once product uupdated
            //pDialog.dismiss();
                pDialog.dismiss();
            try {
               
                        int success = json.getInt("success");

                if (success == 1) {
                    // successfully updated
                    Intent intent = new Intent(UpdateDeleteData.this, MainActivity.class);
                    String ID = getIntent().getExtras().getString("id");
                    intent.putExtra("id", ID);
                    startActivity(intent);
                    finish();

                } else {
                    // failed to update product
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

    }


da 2 giorni non riesco a capire se l'errore è dal php/mysqi o android...
vorrei una vostra opinione in modo tale da capire se devo concentrarmi sul codice php oppure su android.

grazie mille in anticipo!

tutti possiamo programmare...basta volerlo!!!

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Update php/mysqli
« Risposta #1 il: 13 Agosto 2015, 09:39:08 CEST »
0
L'errore è di chi sta sulla sedia! :D

Scherzo capita a tutti di perdersi in una sciocchezza, se rileggi attentamente  il tuo codice noterai che la pagina php usa il metodo get
Codice: [Seleziona]
if(isset($_GET["id"]) && isset($_GET["nome"]) && isset($_GET["cognome"]) &&isset($_GET["messaggio"]))
 mentre in android invii i dati con il metodo post
Codice: [Seleziona]
JSONObject json = jsonParser.makeHttpRequest(url, "POST", param);
Se la mia risposta ti è utile, per favore un thanks!

Offline paul78

  • Utente normale
  • ***
  • Post: 357
  • Respect: +1
    • Mostra profilo
    • Android Code
  • Sistema operativo:
    Linux - Windows
Re:Update php/mysqli
« Risposta #2 il: 13 Agosto 2015, 10:09:15 CEST »
0
questo errore l'avevo già intuito...

ma non riesco a modificare i dati!

nel web non riesco a trovare una guida di android con l'update di un mysqli..sono tutti con un semplice mysql.

tutti possiamo programmare...basta volerlo!!!

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Update php/mysqli
« Risposta #3 il: 13 Agosto 2015, 12:01:56 CEST »
0
Android non ci pensa nemmeno a collegarsi a mysql, è la pagina php che fa tutto il lavoro.

Dovresti fare un po' di debug della pagina php e vedere i risultati, come prima cosa invia gli stessi dati con post da un form e vedi se funziona o quale errore restituisce.
Sarebbe anche utile bonificare i dati prima dell'inserimento, hai attivo il magic_quotes?

Come mai fai prima la select?

Sarebbe più comodo gestirlo così per avere un messaggio di conferma:
Codice: [Seleziona]
$sql_update = "UPDATE persone2 SET nome='$nome', cognome='$cognome', messaggio='$messaggio' WHERE id = '$id'";
if ($conn->query($sql_update) === TRUE) {
    echo "Aggiornato";
} else {
    echo "Errore: " . $conn->error;
}
« Ultima modifica: 13 Agosto 2015, 12:05:45 CEST da LonelyWolf »
Se la mia risposta ti è utile, per favore un thanks!

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Update php/mysqli
« Risposta #4 il: 13 Agosto 2015, 16:07:08 CEST »
0
Ciao , se vuoi farla spiccia , io farei cosi
 file.php
Codice: [Seleziona]
<?php
        $host="localhost";
        $uname="root";
        $pwd="";
        $db="android_mysql";
   

        $con = mysql_connect($host,$uname,$pwd) or die("connection failed");
        mysql_select_db($db,$con) or die("db selection failed");
         
        $id=$_REQUEST['id'];
         $nome=$_REQUEST['nome'];
        $cognome=$_REQUEST['cognome'];
        $messaggio=$_REQUEST['messaggio'];
        $QueryUpdate ="UPDATE persone2 SET nome='" .$nome. "', cognome='" .$cognome. "',  messaggio='" .$messaggio. "' WHERE id = '".$id. "'" ;
        $flag['code']=0;

        if($r=mysql_query($QueryUpdate ,$con)) {
                $flag['code']=1;
        } else {
                $flag['code']=0;
           }

        print(json_encode($flag));
        mysql_close($con);
?>


UpdateJavaClass.java

Codice (Java): [Seleziona]
class updDate extends AsyncTask<String, String, String> {

        /**
         * Before starting background thread Show Progress Dialog
         */

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(UpdateDeleteData.this);
            pDialog.setMessage("Updating accound..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
          protected String doInBackground(String... params) {
InputStream is = null;
        int code;
        String result = null;
        String line = null;
        idString = e_id.getText().toString();
                        nomeString = e_nome.getText().toString();
                        cognomeString = e_cognome.getText().toString();
                        messaggioString = e_messaggio.getText().toString();


            List<NameValuePair> param = new ArrayList<NameValuePair>();
            param.add(new BasicNameValuePair("id", idString));
            param.add(new BasicNameValuePair("nome", nomeString));
            param.add(new BasicNameValuePair("cognome", cognomeString));
            param.add(new BasicNameValuePair("messaggio", messaggioString));
        try {
            /////Testing
            HttpParams httpParameters = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);
            HttpConnectionParams.setSoTimeout(httpParameters, 5000);
            HttpClient httpclient = new DefaultHttpClient(httpParameters);
            /////////
      ///      HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://192.168.*.*/android_connect/update_data.php");
            httppost.setEntity(new UrlEncodedFormEntity(param));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
            Log.e("pass 1", "connection success ");
        } catch (Exception e) {
            Log.e("Fail 1", e.toString());
            return "0";

        }

        try {
            BufferedReader reader = new BufferedReader
                    (new InputStreamReader(is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();
            Log.e("pass 2", "connection success ");
        } catch (Exception e) {
            Log.e("Fail 2", e.toString());
            return "0";

        }

        try {
            result = result.substring(8, 9);
            return result;
        } catch (Exception e) {
            Log.e("Fail 3", e.toString());
            return "0";

        }
              return "0";
        }

protected void onPostExecute(String result) {
            // dismiss the dialog once product uupdated
            //pDialog.dismiss();
                pDialog.dismiss();
            if ( result.equals("1")  ) {
               
                    // successfully updated
                    Intent intent = new Intent(UpdateDeleteData.this, MainActivity.class);
                    String ID = getIntent().getExtras().getString("id");
                    intent.putExtra("id", ID);
                    startActivity(intent);
                    finish();

                } else {
                    // failed to update product
                }

    }
}


potrebbe mancare qualche parentesi ,  saluti

Post unito: 13 Agosto 2015, 19:36:02 CEST
Aggiungo anche che io non costruirei la query nel file php , bensi la farei direttamente in parte java e poi la manderei direttamente al file php che si ocuperà solo dell ' inserimento / modifica / cancellazione
difatti cosi facendo non dovrai avere tanti file quante sono le tabelle del database e potrai utilizzare un unico file.php per eseguire " INSERT , UPDATE , DELETE "  e un unico a parte per la " SELECT "
saluti
« Ultima modifica: 13 Agosto 2015, 19:36:07 CEST da pietroconti89, Reason: Merged DoublePost »

Offline paul78

  • Utente normale
  • ***
  • Post: 357
  • Respect: +1
    • Mostra profilo
    • Android Code
  • Sistema operativo:
    Linux - Windows
Re:Update php/mysqli
« Risposta #5 il: 13 Agosto 2015, 22:52:44 CEST »
0
ciao pietroconti

il tuo cod. funziona benissimo!!

grazie mille anche ad altri programmatori che mi hanno aiutato!!

pietroconti ha iscritto questo:
Aggiungo anche che io non costruirei la query nel file php , bensi la farei direttamente in parte java e poi la manderei direttamente al file php che si ocuperà solo dell ' inserimento / modifica / cancellazione
difatti cosi facendo non dovrai avere tanti file quante sono le tabelle del database e potrai utilizzare un unico file.php per eseguire " INSERT , UPDATE , DELETE "  e un unico a parte per la " SELECT "

non ho capito bene come costruire la query in android..cioè la dovrei creare tramite sqlite?

potresti farmi un esempio??

sai...per il momento stò cercando di completare un crud con php e mysql..ma vorrei capire bene quale tipologia di script utilizzare in base a quello che dovrei creare.

grazie mille a tutti!
tutti possiamo programmare...basta volerlo!!!

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Update php/mysqli
« Risposta #6 il: 13 Agosto 2015, 23:56:43 CEST »
0
ti spiego attualmente operativamente tu acquisisci i tuoi dati tramite java , le inserisci in 4 variabili
Codice (Java): [Seleziona]
idString = e_id.getText().toString();
                        nomeString = e_nome.getText().toString();
                        cognomeString = e_cognome.getText().toString();
                        messaggioString = e_messaggio.getText().toString();
e le invvi al file php che vengono acquisite cosi
Codice: [Seleziona]
$id=$_REQUEST['id'];
         $nome=$_REQUEST['nome'];
        $cognome=$_REQUEST['cognome'];
        $messaggio=$_REQUEST['messaggio'];

a questo punto nel fil php costruisci la query
Codice: [Seleziona]
$QueryUpdate ="UPDATE persone2 SET nome='" .$nome. "', cognome='" .$cognome. "',  messaggio='" .$messaggio. "' WHERE id = '".$id. "'" ;
la query è quindi quell istruzione che invii al database per eseguire un certo comando , le cui principali sono
"INSERCT, UPDATE , DELETE , SELECT "
ora le prime tre istruzioni sono comandi di inserimento modifica e quindi non ci aspettiamo un vero e proprio output , ciò significa che invece che fare 3 file.php diversi che costruiscono una query per la INSERCT una per la DELETE ecc..
ne fai uno unico che semplicemente eseguirà la query che gli mandiamo dal java .... nell atto pratico il php cambia cosi

 
Codice: [Seleziona]
<?php
        $host="localhost";
        $uname="root";
        $pwd="";
        $db="android_mysql";
   

        $con = mysql_connect($host,$uname,$pwd) or die("connection failed");
        mysql_select_db($db,$con) or die("db selection failed");
         
        $QueryUpdate =$_REQUEST['query'];
        $flag['code']=0;

        if($r=mysql_query($QueryUpdate ,$con)) {
                $flag['code']=1;
        } else {
                $flag['code']=0;
           }

        print(json_encode($flag));
        mysql_close($con);
?>

puoi notare subito come ho eliminato le righe
Codice: [Seleziona]
  $id=$_REQUEST['id'];
         $nome=$_REQUEST['nome'];
        $cognome=$_REQUEST['cognome'];
        $messaggio=$_REQUEST['messaggio'];

e sostituite con un unico parametro di attesa
Codice: [Seleziona]
$QueryUpdate =$_REQUEST['query']; a questo punto possiamo tornare al java
e sostituire questa parte
Codice (Java): [Seleziona]
List<NameValuePair> param = new ArrayList<NameValuePair>();
            param.add(new BasicNameValuePair("id", idString));
            param.add(new BasicNameValuePair("nome", nomeString));
            param.add(new BasicNameValuePair("cognome", cognomeString));
            param.add(new BasicNameValuePair("messaggio", messaggioString));

semplicemente con
Codice (Java): [Seleziona]
List<NameValuePair> param = new ArrayList<NameValuePair>();
            param.add(new BasicNameValuePair("query", _Query));

ciò che significa che l'unico dato che andremo a passare sarà effettivamente la variabile "_Query"

variabile che implementeremo come segue subito dopo
Codice (Java): [Seleziona]
idString = e_id.getText().toString();
                        nomeString = e_nome.getText().toString();
                        cognomeString = e_cognome.getText().toString();
                        messaggioString = e_messaggio.getText().toString();

aggiungiamo

Codice (Java): [Seleziona]
String _Query="UPDATE persone2 SET nome='" +$nomeString+ "', cognome='" +$cognomeString+ "',  messaggio='" +$messaggioString+ "' WHERE id = '"+$idString+ "'" ;
in questo modo la query viene costruite nella parte java per poi essere inviata al file php , che a questo punto la esegue... come vedi cosi facendo

se devi fare un istruzione INSERCT , UPDATE o DELETE , potrai utilizzare lo stesso file php cambiando semplicemente la query nella parte JAVA ... e questo è il primo vantaggio , il secondo ancora più importante a mio parere è che
se hai una tabella sola contenente 4 colonne ok , ma se hai piu tabelle con più colonne di diverso nome dovresti fare tanti file quante sono le tabelle... un bel lavoraccio  :-P

ovviamente solo per le richieste di SELECT dovrai avere un file php a parte , per ovvia ragione , quando esegui le istruzioni sopra descritti non devi aspettarti un vero risultato dal database , se fai la select ci aspettiamo una risultato eccome  ;-)... ricorda solo di fare molta attenzione al concatenamento delle stringhe
ricorda che le query devono rispettare questa forma

nomecolonna='testo'

quindi fondamentale non scordarsi le apicette , ciò significa che quando concateni le stringhe con i diversi risultati la forma è come segue

"........ nomecolonna='" +variabile+ "' ";

saluti

Offline paul78

  • Utente normale
  • ***
  • Post: 357
  • Respect: +1
    • Mostra profilo
    • Android Code
  • Sistema operativo:
    Linux - Windows
Re:Update php/mysqli
« Risposta #7 il: 14 Agosto 2015, 09:53:45 CEST »
0
Sei stato veramente chiarissimo!!!
ho capito tantissime cose!  :-)

grazie mille!!!


tutti possiamo programmare...basta volerlo!!!

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Update php/mysqli
« Risposta #8 il: 14 Agosto 2015, 10:55:40 CEST »
0
Dal punto di vista della sicurezza meglio costruire la query sql nella pagina php e, prima, verificare i dati che arrivano.

Eseguire alla cieca una istruzione sql arrivata tramite qualsiasi metodo non è mai una bella cosa; se fai solo test non ha senso perchè, passando poi in produzione, dovresti riscrivere il codice e quindi sarebbe come non averlo testato.

Se io scarico la tua app, vedo la pagina che esegue la query e poi invio tramite post/get (usando tu $_REQUEST non devo nemmeno cercare il metodo corretto!):

Codice: [Seleziona]
drop table persone2;
Cosa succede?
Se la mia risposta ti è utile, per favore un thanks!

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Update php/mysqli
« Risposta #9 il: 14 Agosto 2015, 11:08:37 CEST »
0
si è una validissima osservazione , in termine di sicurezza perde un pò , però non capisco perchè dici " VEDO LA PAGINA " , il java una volta compilato non mi pare si possa de-compilare , e ammeno che non si mettono Log.e che mostrano percorsi ecc o si salva il sito nei resource XML  , come fai a vedere la posizione corretta del file nel webserver ? il problema nasce se davvero sai dov'è posizionato no ?  se invece hai una struttura della costanti in java e in stile
Codice (Java): [Seleziona]
public class Costanti {
    private static final String SITO  = "http://.......";
    private static final String TabellaUtente = "Persona";
    private static final String UserId= "XXXX";
    // ECCCC

    public static String getSITO() {
        return SITO;
    }

    public static String getTabellaUtente() {
        return TabellaUtente;
    }

    public static String getUserId() {
        return UserId;
    }
}

il problema pensi sorge in ogni caso ?

è ovvio che se io conosco  la posizione  ed eseguo
http://dominio/DB/file.php?query='drop ...' sono fottuto

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Update php/mysqli
« Risposta #10 il: 14 Agosto 2015, 11:52:17 CEST »
+1
Non è necessario de-compilare nulla, basta "mettere" un proxy tra il telefono e internet per poi leggere i log.

Il proxy viene configurato per loggare tutte le richieste e i dati inviati, quindi basta usare l'app per un po' e poi leggersi tutti  i log, a quel punto hai l'indirizzo completo, tutte le query inviate, ecc.;

Per chi è interessato a fare una cosa del genere ci vogliono 5 minuti.

Utilizzando connessioni https diventerebbe molto più complicato, pero richiede anche una configurazione del server web più "fine".

Per questo se si passano solo i dati necessari (usa anche un parametro numerico per la tabella e uno per l'operazione così hai sempre un file php unico per insert, delete e update) il log di un eventuale proxy recupera l'indirizzo della pagina e dei dati, e:
1)deve prima capire i parametri numerici a cosa corrispondono (non difficilissimo, ma tempo da perderci)
2) poi dovrebbe fare delle prove per capire i nomi dei campi e/o l'ordine per tentare una inject sql (molto tempo)
3) se la pagina php controlla i dati prima di costruire la query il malintenzionato non riuscirà a eseguire drop, truncate, ecc.
Se la mia risposta ti è utile, per favore un thanks!

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Update php/mysqli
« Risposta #11 il: 14 Agosto 2015, 21:26:00 CEST »
0
capito , grazie per la spiegazione , effettivamente il problema me lo ero posto tempo indietro , e immaginavo una situazione del genere anche se non pensavo si riuscisse ad ottenere tutte queste informazioni  :-o