2017-04-09 81 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 ..我应该重写它会起作用吗? –