user
user

Reputation: 631

null value returned from the connection between android and MYSQL database

I am trying to retrieve specific data from my MySQL database by passing the value of the parameter from Android and then read this value in a PHP script in the query in order to return the data.

When I run the application an error parsing data exception occurs because the returned result value is null?

Why the result is null? Is the error from the PHP script or from my java code ?

please help me

Thanks in advance!

city.php:

  <?php
     mysql_connect("localhost","username","password");
     mysql_select_db("Countries");
     $sql=mysql_query("select  City_Population  from City where Name= "'.$_REQUEST['Name']."'");
     while($row=mysql_fetch_assoc($sql))
     $output[]=$row;
      print(json_encode($output));
      mysql_close();
        ?>

Blockquote

java class:

       public class ConnectActivity extends ListActivity {

           String add="http://10.0.2.2/city.php";
           public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.main);

            new Connect().execute();

         }

  private class Connect extends AsyncTask<Void,Void,String>
   {     
             private  String result = "";
             private  InputStream is=null;
            private  String city_name="London";
           protected String doInBackground(Void... params) {
            try
          {
                  ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                 nameValuePairs.add(new BasicNameValuePair("Name",city_name));
                 HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost(add);
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
               HttpResponse response = httpclient.execute(httppost);
               HttpEntity entity = response.getEntity();
              is = entity.getContent();
                 }
        catch(Exception e)
           {
               Log.e("log_tag", "Error in http connection "+e.toString());
                 }


           //convert response to string
    try{
    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),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("log_tag", "Error converting result "+e.toString());
               }


          return result;
          }
       protected  void onPostExecute(String  result){

        try{
            JSONArray jArray = new JSONArray( result);
            JSONObject json_data=null;
            for(int i=0;i<jArray.length();i++)
            {
                json_data = jArray.getJSONObject(i);
                int  population=json_data.getInt("City_Population");

              TextView City_Name =(TextView)findViewById(R.id.city_name);
                                                                           TextView  City_population=(TextView)findViewById(R.id.city_pop);
                            City_Name.setText(json_data.getString(city_name));
                                                                          City_population.setText(population+"  " );
            }
            }
            catch(JSONException e){
            Log.e("log_tag", "Error parsing data "+e.toString());
            }


                     }
                                                                  }

                                                    }

Upvotes: 4

Views: 1950

Answers (2)

VolkerK
VolkerK

Reputation: 96159

a) Your script is prone to sql injections. You need to encode the $_REQUEST[...] parameter properly before putting it into the sql query string.
b) You need some error handling. Any of the mysql_* functions can fail and your script must handle those error conditions. Since the client expects some json data just return the error message/code as an json encoded array as well.
c) You might want to set the Content-type header to application/json, see RFC 4627 and http://docs.php.net/function.header

<?php
define('DEBUG_DETAILS', true);
function onError($msg, $details) {
    $msg = array(
        'status'=>'error',
        'message'=>$msg
    );
    if ( defined('DEBUG_DETAILS') && DEBUG_DETAILS ) {
        $msg['details'] = $details;
    }
    die(json_encode($msg));
}


$mysql = mysql_connect("localhost","username","password") or OnError('database connection failed', mysql_error());
mysql_select_db("Countries", $mysql) or OnError('database selection failed', mysql_error($mysql));

$query = "
    SELECT
        City_Population
    FROM
        City
    WHERE
        Name='%s'
";
$query = sprintf($query, mysql_real_escape_string($_REQUEST['Name'], $mysql));
$sql=mysql_query($query, $mysql) or OnError('query failed', array('query'=>$query, 'errstr'=>mysql_error($mysql)));

$output = array(
    'count'=>0,
    'records'=>array()
);
while( $row=mysql_fetch_assoc($sql) ) {
    $output['records'][]=$row;
    $output['count']+=1;
}
echo json_encode(array(
    'status'=>'ok',
    'result'=>$output
));

Your android client should receive an object literal like e.g.

{
  status:"ok",
  result: {
    'count': 2,
    'records': [ 10000, 15000]
  }
}

or

{
  status:"error",
  message: "database connection failed",
  setails: "...."
}

Upvotes: 1

Rizvan
Rizvan

Reputation: 2355

     <?php
         $name=$_POST['NAME'];               
         mysql_connect("localhost","username","password");
         mysql_select_db("Countries");
         $sql=mysql_query("select  City_Population as citypop  from City where Name='$name' ");
         while($row=mysql_fetch_assoc($sql))
          $output=$row['citypop'];
        print(json_encode($output));
         mysql_close();
         ?>

You try this sure it will work .

Upvotes: 2

Related Questions