2017-04-09 36 views
0

我正在登錄/註冊應用程序。 這是我的Java代碼我的MainActivity:服務器錯誤或Android問題?

private void loginUser(){ 
    pd = ProgressDialog.show(LoginActivity.this, "", "Loading..."); 
    StringRequest stringRequest = new StringRequest(Request.Method.POST, LOGIN_URL, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        try { 
         JSONObject jsonResponse = new JSONObject(response); 
         System.out.println("JSON RESPONSE: " + jsonResponse.toString()); 
         boolean success = jsonResponse.getBoolean("success"); 
         if (success) { 
          launchHomeScreen(); 
          pd.dismiss(); 
          Toast.makeText(LoginActivity.this,"Welcome back " + username,Toast.LENGTH_LONG).show(); 
         } 
         else { 
          Toast.makeText(LoginActivity.this,"Wrong Username or Password!",Toast.LENGTH_LONG).show(); 
          pd.dismiss(); 
         } 
        } 
        catch (JSONException e) { 
         e.printStackTrace(); 
         pd.dismiss(); 
         Toast.makeText(LoginActivity.this,response,Toast.LENGTH_LONG).show(); 
        } 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        pd.dismiss(); 
        System.out.println("Error: " + error); 
       } 
      }){ 
     @Override 
     protected Map<String,String> getParams(){ 
      Map<String,String> params = new HashMap<>(); 
      params.put(KEY_USERNAME,username); 
      params.put(KEY_PASSWORD,password); 
      return params; 
     } 

    }; 
    RequestQueue requestQueue = Volley.newRequestQueue(this); 
    requestQueue.add(stringRequest); 
} 
} 

的login.php:

<?php 
$con = mysqli_connect("x", "x", "x", "x"); 

$username = $_POST["username"]; 
$password = $_POST["password"]; 

$statement = mysqli_prepare($con, "SELECT * FROM user WHERE username = ?"); 
mysqli_stmt_bind_param($statement, "s", $username); 
mysqli_stmt_execute($statement); 
mysqli_stmt_store_result($statement); 
mysqli_stmt_bind_result($statement, $colUserID, $colUsername, $colPassword); 

$response = array(); 
$response["success"] = false; 

while(mysqli_stmt_fetch($statement)){ 
    if (password_verify($password, $colPassword)) { 
     $response["success"] = true; 
    } 
} 
header('Content-Type: application/json'); 
echo json_encode($response); 
?> 

MySQL表的樣子:user_ID的,用戶名,密碼時應;移動電話號碼,電子郵件

當我試圖登錄我在Android的logcat中得到這個,所以錯誤是由寫入LOGIN_URL錯誤引起的。

E/Volley: [251] BasicNetwork.performRequest: Unexpected response code 404 for http://myserver.xyz/pubic_html/login.php 
I/System.out: Error: com.android.volley.ServerError 

但還有另一個錯誤。我將正確的logindatas發送到服務器,但是每次我獲得成功時:false。

奇怪的是我使用類似java代碼註冊(只有一個register.php),它的工作原理,所以什麼是錯的?

這是register.php

<?php 
    $connect = mysqli_connect("localhost", "root", "", "user"); 

    $username = $_POST["username"]; 
    $password = $_POST["password"]; 
    $hashedPassword = password_hash($password, PASSWORD_BCRYPT); 
    $mobilenumber = $_POST["mobilenumber"]; 
    $email = $_POST["email"]; 

    registerUser(); 
    $response["success"] = false; 
    function registerUser() { 
     global $connect, $username, $hashedPassword, $mobilenumber, $email; 
     $statement = mysqli_prepare($connect, "INSERT INTO user (username, hashedPassword, mobilenumber, email) VALUES (?, ?, ?, ?)"); 
     mysqli_stmt_bind_param($statement, "siss", $username, $hashedPassword, $mobilenumber, $email); 
     mysqli_stmt_execute($statement); 
     mysqli_stmt_close($statement); 
     $response["success"] = true; 
    } 
    header('Content-Type: application/json'); 
    echo json_encode($response); 
?> 

回答

2

404意味着應用程序無法找到的login.php頁面。確保您的腳本路徑正確。

