2017-12-02 5 views
-2

내 앱 등록 시스템을 코딩하려고하는데 작동하지 않고 그 이유를 모르겠습니다. 여기Android 등록이 작동하지 않습니다.

index.php를

<?php 
require_once 'Functions.php'; 

$func = 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 -> firstname) && isset($data -> user ->lastname) && isset($data -> user -> birthday) && isset($data -> user -> gender) && isset($data -> user -> email) && isset($data -> user -> username) && isset($data -> user -> password)){ 

        $user = $data -> user; 
        $firstname = $user -> firstname; 
        $lastname = $user -> lastname; 
        $birthday = $user -> birthday; 
        $gender = $user -> gender; 
        $email = $user -> email; 
        $username = $user -> username; 
        $password = $user -> password; 

        if($func -> isEmailValid($email)){ 
         echo $func -> registerUser($firstname, $lastname, $gender, $birthday, $email, $username, $password); 
        }else{ 
         echo $func -> getMsgInvalidEmail(); 
        } 

       }else{ 
        echo $func -> 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 $func -> loginUser($email, $password); 

       }else{ 
        echo $func -> 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 $func -> changePassword($email, $old_password, $new_password); 

        }else{ 
         echo $func -> getMsgInvalidParam(); 
        } 
       } 
      }else{ 
       echo $func -> getMsgParamNotEmpty(); 
      } 
     }else{ 
      echo $func -> getMsgInvalidParam(); 
     } 

}else if($_SERVER["REQUEST_METHOD"] == "GET"){ 
    echo "Raivel Login API"; 
} 

Functions.php :

<?php 

require_once 'DBOperations.php'; 

