尝试向服务器开机自检时出错,指定了“id”,以便使用 Android Volley 进行 json 响应


Error trying to POST specified "id" to server for json response with Android Volley

我正在将产品 ID 从主活动转移到详细信息活动,然后再转移到评论活动。我正在使用Volley和Android Studio。我有一个从远程数据库填充的列表视图。单击项目时,将使用意向将项目的 id 传递给详细信息活动。在详细信息活动中,当用户单击 FAB 时,该产品 ID 也会使用意向传递给注释活动。当我点击 FAB 时,评论活动会打开,但没有显示任何内容。我是安卓工作室中的日志猫,我收到以下错误:

注释:错误:org.json.JSONException:类型的值

这是用于检索指定产品 ID 的注释的 PHP 代码:

    <?php
include_once("config.php");
$query=mysqli_query($con,"SELECT * FROM comments WHERE pid=".$_GET['pid']);
$array;
while($result=mysqli_fetch_assoc($query)){
$array[]=$result;
}
echo json_encode($array);
?>

详细信息活动

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.commentsfab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Pass the image title and url to DetailsActivity
                Intent intentTwo = new Intent(ProductsDetail.this, Comments.class);
                intentTwo.putExtra("pid", pid);
                intentTwo.putExtra("name", name);
                intentTwo.putExtra("image", img);
                intentTwo.putExtra("rating", rating);
                //Start comments activity
                startActivity(intentTwo);
            }
        });

评论活动

    public class Comments extends AppCompatActivity {
    private ProgressDialog dialog=null ;
    private NetworkImageView cmntImg;
    private TextView cmtjjTxt;
    private RatingBar cmntRB;
    private String TAG="Comments";
    private String tag_json_arry = "json_array_req";
    private String url = "http://192.168.0.5:80/demoapp";
    private String url_file="/comments.php";
    private CommentsAdapter adapter;
    private ListView list;
    ArrayList<CommentsRowData> cmntrowdata;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.comments);
        final String pid = getIntent().getStringExtra("pid");
        final String name = getIntent().getStringExtra("name");
        final String img = getIntent().getStringExtra("image");
        final String rating = getIntent().getStringExtra("rating");
        list=(ListView)findViewById(R.id.commentsList);
        cmntrowdata=new ArrayList<CommentsRowData>();
        dialog= new ProgressDialog(this);
        dialog.setMessage("Loading...");
        dialog.show();
        cmntImg = (NetworkImageView)findViewById(R.id.picComments);
        cmntImg.setImageUrl(img, VolleyController.getInstance().getImageLoader());
        cmtjjTxt = (TextView)findViewById(R.id.titleComments);
        cmtjjTxt.setText(name);
        cmntRB = (RatingBar)findViewById(R.id.ratingBar3);
        cmntRB.setRating(Float.valueOf(rating));
        JsonArrayRequest request = new JsonArrayRequest(url+url_file,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, response.toString()); try {
                            for(int i=0;i<response.length();i++){
                                String pid=response.getJSONObject(i).getString("pid");
                                String cid=response.getJSONObject(i).getString("cid");
                                String username = response.getJSONObject(i).getString("username");
                                String comment = response.getJSONObject(i).getString("comment");
                                cmntrowdata.add(new CommentsRowData(pid,cid,username,comment));
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        adapter=new CommentsAdapter(Comments.this, cmntrowdata);
                        list.setAdapter(adapter);
                        dialog.dismiss();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d(TAG, "Error: " + error.getMessage());
                dialog.dismiss();
            }
            //@Override
            protected Map<String, String> getParams(){
                Map<String,String> params = new HashMap<String,String>();
                params.put("pid",pid);
                return params;
            }
        });
        VolleyController.getInstance().addToRequestQueue(request, tag_json_arry);


    }
    @Override
    protected void onResume() {
        super.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
    }
}

产品在一个表中,注释在单独的表中。这就是为什么我有意地传递"pid"的原因。我正在尝试仅获取与给定"pid"对应的注释的 JSON 响应。注释表如下所示:

  • PID(产品编号)
  • CID(注释 ID)
  • 用户名
  • 评论

编辑如果我在浏览器中输入以下 URL,

http://localhost/demoapp/comments.php?sid=2

我收到以下 JSON 响应。

    [
    {
        "pid": "2",
        "cid": "1",
        "username": "john",
        "comment": "one of my favorites"
    },
    {
        "pid": "2",
        "cid": "2",
        "username": "jane",
        "comment": "this was so yummy"
    }
]

因此,我的Android代码中必须有一些东西导致错误

对于 JSON 解析,u 应该有标头指定要为 json 的内容。正如错误所表明的那样,您只是在 html 中回显 json 数据。当接收到的数据在html文件中时,你会得到这样的。尝试在标头中将内容类型设置为 json

回显之前将header('Content-Type: application/json');放入 PHP 文件中