嘗試從鏈接中刪除「public_html」。那是你的根文件夾。你不需要在你的鏈接中指定。它應該工作,如果你刪除。

編輯

既然你編輯您的文章後,我回答了這個問題,讓我編輯我的回答你的下一個。從您的php文件中的password_very函數來判斷,您正在使用password_hash,並且您的密碼使用password_hash('yourPass', PASSWORD_BCRYPT);加密了嗎?

在這種情況下,我沒有看到您將庫包含在您的PHP腳本中。只需將以下行添加到您的PHP文件,它應該工作。

include('path/to/password_hash.php'); 

問題是,因爲找不到文件,password_verify無法識別。我確信如果您將$ _POST ['username']和$ _POST ['password']更改爲'YourUsername'和'YourPassword'並從瀏覽器運行您的文件,您將看到所有錯誤,這將是其中之一。

希望這會有所幫助!

EDIT 2

既然您有密碼的問題。在你的說法,你插入密碼數據庫使用password_hash函數來散列密碼,然後將其插入到數據庫中,像這樣:

$hashedPassword = ('Yourpassword', PASSWORD_BCRYPT); 

做你的MySQL查詢和$ hashedPassword值添加到數據庫密碼字段。然後找回用戶名和密碼是你一個人在一開始並使用password_verify功能相匹配,像這樣的密碼:

if (password_verify($_POST['password'], $hashedPassword) { 
    // Do your login stuff. 
} 

現在應該登錄。 (可選額外)另外,請嘗試查看PDO來執行您的SQL查詢。它好多了。要使用PDO做到以下幾點:

//Initiate Connection 
     $conn = new PDO('mysql:host='.$db_host.';dbname='.$db_name, $db_user, $db_password); 

$stmt = $conn->prepare("SELECT password FROM user WHERE username = :username"); 

if ($stmt->execute(array(':username' => $_POST['username']))) { 
    if ($result = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     $passwordFromDb = $result['password']; //This is the password you match in password verify. This password should be hashed in the database. if it is hashed it will look something like this - $2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq. 
    } 
} 

我想的問題是,你有「Geige」存儲在數據庫中的密碼,不是散列字符串。所以當password_verify函數嘗試匹配密碼時,它會失敗。你的代碼可能是正確的,但是數據庫中的密碼可能是錯誤的。將密碼插入數據庫時​​,請確保將其散列並插入散列密碼。

我真的希望這有助於。

編輯3寄存器重寫

<?php 
    //Initiate Connection 
    $conn = new PDO('mysql:host='.$db_host.';dbname='.$db_name, $db_user, $db_password); 

    $username = $_POST["username"]; 
    $password = $_POST["password"]; 
    $hashedPassword = password_hash($password, PASSWORD_BCRYPT); 
    $mobilenumber = $_POST["mobilenumber"]; 
    $email = $_POST["email"]; 

    $stmt = $conn->prepare("INSERT INTO user (username, hashedPassword, mobilenumber, email) VALUES (:username, :password, :mobile, :email)"); 

    if ($stmt->execute(array(':username' => $username, ':password' => $hashedPassword, ':mobile' => $mobilenumber, ':email' => $email))) { 
     $response["success"] = true; 
    } else { 
     $response["success"] = false; 
    } 

    header('Content-Type: application/json'); 
    echo json_encode($response); 
?> 
+0

好。你是對的。錯誤404將不會顯示..謝謝男人。但在PHP中還有另一個錯誤,因爲每次我想要登錄時,我都會回到:success:false ...我使用正確的logindatas,但每次都成功:false。 –

+0

我假設您正在使用password_hash腳本進行密碼驗證,從「password_verify」函數進行判斷。如果這是你發佈的整個php腳本,那麼錯誤應該是你沒有包含密碼哈希腳本。您需要將以下行添加到您的php腳本中:include('path/to/password_hash.php');在這樣做之後,如果數據庫中的密碼用password_hash腳本正確加密,它應該返回true參數。也可以嘗試用硬編碼變量替換後期變量,並從瀏覽器運行腳本來查找錯誤。 –

+0

我測試了Wamp ..我應該重寫它會起作用嗎? –