usando studio formulario example php android mysql return toast

php - studio - El valor siempre devuelve 0 donde debería devolver el número de filas insertadas



login-en-android-usando-php-y-mysql (4)

Tengo dos tablas, una es Information y la otra es WorkForce

Información

Personal

La column twf en WorkForce se usa para obtener el id de la información , que supone un retorno como 1, pero devuelve el valor 0. Si el id en la información es 5, twf debe ser 5.

En primer lugar, uso la a para representar el número de filas seleccionadas y luego agrego el parámetro a en addWorkForce . La toast siempre muestra 0.

a=addInformation(name,weather,date2,status,first1[1],last1[1]); Toast.makeText(getApplicationContext(),a+"",Toast.LENGTH_LONG).show(); addWorkForce(Sub, NoP, NoH,a);

función addInformation

public long addInformation( final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) { class AddInfo extends AsyncTask<String, Void, String> { ProgressDialog loading; @Override protected void onPreExecute() { super.onPreExecute(); loading = ProgressDialog.show(WorkDetailsTable.this, "Please Wait",null, true, true); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); loading.dismiss(); Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show(); } @Override protected String doInBackground(String... params) { HashMap<String, String> data = new HashMap<String,String>(); data.put(Config.KEY_USER_NAME,name); data.put(Config.KEY_WEATHER,weather); data.put(Config.KEY_DATE,date2); data.put(Config.KEY_STATUS,status); data.put(Config.KEY_TIMEIN,timeIn); data.put(Config.KEY_TIMEOUT,timeOut); RequestHandler rh=new RequestHandler(); String result = rh.sendPostRequest(Config.ADD_INFORMATION,data); return result; } } AddInfo ru = new AddInfo(); ru.execute(name,weather,date2,status,timeIn,timeOut); return 0; }

¿Puede alguien ayudarme a resolver el problema?

addInformation.php

<?php if($_SERVER[''REQUEST_METHOD'']==''POST''){ //Getting values $name = $_POST[''name'']; $weather = $_POST[''weather'']; $date = $_POST[''date'']; $status = $_POST[''status'']; $timeIn = $_POST[''timeIn'']; $timeOut = $_POST[''timeOut'']; //Creating an sql query $sql = "INSERT INTO information(name, weather, date, status, time_in, time_out) VALUES (''$name'',''$weather'',''$date'', ''$status'', ''$timeIn'', ''$timeOut'')"; //Importing our db connection script require_once(''dbConnect.php''); //Executing query to database if(mysqli_query($con,$sql)){ echo ''Information Added Successfully''; }else{ echo ''Could Not Add Information''; } //Closing the database mysqli_close($con); } ?>

Así es como utilicé el código para insertar la fila en sqlite y funciona.

a = ts.insertTimeSheet(name, weather, date2, status, first1[1], last1[1]);

TimeSheet

public long insertTimeSheet(String name, String weather, String date, String status, String TimeIn, String TimeOut) { database = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(MyDatabaseHelper.Name, name); values.put(MyDatabaseHelper.Weather, weather); values.put(MyDatabaseHelper.Date, date); values.put(MyDatabaseHelper.Status, status); values.put(MyDatabaseHelper.TimeIn_Info, TimeIn); values.put(MyDatabaseHelper.TimeOut_Info, TimeOut); return database.insert(MyDatabaseHelper.TABLE_INFO, null, values); // if the id in Information is 5, twf display 5 too


Creo que el problema viene de esta línea.

return 0;

Su método addInformation devuelve un valor largo con un valor de 0 cada vez. Si desea que devuelva algún otro número, deberá cambiar esa línea.

Editar: para mantener un registro de su fila, agregue otro parámetro al encabezado de su método

public long addInformation(int rowId, final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut)


Dado que AsyncTask es una tarea asíncrona, el return 0; La línea en su método addInformation siempre es lo primero, por eso obtuvo 0 en lugar de "número de fila insertada" .

Debe actualizar su código como se // MOVE addWorkForce HERE continuación, preste atención a mi comentario // MOVE addWorkForce HERE .

public void addInformation( final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) { class AddInfo extends AsyncTask<String, Void, String> { ProgressDialog loading; @Override protected void onPreExecute() { super.onPreExecute(); loading = ProgressDialog.show(WorkDetailsTable.this, "Please Wait",null, true, true); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); loading.dismiss(); Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show(); addWorkForce(Sub, NoP, NoH, Long.parseLong(s)); // MOVE addWorkForce HERE } @Override protected String doInBackground(String... params) { HashMap<String, String> data = new HashMap<String,String>(); data.put(Config.KEY_USER_NAME,name); data.put(Config.KEY_WEATHER,weather); data.put(Config.KEY_DATE,date2); data.put(Config.KEY_STATUS,status); data.put(Config.KEY_TIMEIN,timeIn); data.put(Config.KEY_TIMEOUT,timeOut); RequestHandler rh=new RequestHandler(); String result = rh.sendPostRequest(Config.ADD_INFORMATION,data); return result; } } AddInfo ru = new AddInfo(); ru.execute(name,weather,date2,status,timeIn,timeOut); }

Entonces, solo necesitas llamar

addInformation(name,weather,date2,status,first1[1],last1[1]);

Por supuesto, asegúrese de que las variables Sub, NoP, NoH sean accesibles dentro de la clase AddInfo .

¡Espero eso ayude!


Puede usar la función mySql lastInsertId () después de la fila insertada en la primera tabla. Eso es (Información) almacenar el valor de lastInsertId () en alguna variable y usar esa variable en ese momento cuando inserte la fila en la siguiente tabla. eso es (WorkForce)


Según su código para agregar información:

a=addInformation(name,weather,date2,status,first1[1],last1[1]);

Aquí, está llamando a addInformation en el hilo principal y retiene el valor de retorno a la variable a. Pero el problema es que su implementación real de agregar información se realiza en doInBackground de AsyncTask que en realidad realiza el trabajo en un subproceso de trabajo (llamada asíncrona), por lo que siempre obtendrá el valor predeterminado para a = 0 (ya que es largo).

Lo que debe hacer es mover su código a la función AsyncTask de AsyncTask como a continuación:

public void addInformation( final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) { class AddInfo extends AsyncTask<String, Void, String> { ProgressDialog loading; @Override protected void onPreExecute() { super.onPreExecute(); loading = ProgressDialog.show(WorkDetailsTable.this, "Please Wait",null, true, true); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); loading.dismiss(); Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show(); addWorkForce(Sub, NoP, NoH,a); } @Override protected String doInBackground(String... params) { HashMap<String, String> data = new HashMap<String,String>(); data.put(Config.KEY_USER_NAME,name); data.put(Config.KEY_WEATHER,weather); data.put(Config.KEY_DATE,date2); data.put(Config.KEY_STATUS,status); data.put(Config.KEY_TIMEIN,timeIn); data.put(Config.KEY_TIMEOUT,timeOut); RequestHandler rh=new RequestHandler(); String result = rh.sendPostRequest(Config.ADD_INFORMATION,data); return result; } } AddInfo ru = new AddInfo(); ru.execute(name,weather,date2,status,timeIn,timeOut); }

Hay otro enfoque para utilizar devoluciones de llamada. Implemente una interfaz y después de completar su AsyncTask, puede enviar una devolución de llamada para hacer otro trabajo.