Java 服务器错误还是Android问题?
我正在开发一个登录/注册应用程序。 这是我在MainActivity中的Java代码:Java 服务器错误还是Android问题?,java,php,android,mysql,server,Java,Php,Android,Mysql,Server,我正在开发一个登录/注册应用程序。 这是我在MainActivity中的Java代码: private void loginUser(){ pd = ProgressDialog.show(LoginActivity.this, "", "Loading..."); StringRequest stringRequest = new StringRequest(Request.Method.POST, LOGIN_URL, new Response.Lis
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);
}
}
但还有另一个错误。我将正确的登录数据发送到服务器,但每次返回成功: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);
?>
404表示应用程序找不到login.php页面。确保脚本的路径正确 尝试从链接中删除“public_html”。这是您的根文件夹。您不需要在链接中指定此项。如果你移除它,它应该会工作 编辑 既然你在我回答那个问题后编辑了你的帖子,让我来编辑我的帖子来回答你的下一个问题。从php文件中的密码函数判断,您正在使用密码散列,并且您的密码使用
password\u散列(“yourPass”,password\u BCRYPT)加密代码>
在本例中,我看不到您在PHP脚本中包含了该库。只需在php文件中添加以下行,就可以了
include('path/to/password_hash.php');
问题是,由于找不到该文件,因此无法识别密码\u verify。我相信如果您将$\u POST['username']和$\u POST['password']更改为'YourUsername'和'YourPassword',并从浏览器中运行文件,您将看到所有错误,这将是其中之一
希望这有帮助
编辑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);
?>
404表示应用程序找不到login.php页面。确保脚本的路径正确
尝试从链接中删除“public_html”。这是您的根文件夹。您不需要在链接中指定此项。如果你移除它,它应该会工作
编辑
既然你在我回答那个问题后编辑了你的帖子,让我来编辑我的帖子来回答你的下一个问题。从php文件中的密码函数判断,您正在使用密码散列,并且您的密码使用password\u散列(“yourPass”,password\u BCRYPT)加密代码>
在本例中,我看不到您在PHP脚本中包含了该库。只需在php文件中添加以下行,就可以了
include('path/to/password_hash.php');
问题是,由于找不到该文件,因此无法识别密码\u verify。我相信如果您将$\u POST['username']和$\u POST['password']更改为'YourUsername'和'YourPassword',并从浏览器中运行文件,您将看到所有错误,这将是其中之一
希望这有帮助
编辑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);
?>
好的。你说得对。错误404将不再显示..谢谢伙计。但是php中还有另一个错误,因为每次我想要登录时,我都会返回:success:false…我使用正确的登录数据,但每次success:false。根据“password\u verify”函数判断,我假设您正在使用password\u hash脚本进行密码验证。如果这是您发布的整个php脚本,那么错误应该是您没有包含密码哈希脚本。您需要在php脚本中添加以下行:include('path/to/password_hash.php');执行此操作后,如果数据库中的密码已使用password_散列脚本正确加密,则它应返回true参数。还可以尝试用硬编码的变量替换post变量,并从浏览器中运行脚本以查找错误。我使用Wamp进行了测试。我应该重写什么才能使其正常工作?您忘记在更新中在mysqli的前面添加$con。请告诉我您从哪里获得“密码验证”功能好的,对不起我的错误-我添加了$con=…但是您从哪里获得密码验证功能是什么意思??这是php手册..看到了吗。你说得对。错误404将不再显示..谢谢伙计。但是,这其中还有一个错误