-2

I am creating a login activity that need connection between Android and PHP MySQL so I used AsyncTask and JSON but the problem is that the system force clause and display in the logCat errors. Can anyone help me to fix this error?

This is line 124 : Log.d("Single person Details", json.toString());.

log cat

02-03 14:24:54.668: E/AndroidRuntime(1588): FATAL EXCEPTION: AsyncTask #3
02-03 14:24:54.668: E/AndroidRuntime(1588): java.lang.RuntimeException: An error occured while executing doInBackground()
02-03 14:24:54.668: E/AndroidRuntime(1588):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
02-03 14:24:54.668: E/AndroidRuntime(1588):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
02-03 14:24:54.668: E/AndroidRuntime(1588):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
02-03 14:24:54.668: E/AndroidRuntime(1588):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
02-03 14:24:54.668: E/AndroidRuntime(1588):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
02-03 14:24:54.668: E/AndroidRuntime(1588):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
02-03 14:24:54.668: E/AndroidRuntime(1588):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
02-03 14:24:54.668: E/AndroidRuntime(1588):     at java.lang.Thread.run(Thread.java:841)
02-03 14:24:54.668: E/AndroidRuntime(1588): Caused by: java.lang.NullPointerException
02-03 14:24:54.668: E/AndroidRuntime(1588):     at pack.coderzheaven.AndroidPHPConnectionDemo$CheckLogin.doInBackground(AndroidPHPConnectionDemo.java:124)
02-03 14:24:54.668: E/AndroidRuntime(1588):     at pack.coderzheaven.AndroidPHPConnectionDemo$CheckLogin.doInBackground(AndroidPHPConnectionDemo.java:1)
02-03 14:24:54.668: E/AndroidRuntime(1588):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
02-03 14:24:54.668: E/AndroidRuntime(1588):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
02-03 14:24:54.668: E/AndroidRuntime(1588):     ... 4 more
02-03 14:24:55.008: E/JSON Parser(1588): Error parsing data org.json.JSONException: Value You of type java.lang.String cannot be converted to JSONObject

JSONParser.java

package pack.coderzheaven;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    // function get json from url
    // by making HTTP POST or GET mehtod
    public JSONObject makeHttpRequest(String url, String method,
            List<NameValuePair> params) {

        // Making HTTP request
        try {

            // check for request method
        /*
            if(method == "POST"){
                // request method is POST
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            }
            */
             if(method == "GET"){
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }           


        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        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();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}

AndroidPHPConnectionDemo.java

package pack.coderzheaven;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

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

public class AndroidPHPConnectionDemo extends Activity {
    Button b;
    EditText et, pass;
    String Username, Password;
    TextView tv;
    HttpPost httppost;
    StringBuffer buffer;
    HttpResponse response;
    HttpClient httpclient;
    List<NameValuePair> nameValuePairs;

    String pid;

    // Progress Dialog
    private ProgressDialog pDialog;

    // JSON parser class
    JSONParser jsonParser = new JSONParser();

    // single person url
    // ******************************************************************

    // the localhost in the genymotion emulator = 10.0.3.2
    // ******************************************************************
    private static final String url_check_login = "http://10.0.3.2/check.php";

    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_PERSON = "person";
    private static final String TAG_PID = "pid";
    private static final String TAG_NAME = "username";
    private static final String TAG_pass = "password";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        b = (Button) findViewById(R.id.Button01);
        et = (EditText) findViewById(R.id.username);
        pass = (EditText) findViewById(R.id.password);
        tv = (TextView) findViewById(R.id.tv);

        b.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // login();

                // Getting complete person details in background thread
                new CheckLogin().execute();

            }
        });
    }

    /**
     * Background Async Task to Get complete person details
     * */
    class CheckLogin extends AsyncTask<String, String, String> {

        JSONArray productObj;

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(AndroidPHPConnectionDemo.this);
            pDialog.setMessage("Loading person details. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        /**
         * Getting person details in background thread
         * */

        @Override
        protected String doInBackground(String... arg0) {

            // updating UI from Background Thread

            // Check for success tag
            int success;
            try {
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("pid", pid));

                // getting person details by making HTTP request
                // Note that person details url will use GET request
                JSONObject json = jsonParser.makeHttpRequest(url_check_login,
                        "GET", params);

                // check your log for json response
                Log.d("Single person Details", json.toString());

                // json success tag
                success = json.getInt(TAG_SUCCESS);
                if (success == 1) {
                    // successfully received person details
                    productObj = json.getJSONArray(TAG_PERSON); // JSON Array

                     JSONObject

                }

                else {
                    // product with pid not found
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }



            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once got all details
            if (productObj != null) {
                try {
                    // get first product object from JSON Array
                    JSONObject person = productObj.getJSONObject(0);

                    et.setText(person.getString(TAG_NAME));
                    pass.setText(person.getString(TAG_pass));

                    Log.e("success in login", "SUCCESS IN LOGIN");

                } catch (Exception e) {

                    e.printStackTrace();
                }

            }

            pDialog.dismiss();
        }
    }


}

check.php

    <?php

    require_once('db_config.php'); 


    // array for JSON response
    $response = array();


    //if(isset($_GET['Username'])and isset($_POST['Password'])){

      if(isset($_GET['pid'])){
    //   $username = $_POST['Username'];
    //   $password = $_POST['Password'];

         $pid = $_GET['pid'];   

    //   $query_search = "select username, password from members where username = '".$username."' AND password = '".$password. "'";

         $query_search = "select from members where pid = '".$pid."'";   

         $query_exec = mysql_query($query_search) or die(mysql_error());

       if (mysql_num_rows($query_exec) > 0) 
       {
            $result = mysql_fetch_array($query_exec);

            $person = array();
            $person['username']=$result[username];
            $person['password']=$result['password'];

       // success
            $response["success"] = 1;

       // user node
            $response["person"] = array();

            array_push($response["person"], $person);

       // echoing JSON response
            echo json_encode($response);

        }
        else
        {
       // no user found
                $response["success"] = 0;
                $response["message"] = "No User found";

       // echo no users JSON
               echo json_encode($response);
        }
    }
    else 
    {
        // required field is missing
        $response["success"] = 0;
        $response["message"] = "Required field(s) is missing";

        // echoing JSON response
        echo json_encode($response);
    }   


?>
Ravi
  • 34,851
  • 21
  • 122
  • 183
user2398286
  • 19
  • 1
  • 8
  • Which one is line 124 in AndroidPHPConnectionDemo.java? – Aleks G Feb 03 '14 at 14:44
  • This is nearly the same (but not the same error, I notice) as your [last question](http://stackoverflow.com/questions/21516693/how-to-connect-android-with-php-and-mysql). A general tip is, where you ask a question that might be (incorrectly) regarded as a duplicate, you add a post script to your question showing how it is different. Also, as per the other question, have you searched for the error message? What debugging have you done? – halfer Feb 03 '14 at 14:45
  • The PHP has a SQL injection vulnerability in it, by the way. Switch to PDO or MySQLi if you can, and use parameterisation. – halfer Feb 03 '14 at 14:52

1 Answers1

1

This:

$person['username']=$result[username];
                            ^-------^--- missing ' quotes

is going to produce a PHP warning due to the use unquoted array keys. If your PHP errors are visible to the world, you'll get

PHP Notice: Use of undefined constant blah blah blahYOUR JSON DATA HERE

as output, which will then cause a JSON parse error in your client app.

If your client is expecting nothing but pure JSON text, then you have to ENSURE that your server-side code can producing NOTHING but pure json. Anything else breaks the whole process.

Marc B
  • 356,200
  • 43
  • 426
  • 500