我正在创建一个android app
,但是我对Registration
/ Login
有疑问。
我找到了这个tutorial,我正在尝试。
问题在于,当我按下Login
或Registration
button
时,会给我一个错误:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.learn2crack.loginregistration.models.ServerResponse.getMessage ( ) 'on a null object reference
。
我认为问题出在Functions.php
文件上,但是我不确定。
我还尝试将以下代码添加到ServerResponse.java
中:
public ServerResponse(String result, String message, User user) {
this.result = result;
this.message = message;
this.user = user;
}
但没有任何改变。
我也读过此answer,但这对我的具体情况不是很有帮助。
有人可以帮我找出问题所在吗?
DBOperations.php
<?php
class DBOperations{
private $host = 'localhost';
private $user = 'provaord';
private $db = 'my_provaord';
private $pass = '';
private $conn;
public function __construct() {
$this ->conn = new PDO("mysql:host=".$this -> host.";dbname=".$this -> db, $this -> user, $this -> pass);
}
public function insertData($name,$email,$password){
$unique_id = uniqid('', true);
$hash = $this->getHash($password);
$encrypted_password = $hash["encrypted"];
$salt = $hash["salt"];
$sql = 'INSERT INTO users SET unique_id =:unique_id,name =:name,
email =:email,encrypted_password =:encrypted_password,salt =:salt,created_at = NOW()';
$query = $this ->conn ->prepare($sql);
$query->execute(array('unique_id' => $unique_id, ':name' => $name, ':email' => $email,
':encrypted_password' => $encrypted_password, ':salt' => $salt));
if ($query) {
return true;
} else {
return false;
}
}
public function checkLogin($email, $password) {
$sql = 'SELECT * FROM users WHERE email = :email';
$query = $this -> conn -> prepare($sql);
$query -> execute(array(':email' => $email));
$data = $query -> fetchObject();
$salt = $data -> salt;
$db_encrypted_password = $data -> encrypted_password;
if ($this -> verifyHash($password.$salt,$db_encrypted_password) ) {
$user["name"] = $data -> name;
$user["email"] = $data -> email;
$user["unique_id"] = $data -> unique_id;
return $user;
} else {
return false;
}
}
public function changePassword($email, $password){
$hash = $this -> getHash($password);
$encrypted_password = $hash["encrypted"];
$salt = $hash["salt"];
$sql = 'UPDATE users SET encrypted_password = :encrypted_password, salt = :salt WHERE email = :email';
$query = $this -> conn -> prepare($sql);
$query -> execute(array(':email' => $email, ':encrypted_password' => $encrypted_password, ':salt' => $salt));
if ($query) {
return true;
} else {
return false;
}
}
public function checkUserExist($email){
$sql = 'SELECT COUNT(*) from users WHERE email =:email';
$query = $this -> conn -> prepare($sql);
$query -> execute(array('email' => $email));
if($query){
$row_count = $query -> fetchColumn();
if ($row_count == 0){
return false;
} else {
return true;
}
} else {
return false;
}
}
public function getHash($password) {
$salt = sha1(rand());
$salt = substr($salt, 0, 10);
$encrypted = password_hash($password.$salt, PASSWORD_DEFAULT);
$hash = array("salt" => $salt, "encrypted" => $encrypted);
return $hash;
}
public function verifyHash($password, $hash) {
return password_verify ($password, $hash);
}
}
Functions.php
<?php
require_once 'DBOperations.php';
class Functions{
private $db;
public function __construct() {
$this -> db = new DBOperations();
}
public function registerUser($name, $email, $password) {
$db = $this -> db;
if (!empty($name) && !empty($email) && !empty($password)) {
if ($db -> checkUserExist($email)) {
$response["result"] = "failure";
$response["message"] = "User Already Registered !";
return json_encode($response);
} else {
$result = $db -> insertData($name, $email, $password);
if ($result) {
$response["result"] = "success";
$response["message"] = "User Registered Successfully !";
return json_encode($response);
} else {
$response["result"] = "failure";
$response["message"] = "Registration Failure";
return json_encode($response);
}
}
} else {
return $this -> getMsgParamNotEmpty();
}
}
public function loginUser($email, $password) {
$db = $this -> db;
if (!empty($email) && !empty($password)) {
if ($db -> checkUserExist($email)) {
$result = $db -> checkLogin($email, $password);
if(!$result) {
$response["result"] = "failure";
$response["message"] = "Invaild Login Credentials";
return json_encode($response);
} else {
$response["result"] = "success";
$response["message"] = "Login Successful";
$response["user"] = $result;
return json_encode($response);
}
} else {
$response["result"] = "failure";
$response["message"] = "Invaild Login Credentials";
return json_encode($response);
}
} else {
return $this -> getMsgParamNotEmpty();
}
}
public function changePassword($email, $old_password, $new_password) {
$db = $this -> db;
if (!empty($email) && !empty($old_password) && !empty($new_password)) {
if(!$db -> checkLogin($email, $old_password)){
$response["result"] = "failure";
$response["message"] = 'Invalid Old Password';
return json_encode($response);
} else {
$result = $db -> changePassword($email, $new_password);
if($result) {
$response["result"] = "success";
$response["message"] = "Password Changed Successfully";
return json_encode($response);
} else {
$response["result"] = "failure";
$response["message"] = 'Error Updating Password';
return json_encode($response);
}
}
} else {
return $this -> getMsgParamNotEmpty();
}
}
public function isEmailValid($email){
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
public function getMsgParamNotEmpty(){
$response["result"] = "failure";
$response["message"] = "Parameters should not be empty !";
return json_encode($response);
}
public function getMsgInvalidParam(){
$response["result"] = "failure";
$response["message"] = "Invalid Parameters";
return json_encode($response);
}
public function getMsgInvalidEmail(){
$response["result"] = "failure";
$response["message"] = "Invalid Email";
return json_encode($response);
}
}
index.php
<?php
require_once 'Functions.php';
$fun = new Functions();
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$data = json_decode(file_get_contents("php://input"));
if(isset($data -> operation)){
$operation = $data -> operation;
if(!empty($operation)){
if($operation == 'register'){
if(isset($data -> user ) && !empty($data -> user) && isset($data -> user -> name)
&& isset($data -> user -> email) && isset($data -> user -> password)){
$user = $data -> user;
$name = $user -> name;
$email = $user -> email;
$password = $user -> password;
if ($fun -> isEmailValid($email)) {
echo $fun -> registerUser($name, $email, $password);
} else {
echo $fun -> getMsgInvalidEmail();
}
} else {
echo $fun -> getMsgInvalidParam();
}
}else if ($operation == 'login') {
if(isset($data -> user ) && !empty($data -> user) && isset($data -> user -> email) && isset($data -> user -> password)){
$user = $data -> user;
$email = $user -> email;
$password = $user -> password;
echo $fun -> loginUser($email, $password);
} else {
echo $fun -> getMsgInvalidParam();
}
} else if ($operation == 'chgPass') {
if(isset($data -> user ) && !empty($data -> user) && isset($data -> user -> email) && isset($data -> user -> old_password)
&& isset($data -> user -> new_password)){
$user = $data -> user;
$email = $user -> email;
$old_password = $user -> old_password;
$new_password = $user -> new_password;
echo $fun -> changePassword($email, $old_password, $new_password);
} else {
echo $fun -> getMsgInvalidParam();
}
}
}else{
echo $fun -> getMsgParamNotEmpty();
}
} else {
echo $fun -> getMsgInvalidParam();
}
} else if ($_SERVER['REQUEST_METHOD'] == 'GET'){
echo "Learn2Crack Login API";
}
ServerResponse.java
public class ServerResponse {
private String result;
private String message;
private User user;
public ServerResponse(String result, String message, User user) {
this.result = result;
this.message = message;
this.user = user;
}
public String getResult() {
return result;
}
public String getMessage() {
return message;
}
public User getUser() {
return user;
}
}
Constants.java
public class Constants {
public static final String BASE_URL = "http://provaord.altervista.org/a/";
public static final String REGISTER_OPERATION = "register";
public static final String LOGIN_OPERATION = "login";
public static final String CHANGE_PASSWORD_OPERATION = "chgPass";
public static final String SUCCESS = "success";
public static final String FAILURE = "failure";
public static final String IS_LOGGED_IN = "isLoggedIn";
public static final String NAME = "name";
public static final String EMAIL = "email";
public static final String UNIQUE_ID = "unique_id";
public static final String TAG = "Learn2Crack";
}
RequestInterface.java
public interface RequestInterface {
@POST("my_provaord")
Call<ServerResponse> operation(@Body ServerRequest request);
}