class Functions{ 

private $db; 

public function _construct(){ 
    $this -> db = new DBOperations(); 
} 

public function registerUser($firstname, $lastname, $gender, $birthday, $email, $username, $password){ 
    $db = $this -> db; 

    if(!empty($firstname) && !empty($lastname) && !empty($gender) && !empty($birthday) && !empty($email) && !empty($username) && !empty($password)){ 

     if($db -> checkUserExist($email)){ 
      $response["result"] = "failure"; 
      $response["message"] = "User already registered!"; 
      return json_encode($response); 
     }else{ 
      $result = $db -> insertData($firstname, $lastname, $gender, $birthday, $email, $username, $password); 

      if($result){ 
       $response["result"] = "success"; 
       $response["message"] = "User registered successfully!"; 
       return json_decode($response); 
      }else{ 
       $response["result"] = "failure"; 
       $response["message"] = "Registration failure!"; 
       return json_decode($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 getMsgInvalidEmail(){ 
    $response["result"] = "failure"; 
    $response["message"] = "Invalid email!"; 
    return json_encode($response); 
} 
} 

DBOperations.php :

내가 PHP에서 API를 작성했습니다

, 그것은 3 개 파일이 포함되어 있습니다
<?php 

class DBOperations{ 

    private $host = '*****'; 
    private $user = '*****'; 
    private $db = '*****'; 
    private $pass = '*****'; 
    private $conn; 


    public function _construct(){ 
     $this -> conn = new PDO("mysql:host=".$this->host.";dbname=".$this -> db, $this -> user, $this -> pass, array('charset' => 'utf8')); 

     $this -> conn -> query("SET CHARACTER SET utf8"); 
    } 

    public function insertData($firstname, $lastname, $gender, $birthday, $email, $username, $password){ 

     $hashedPassword = password_hash($password, PASSWORD_DEFAULT); 

     $sql = 'INSERT INTO users SET firstname=:firstname, lastname=:lastname, gender=:gender, birthday=:birthday, email=:email, password=:hashedPassword, username=:username, joining_date = now()'; 

     $query = $this ->conn->prepare($sql); 
     $query -> execute(array(':firstname' => $firstname, ':lastname' => $lastname, ':gender' => $gender, ':birthday' => $birthday, ':email' => $email, ':username' => $username, ':hashedPassword' => $hashedPassword)); 

     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(); 
     $db_password = $data -> password; 


     if ($hashedPasswordCheck = password_verify($password, $db_password)) { 
      $user["username"] = $data -> username; 
      $user["email"] = $data -> email; 
      return $user; 

     } else { 
      return false; 
     } 
    } 

    public function changePassword($email, $password){ 

     $hashedPassword = password_hash($password, PASSWORD_DEFAULT); 

     $sql = 'UPDATE users SET password = :hashedPassword WHERE email = :email'; 
     $query = $this -> conn -> prepare($sql); 
     $query -> execute(array(':email' => $email, ':hashedPassword' => $hashedPassword)); 

     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; 
     } 
    } 
} 

이제 android f 세틸 :

package de.novee.apps.raivel.register; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.support.design.widget.Snackbar; 
import android.util.Log; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ProgressBar; 

import de.novee.apps.raivel.LandingActivity; 
import de.novee.apps.raivel.R; 
import de.novee.apps.raivel.login.LoginActivity; 
import de.novee.apps.raivel.loginregistration.Constants; 
import de.novee.apps.raivel.loginregistration.RequestInterface; 
import de.novee.apps.raivel.models.ServerRequest; 
import de.novee.apps.raivel.models.ServerResponse; 
import de.novee.apps.raivel.models.User; 
import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Response; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 

public class RegisterSecondActivity extends AppCompatActivity { 

    Intent i; 

    View myView; 

    String firstname; 
    String lastname; 
    String birthday; 
    String gender; 
    String email; 
    String username; 
    String password; 
    String password_repeat; 

    private EditText et_email; 
    private EditText et_username; 
    private EditText et_password; 
    private EditText et_password_repeat; 
    private ProgressBar progress; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_register_second); 

     myView = findViewById(android.R.id.content); 

     i = getIntent(); 
     firstname = i.getExtras().getString("firstname"); 
     lastname = i.getExtras().getString("lastname"); 
     birthday = i.getExtras().getString("birthday"); 
     gender = i.getExtras().getString("gender"); 


     overridePendingTransition(0, 0); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_register_second); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
     getSupportActionBar().setTitle("Registrierung"); 
     toolbar.setTitleTextColor(getResources().getColor(R.color.color_white)); 

     initViews(myView); 

     setupRegisterUser(); 
     setupGoToLoginButton(); 
    } 

    private void initViews(View view){ 
     et_email = (EditText) findViewById(R.id.et_email); 
     et_username = (EditText) findViewById(R.id.et_username); 
     et_password = (EditText) findViewById(R.id.et_password); 
     et_password_repeat = (EditText) findViewById(R.id.et_password_repeat); 

     progress = (ProgressBar)view.findViewById(R.id.progress); 
    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     if(item.getItemId() == android.R.id.home){ 
      startActivity(new Intent(RegisterSecondActivity.this, RegisterFirstActivity.class)); 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    private void setupRegisterUser(){ 
     Button btn_registerUser = (Button) findViewById(R.id.btn_register_final); 
     btn_registerUser.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       email = et_email.getText().toString(); 
       username = et_username.getText().toString(); 
       password = et_password.getText().toString(); 
       password_repeat = et_password_repeat.getText().toString(); 

       if(!firstname.isEmpty() && !lastname.isEmpty() && !birthday.isEmpty() && !gender.isEmpty() && !email.isEmpty() && 
         !username.isEmpty() && !password.isEmpty() && !password_repeat.isEmpty()){ 

        if(password.equals(password_repeat)){ 
         progress.setVisibility(View.VISIBLE); 
         registerProcess(firstname,lastname,birthday,gender,email,username,password); 
        }else{ 
         Snackbar.make(myView, "Passwörter müssen gleich sein!", Snackbar.LENGTH_LONG).show(); 
        } 

       }else{ 
        Snackbar.make(view, "Felder dürfen nicht leer sein!", Snackbar.LENGTH_LONG).show(); 
       } 
      } 
     }); 
    } 

