php - 使用 Android Developer、PHP 和 MySQL 的 Android 应用程序给出错误:org.json.JSONException: No value for status
问题描述
我是 Android 新手,正在尝试使用 PHP 和 MySQL 通过 Android Developer Studio 开发应用程序。
我的 RegisterActivity 文件如下:
package com.mobiapp.hospmgmt;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Date;
public class RegisterActivity extends AppCompatActivity {
private static final String KEY_STATUS = "status";
private static final String KEY_MESSAGE = "message";
private static final String KEY_FULL_NAME = "full_name";
private static final String KEY_USERNAME = "username";
private static final String KEY_PASSWORD = "password";
private static final String KEY_ADDR1 = "addr1";
private static final String KEY_ADDR2 = "addr2";
private static final String KEY_ADDR3 = "addr3";
private static final String KEY_CITY = "city";
private static final String KEY_PIN = "pin";
private static final String KEY_STATE = "state";
private static final String KEY_COUNTRY = "country";
private static final String KEY_EMAIL = "email";
private static final String KEY_PHONE = "phone";
private static final String KEY_MOBILE = "mobile";
private static final String KEY_USERTYPE = "usertype";
private static final String KEY_EMPTY = "";
private EditText etUsername;
private EditText etPassword;
private EditText etConfirmPassword;
private EditText etFullName;
private EditText etAddr1;
private EditText etAddr2;
private EditText etAddr3;
private EditText etCity;
private EditText etPin;
private EditText etState;
private EditText etCountry;
private EditText etEmail;
private EditText etPhone;
private EditText etMobile;
private EditText etUsertype;
private String username;
private String password;
private String confirmPassword;
private String fullName;
private String addr1;
private String addr2;
private String addr3;
private String city;
private String pin;
private String ustate;
private String country;
private String email;
private String phone;
private String mobile;
private String usertype;
private ProgressDialog pDialog;
private String register_url = "http://192.168.42.252:80/hospmgmt/register.php";
private SessionHandler session;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
session = new SessionHandler(getApplicationContext());
setContentView(R.layout.activity_register);
etUsername = findViewById(R.id.etUsername);
etPassword = findViewById(R.id.etPassword);
etConfirmPassword = findViewById(R.id.etConfirmPassword);
etFullName = findViewById(R.id.etFullName);
etAddr1 = findViewById(R.id.etAddr1);
etAddr2 = findViewById(R.id.etAddr2);
etAddr3 = findViewById(R.id.etAddr3);
etCity = findViewById(R.id.etCity);
etPin = findViewById(R.id.etPin);
etState = findViewById(R.id.etState);
etCountry = findViewById(R.id.etCountry);
etEmail = findViewById(R.id.etEmail);
etPhone = findViewById(R.id.etPhone);
etMobile = findViewById(R.id.etMobile);
etUsertype = findViewById(R.id.etUsertype);
Button login = findViewById(R.id.btnRegisterLogin);
Button register = findViewById(R.id.btnRegister);
//Launch Login screen when Login Button is clicked
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(RegisterActivity.this, MainActivity.class);
startActivity(i);
finish();
}
});
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Retrieve the data entered in the edit texts
username = etUsername.getText().toString().toLowerCase().trim();
password = etPassword.getText().toString().trim();
confirmPassword = etConfirmPassword.getText().toString().trim();
fullName = etFullName.getText().toString().trim();
addr1 = etAddr1.getText().toString().trim();
addr2 = etAddr2.getText().toString().trim();
addr3 = etAddr3.getText().toString().trim();
city = etCity.getText().toString().trim();
ustate = etState.getText().toString().trim();
pin = etPin.getText().toString().trim();
country = etCountry.getText().toString().trim();
email = etEmail.getText().toString().trim();
phone = etPhone.getText().toString().trim();
mobile = etMobile.getText().toString().trim();
usertype = etUsertype.getText().toString().trim();
if (validateInputs()) {
registerUser();
}
}
});
}
/**
* Display Progress bar while registering
*/
private void displayLoader() {
pDialog = new ProgressDialog(RegisterActivity.this);
pDialog.setMessage("Signing Up.. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
/**
* Launch Dashboard Activity on Successful Sign Up
*/
private void loadDashboard() {
Intent i = new Intent(getApplicationContext(), DashboardActivity.class);
startActivity(i);
finish();
}
private void registerUser() {
displayLoader();
JSONObject request = new JSONObject();
try {
//Populate the request parameters
request.put(KEY_USERNAME, username);
request.put(KEY_PASSWORD, password);
request.put(KEY_FULL_NAME, fullName);
request.put(KEY_ADDR1, addr1);
request.put(KEY_ADDR2, addr2);
request.put(KEY_ADDR3, addr3);
request.put(KEY_CITY, city);
request.put(KEY_STATE, ustate);
request.put(KEY_PIN, pin);
request.put(KEY_COUNTRY,country);
request.put(KEY_EMAIL, email);
request.put(KEY_PHONE, phone);
request.put(KEY_MOBILE, mobile);
request.put(KEY_USERTYPE,usertype);
} catch (JSONException e) {
e.printStackTrace();
}
JsonObjectRequest jsArrayRequest = new JsonObjectRequest
(Request.Method.POST, register_url, request, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
pDialog.dismiss();
try {
//Check if user got registered successfully
if (response.getInt(KEY_STATUS) == 0) {
//Set the user session
session.loginUser(username,fullName);
loadDashboard();
}else if(response.getInt(KEY_STATUS) == 1){
//Display error message if username is already existsing
etUsername.setError("Username already taken!");
etUsername.requestFocus();
}else{
Toast.makeText(getApplicationContext(),
response.getString(KEY_MESSAGE), Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
pDialog.dismiss();
//Display error message whenever an error occurs
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
// Access the RequestQueue through your singleton class.
***MySingleton.getInstance(this).addToRequestQueue(jsArrayRequest);***
}
/**
* Validates inputs and shows error if any
* @return
*/
private boolean validateInputs() {
if (KEY_EMPTY.equals(fullName)) {
etFullName.setError("Full Name cannot be empty");
etFullName.requestFocus();
return false;
}
if (KEY_EMPTY.equals(username)) {
etUsername.setError("Username cannot be empty");
etUsername.requestFocus();
return false;
}
if (KEY_EMPTY.equals(password)) {
etPassword.setError("Password cannot be empty");
etPassword.requestFocus();
return false;
}
if (KEY_EMPTY.equals(confirmPassword)) {
etConfirmPassword.setError("Confirm Password cannot be empty");
etConfirmPassword.requestFocus();
return false;
}
if (!password.equals(confirmPassword)) {
etConfirmPassword.setError("Password and Confirm Password does not match");
etConfirmPassword.requestFocus();
return false;
}
return true;
}
}
但是,我的应用程序出现以下错误:
org.json.JSONException:状态没有值
当响应从 Register.php 文件返回时,它不是返回 $response["status"] 作为 0、1 或 2,而是返回我作为请求传递的所有值,即
{"用户名":"b","密码":"c","full_name":"a","addr1":"d","addr2":"e","addr3":"f","城市":"g","州":"h","pin":"369852","国家":"i","email":"j@lm","电话":"159753","移动“:”357951“,”用户类型“:”我“}
我的PHP代码如下:
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL | E_STRICT);
$response = array();
require("db/db_connect.php");
require("userfunctions.php");
//Get the input request parameters
$inputJSON = file_get_contents('php://input');
echo $inputJSON;
$input = json_decode($inputJSON, TRUE); //convert JSON into array
echo $input;
var_dump($inputJSON);
var_dump($input);
//Check for Mandatory parameters
if(isset($input['username']) && isset($input['password']) && isset($input['full_name'])){
$userid = 0;
$username = $input['username'];
$password = $input['password'];
$fullName = $input['full_name'];
$datecreated = date("d/m/Y");
$addr1 = $input['addr1'];
$addr2 = $input['addr2'];
$addr3 = $input['addr3'];
$city = $input['city'];
$pin = $input['pin'];
$state = $input['state'];
$country = $input['country'];
$email = $input['email'];
$phone = $input['phone'];
$mobile = $input['mobile'];
$usertype = $input['usertype'];
//Check if user already exist
if(!userExists($username)){
//Get a unique Salt
$salt = getSalt();
//Generate a unique password Hash
$passwordHash = password_hash(concatPasswordWithSalt($password,$salt),PASSWORD_DEFAULT);
//Query to register new user
$insertQuery = "INSERT INTO user(user_id, user_name, user_fullname, user_passwordhash, user_passwordsalt, user_datecreated, user_addr1, user_addr2, user_addr3, user_city, user_pin, user_state, user_country, user_email, user_phone, user_mobile, user_type) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
if($stmt = $con->prepare($insertQuery)){
$stmt->bind_param("issssssssssssssss", $userid, $username,$fullName,$passwordHash,$salt, $datecreated, $addr1, $addr2, $addr3, $city, $pin, $state, $country, $email, $phone, $mobile, $usertype);
$stmt->execute();
$response["status"] = 0;
$response["message"] = "User created";
error_log("$response set - 1");
$stmt->close();
}
else{
$response["status"] = 9;
$response["message"] = "Error preparing INSERT query for database table USER";
error_log("$response set - 2");
}
}
else{
$response["status"] = 1;
$response["message"] = "User exists";
error_log("$response set - 3");
}
}
else{
$response["status"] = 2;
$response["message"] = "Missing mandatory parameters";
error_log("$response set - 4");
}
error_log(var_dump($response));
echo json_encode($response);
?>
我无法解决问题。请帮助解决问题。
解决方案
因此,您可以像这样更改代码
StringRequest sr = new StringRequest(Request.Method.POST, "url", new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.e("response", response);
try {
JSONObject object = new JSONObject(response);
String status = object.getString("status");
if (status.equals("0"){
//do something
}
} catch (JSONException e) {
progressDialog.dismiss();
Toast.makeText(OtpVerfication.this, "Please check network connection" + e, Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressDialog.dismiss();
VolleyLog.d("Daily_bonus", "Error " + error.getMessage());
if (error instanceof TimeoutError || error instanceof NoConnectionError) {
Toast.makeText(OtpVerfication.this, "Seems your internet connection is slow, please try in sometime. ",
Toast.LENGTH_LONG).show();
} else if (error instanceof AuthFailureError) {
Toast.makeText(OtpVerfication.this, " Authentication error occurred, please try again later",
Toast.LENGTH_LONG).show();
} else if (error instanceof ServerError) {
Toast.makeText(OtpVerfication.this, " Server error occurred, please try again later",
Toast.LENGTH_LONG).show();
} else if (error instanceof NetworkError) {
Toast.makeText(OtpVerfication.this, " Network error occurred, please try again later",
Toast.LENGTH_LONG).show();
} else if (error instanceof ParseError) {
Toast.makeText(OtpVerfication.this, " An error occurred, please try again later",
Toast.LENGTH_LONG).show();
}
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("name", "abc");//passing parameters
return params;
}
};
sr.setRetryPolicy(new DefaultRetryPolicy(20000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(sr);
在您的 php 代码中,您进行这些更改,因为从 android 传递的数据是字符串类型,因此您不需要json_decode
它。
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL | E_STRICT);
$response = array();
require("db/db_connect.php");
require("userfunctions.php");
$input= $_POST;
//Check for Mandatory parameters
if(isset($input['username']) && isset($input['password']) && isset($input['full_name'])){
$userid = 0;
$username = $input['username'];
$password = $input['password'];
$fullName = $input['full_name'];
$datecreated = date("d/m/Y");
$addr1 = $input['addr1'];
$addr2 = $input['addr2'];
$addr3 = $input['addr3'];
$city = $input['city'];
$pin = $input['pin'];
$state = $input['state'];
$country = $input['country'];
$email = $input['email'];
$phone = $input['phone'];
$mobile = $input['mobile'];
$usertype = $input['usertype'];
//Check if user already exist
if(!userExists($username)){
//Get a unique Salt
$salt = getSalt();
//Generate a unique password Hash
$passwordHash = password_hash(concatPasswordWithSalt($password,$salt),PASSWORD_DEFAULT);
//Query to register new user
$insertQuery = "INSERT INTO user(user_id, user_name, user_fullname, user_passwordhash, user_passwordsalt, user_datecreated, user_addr1, user_addr2, user_addr3, user_city, user_pin, user_state, user_country, user_email, user_phone, user_mobile, user_type) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
if($stmt = $con->prepare($insertQuery)){
$stmt->bind_param("issssssssssssssss", $userid, $username,$fullName,$passwordHash,$salt, $datecreated, $addr1, $addr2, $addr3, $city, $pin, $state, $country, $email, $phone, $mobile, $usertype);
$stmt->execute();
$response["status"] = 0;
$response["message"] = "User created";
error_log("$response set - 1");
$stmt->close();
}
else{
$response["status"] = 9;
$response["message"] = "Error preparing INSERT query for database table USER";
//error_log("$response set - 2");
}
}
else{
$response["status"] = 1;
$response["message"] = "User exists";
//error_log("$response set - 3");
}
}
else{
$response["status"] = 2;
$response["message"] = "Missing mandatory parameters";
//error_log("$response set - 4");
}
//error_log(var_dump($response));
echo $response;
?>
推荐阅读
- mysql - Spring Data JPQL 如何使用动态 where 子句创建查询?
- tensorflow - 将学习到的参数转换为 pb 文件
- powershell - 如何阻止我的 youtube-dl 脚本循环播放?
- javascript - 如何将对象的键和值转换为逗号分隔的字符串?
- jquery - 带有历史记录的可链接选项卡 - 后退按钮问题
- driver - Windows 驱动程序:使用命令行工具安装旧版硬件
- php - 如何返回随机键数组?
- javascript - 我们如何在事件 jquery 中绑定事件?
- javascript - 从ajax发送json数组以查看spring mvc的困难
- jupyter-notebook - 在所有 Jupyter 笔记本单元的开头自动插入 %%time?