Android Volley:通过用户指定的 id 从 MySQL 数据库中选择数据

Posted

技术标签:

【中文标题】Android Volley:通过用户指定的 id 从 MySQL 数据库中选择数据【英文标题】:Android Volley: select data from MySQL database by id specified by user 【发布时间】:2017-10-04 13:13:56 【问题描述】:

我正在使用 Volley 编写一个简单的 android 应用程序。我想知道如何通过 ID 从 mysql 数据库中选择名字和姓氏,哪个用户在应用程序中输入了 editText。这是我的 php 脚本:

 <?php
    include 'connection.php';

    global $connect;
    $id = $_POST["id"];

    $query = "SELECT firstName, lastName FROM users WHERE id = '$id'";

    $result = mysqli_query($connect, $query);
    $number_of_rows = mysqli_num_rows($result);

    $response = array();

    if($number_of_rows > 0) 
        while($row = mysqli_fetch_assoc($result)) 
            $response[] = $row;
        
    

    header('Content-Type: application/json');
    echo json_encode(array("users"=>$response));
    mysqli_close($connect);

?>

如果我在代码中指定了 ID,它会返回我要求的 JSON 格式的数据,所以脚本和数据库都可以。我得到 $id=1 的响应是:

"users":["firstName":"Jonash","lastName":"Corvin"]

这是我的 StringRequest 代码:

    StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() 
    @Override
    public void onResponse(String response) 
        try 
            JSONArray jsonArray = new JSONArray(response);
            JSONObject jsonObject = jsonArray.getJSONObject(0);

            String firstName = jsonObject.getString("firstName");
            String lastName = jsonObject.getString("lastName");

            firstNameTV.setText(firstName);
            lastNameTV.setText(lastName);

         catch (JSONException e) 
            e.printStackTrace();
        
    
, new Response.ErrorListener() 
    @Override
    public void onErrorResponse(VolleyError error) 
        Toast.makeText(MainActivity.this, "Something went wrong",Toast.LENGTH_LONG).show();
        error.printStackTrace();
    
) 
    @Override
    protected Map<String, String> getParams() throws AuthFailureError 
        Map<String,String> parameters = new HashMap<String, String>();
        parameters.put("id", idEditText.getText().toString());
        return parameters;
    
    ;
queue.add(stringRequest);

不幸的是,它没有做任何事情......它甚至没有显示任何错误或 toast 消息。你知道怎么解决吗?

【问题讨论】:

请分享您收到的 JSON 响应。 我添加了。变量名有一点点错误(为了更清楚,我匆忙更改了名称),但这不是原因。 您的 JSON 解析错误。 @Corgan 嗯,你能告诉我到底出了什么问题吗?我按照我在其中一个 YT 教程中看到的相同方式完成了它,并且它工作正常。 检查我的答案 【参考方案1】:

在您的 PHP 代码中将 $connect 更改为 $conn,这将解决您的问题

<?php
    include 'connection.php';

    global $connect;
    $id = $_POST["id"];

    $query = "SELECT firstName, lastName FROM users WHERE id = '$id'";

    $result = mysqli_query($conn, $query);  //<--------change
    $number_of_rows = mysqli_num_rows($result);

    $response = array();

    if($number_of_rows > 0) 
        while($row = mysqli_fetch_assoc($result)) 
            $response[] = $row;
        
    

    header('Content-Type: application/json');
    echo json_encode(array("users"=>$response));
    mysqli_close($conn);  //<--------change

?>

【讨论】:

【参考方案2】:
     StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_TRANSACTION_DETAILS,
                    new Response.Listener<String>() 
                        @Override
                        public void onResponse(String response) 
                            progressDialog.dismiss();
                            Log.i(TAG,response.toString());
                            try 
                                JSONObject jsonObject = new JSONObject(response);
                                String success = jsonObject.getString("success");
                                JSONArray jsonArray = jsonObject.getJSONArray("read");

                                if (success.equals("1")) 
                                    Toast.makeText(Activity.this,"Data Fetched!",Toast.LENGTH_SHORT).show();
                                    for (int i = 0; i < jsonArray.length(); i++) 

                                        JSONObject object = jsonArray.getJSONObject(i);

                                    String firstName= object.getString("firstName").trim();
                                    String lastName= object.getString("lastName").trim();
                                    

catch (JSONException e) 
                            e.printStackTrace();
                            Toast.makeText(Activity.this,"Json Login Error " +e.toString(), Toast.LENGTH_SHORT).show();
                        ,
new Response.ErrorListener() 
                    @Override
                    public void onErrorResponse(VolleyError error) 
                        Toast.makeText(Activity.this,"Volley Login Error " +error.toString(), Toast.LENGTH_SHORT).show();

                    
                )

        
            @Override
            protected Map<String, String> getParams() throws AuthFailureError 
                Map<String, String> params = new HashMap<>();
                params.put("id", id);
                return params;
            
        ;

【讨论】:

通常解释你的代码是一个非常好的做法,而不仅仅是粘贴代码作为答案。【参考方案3】:
  <?php
    if ($_SERVER['REQUEST_METHOD']=='POST') 
        $id = $_POST['id'];
        require_once 'connection.php'
        $sql = "SELECT firstName, lastName FROM users WHERE id='$id' ";
        $response = mysqli_query($conn, $sql);
        $result = array();
        $result['read'] = array();
        if( mysqli_num_rows($response) === 1 )       
            if ($row = mysqli_fetch_assoc($response)) 
                 $h['firstName']        = $row['firstName'] ;
                 $h['lastName']       = $row['lastName'] ;
                 array_push($result["read"], $h);
                 $result["success"] = "1";
                 echo json_encode($result);
            
       
     else 
         $result["success"] = "0";
         $result["message"] = "Error!";
         echo json_encode($result);
         mysqli_close($conn);
     
     ?>

【讨论】:

【参考方案4】:

"users":["firstName":"Jonash","lastName":"Corvin"]

根据给定的 JSON,您需要像这样解析 JSON:

JSONObject jsonobject = new JSONObject(response);
JSONArray jsonarray = jsonobject.getJSONArray("users");
JSONObject data = jsonArray.getJSONObject(0);

String firstName = data.getString("firstName");
String lastName = data.getString("lastName");

【讨论】:

以上是关于Android Volley:通过用户指定的 id 从 MySQL 数据库中选择数据的主要内容,如果未能解决你的问题,请参考以下文章

android volley post json ID 并从 PHP 服务器返回结果

Android Volley 如何使用 volley 在 POST 请求中发送用户名和密码以及其他参数

如何通过 Volley Android 发布多个大图像文件

Android 选项卡式活动通过 volley 添加新片段

Android Volley框架的使用

Android Volley 多维 JSON 请求发布方法