У меня есть повторяющаяся проблема в приложении для Android.
В основном я использую PHP и базу данных MYSQL для регистрации и входа пользователей в мое приложение.
Регистрация работает нормально. Я могу подключиться к базе данных и вставить нового пользователя в таблицу без каких-либо проблем.
Проблема, с которой я сталкиваюсь, – это войти в приложение. Когда я вызываю URL-адрес для входа, я получаю следующую ошибку:
BasicNetwork.performRequest: Unexpected response code 500 for URL.
Я попытался использовать другие инструменты для доступа к этому URL-адресу и публикации параметров вручную, чтобы устранить проблему, из-за которой может возникнуть ошибка из моего кода приложения. На самом деле я получил Generic 500 Internal Server Error
. Протестировал URL-адрес регистра с помощью этого инструмента, и он отлично работал.
Мои классы PHP все называют один и тот же сценарий для получения сведений о соединении, поэтому с этим не возникает никаких проблем, поскольку регистрация работает.
Вот мой код ниже:
Класс входа:
<?php require_once 'UserFunctions.php'; $db = new UserFunctions(); $response = array("error" => FALSE); if (isset($_POST['email']) && isset($_POST['password'])) { $email = $_POST['email']; $password = $_POST['password']; $user = $db->getUserByEmailAndPassword($email, $password); $count = $db->getUserCount(); if ($user != false) { $response["error"] = FALSE; $response["uid"] = $user["unique_id"]; $response["user"]["name"] = $user["name"]; $response["user"]["email"] = $user["email"]; echo json_encode($response); } else { $response["error"] = TRUE; $response["error_msg"] = "Login credentials are wrong. Please try again!"; echo json_encode($response); } } else { $response["error"] = TRUE; $response["error_msg"] = "One of the required parameters is missing!"; echo json_encode($response); } ?>
Класс UserFunctions:
<?php class UserFunctions { private $conn; function __construct() { require_once 'include/DbConnect.php'; $db = new DbConnect(); $this->conn = $db->connect(); } function __destruct() { } public function storeUser($name, $email, $password) { $uuid = uniqid('', true); $hash = $this->hashSSHA($password); $password = $hash["encrypted"]; $salt = $hash["salt"]; $stmt = $this->conn->prepare("INSERT INTO users(unique_id, UserName, UserEmail, UserPassword, salt) VALUES(?, ?, ?, ?, ?)"); $stmt->bind_param("sssss", $uuid, $name, $email, $password, $salt); $result = $stmt->execute(); $stmt->close(); if ($result) { $stmt = $this->conn->prepare("SELECT * FROM users WHERE UserEmail = ?"); $stmt->bind_param("s", $email); $stmt->execute(); $user = $stmt->get_result()->fetch_assoc(); $stmt->close(); return $user; } else { return false; } } public function getUserByEmailAndPassword($email, $password) { $stmt = $this->conn->prepare("SELECT * FROM users WHERE UserEmail = ?"); $stmt->bind_param("s", $email); if ($stmt->execute()) { $user = $stmt->get_result()->fetch_assoc(); $stmt->close(); return $user; } else { return NULL; } } public function isUserExisted($email) { $stmt = $this->conn->prepare("SELECT UserEmail FROM users WHERE UserEmail = ?"); $stmt->bind_param("s", $email); $stmt->execute(); $stmt->store_result(); if ($stmt->num_rows > 0) { $stmt->close(); return true; } else { $stmt->close(); return false; } } public function hashSSHA($password) { $salt = sha1(rand()); $salt = substr($salt, 0, 10); $encrypted = base64_encode(sha1($password . $salt, true) . $salt); $hash = array("salt" => $salt, "encrypted" => $encrypted); return $hash; } public function checkhashSSHA($salt, $password) { $hash = base64_encode(sha1($password . $salt, true) . $salt); return $hash; } } ?>
Я нашел, где моя проблема. Для всех тех, кто сталкивается с очень неприятной ошибкой 500, проверьте свои журналы. Для меня, когда я проверил журналы, я обнаружил, что метод checkhashSSHA()
никогда не использовался, и это вызывало следующую ошибку:
PHP Fatal error: Call to undefined function checkHashSSA() in /xxx/xxx/xxx/xxx/UserFunctions.php on line 54
Поэтому для дешифрования пароля я добавил следующий код:
public function getUserByEmailAndPassword($email, $password) { $stmt = $this->conn->prepare("SELECT * FROM users WHERE UserEmail = ?"); $stmt->bind_param("s", $email); if ($stmt->execute()) { $user = $stmt->get_result()->fetch_assoc(); $salt = $user['salt']; $userPassword = $user['UserPassword']; $hash = $this->checkhashSSHA($salt, $password); if ($userPassword == $hash) { return $user; } $stmt->close(); } else { return NULL; } }
Это решило мою ошибку.
Только для записи журналы для таких ошибок обычно находятся в следующем расположении: var/log/apache2/error.log
Возможно, вам потребуется внести некоторые изменения в файл php.ini для регистрации этих ошибок.
Надеюсь, это поможет любому, у кого ошибка 500;)