    private void setupGoToLoginButton(){ 
     Button gotoLoginButton = (Button) findViewById(R.id.btn_gotologin); 
     gotoLoginButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       startActivity(new Intent(RegisterSecondActivity.this, LoginActivity.class)); 
      } 
     }); 
    } 

    private void registerProcess(String firstname, String lastname, String birthday, String gender, String email, String username, String password){ 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Constants.BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     RequestInterface requestInterface = retrofit.create(RequestInterface.class); 

     User user = new User(); 
     user.setFirstname(firstname); 
     user.setLastname(lastname); 
     user.setBirthday(birthday); 
     user.setGender(gender); 
     user.setEmail(email); 
     user.setUsername(username); 
     user.setPassword(password); 

     ServerRequest request = new ServerRequest(); 
     request.setOperation(Constants.REGISTER_OPERATION); 
     request.setUser(user); 

     Call<ServerResponse> response = requestInterface.operation(request); 

     response.enqueue(new Callback<ServerResponse>(){ 
      @Override 
      public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { 
       ServerResponse resp = response.body(); 
       Snackbar.make(myView, resp.getMessage(), Snackbar.LENGTH_LONG).show(); 
       progress.setVisibility(View.INVISIBLE); 
      } 

      @Override 
      public void onFailure(Call<ServerResponse> call, Throwable t) { 
       progress.setVisibility(View.INVISIBLE); 
       Log.d(Constants.TAG,t.getLocalizedMessage()); 
       Snackbar.make(myView, t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show(); 
      } 
     }); 

    } 

} 

ServerRequest.java :

package de.novee.apps.raivel.models; 


public class ServerRequest { 

    private String operation; 
    private User user; 

    public void setOperation(String operation) { 
     this.operation = operation; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

} 

ServerResponse.java

package de.novee.apps.raivel.models; 

public class ServerResponse { 

    private String result; 
    private String message; 
    private User user; 

    public String getResult() { 
     return result; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public User getUser() { 
     return user; 
    } 

} 

RequestInterface :

package de.novee.apps.raivel.loginregistration; 


import de.novee.apps.raivel.models.ServerRequest; 
import de.novee.apps.raivel.models.ServerResponse; 

import retrofit2.Call; 
import retrofit2.http.Body; 
import retrofit2.http.POST; 

public interface RequestInterface { 
    @POST("apps/raivel/android_api/") 
    Call<ServerResponse> operation(@Body ServerRequest request); 
} 

User.java :

로그에 '실패'가 표시되고 앱에서 '등록'을 클릭하면 스낵바 메시지 '1 행의 입력 끝'이 표시됩니다.

내 PHP 파일

한 번 더 Constants.java 파일이 '.. www.novee.de/apps/raivel/android_api/'에서 내 사이트에 저장되지만 나는 게시 중요하지 않습니다 생각 그것. 나는 그것이 많은 코드라는 것을 알고 있지만, 일주일이 지난 후에 해결책을 찾고 있으며 아무 것도 찾을 수 없다. 그래서 여러분들이 시간을내어이 오류를 이해하도록 도와 주시기 바랍니다.

이 게시물에 문제가있는 경우 알려주십시오.

답변

1

생성시 암호 해시에서 소금을 제거하십시오.

password_hash을 사용할 때는 염분을 가지고 놀아야하는데, 이는 내부적으로 password_hash으로 처리됩니다.

소금은 무작위로 생성시 비밀번호로 연결되며 (password_hash) 확인시 암호가 포함되어 있지 않으므로 일치하지 않을 수 있습니다 (password_verify).

PHP 5.5는 안전하게 hashingverifying passwords을 모두 안전하게 처리하는 a native password hashing API을 제공합니다.

+0

그러나 문제가 해시 섹션에있는 경우 '입력 1 끝의 입력 1'대신 다른 오류 메시지가 표시되지 않아야합니까? – Reebal

+0

먼저 해시를 수정해야하며 다른 문제가있을 수 있습니다. 알려진 오류가있는 동안 "if-what"에 아무런 의미가 없습니다. – zaph

+0

괜찮아요. 나는 모든 것을 바꿨지만, 여전히 '1 행 1 열의 입력 끝'을 얻었습니다. 위의 편집 된 코드도 마찬가지입니다. – Reebal