今天,我在 Web 服务中创建了一个函数,用于从 mysql 的表中删除用户。 我使用 SLIM 框架来构建我的 RESTful API。
这是我的类(class)用户中的功能:
public function deleteUser($user_id)
{
$stmt = $this->conn->prepare("DELETE
FROM users
WHERE user_id = ?");
if($stmt == FALSE)
{
die($this->conn->error);
}
else
{
$stmt->bind_param("i", $user_id);
$stmt->execute();
$num_affected_rows = $stmt->affected_rows;
$stmt->close();
return $num_affected_rows > 0;
}
}
这是我在index.php中的代码
$app->delete('/users/:user_id', 'authenticate', function() use($app)
{
global $user_id;
$db = new User();
$response = array();
$result = $db->deleteUser($user_id);
if ($result)
{
// user deleted successfully
$response["error"] = false;
$response["message"] = "User deleted succesfully";
}
else
{
// user failed to delete
$response["error"] = true;
$response["message"] = "User failed to delete. Please try again!";
}
echoRespnse(200, $response);
});
问题是我的身份验证函数是从用户表中获取 user_id 以便放入 header 授权中。
function authenticate(\Slim\Route $route)
{
// Getting request headers
$headers = apache_request_headers();
$response = array();
$app = \Slim\Slim::getInstance();
// Verifying Authorization Header
if (isset($headers['Authorization']))
{
$db = new User();
// get the api key
$api_key = $headers['Authorization'];
// validating api key
if (!$db->isValidApiKey($api_key))
{
// api key is not present in users table
$response["error"] = true;
$response["message"] = "Access Denied. Invalid Api key";
echoRespnse(401, $response);
$app->stop();
}
else
{
global $user_id;
// get user primary key id
$user_id = $db->getUserId($api_key);
}
}
else
{
// api key is missing in header
$response["error"] = true;
$response["message"] = "Api key is misssing";
echoRespnse(400, $response);
$app->stop();
}
}
所以每次我尝试删除带有“user_id”的用户时,总是会出错,因为系统删除用户取决于在 header 授权中提交的 API KEY。
我的目标是:删除功能将删除具有用户 ID 的用户。
有谁知道怎么解决吗?
谢谢:)
最佳答案
我对这些代码行很可疑:
else
{
global $user_id;
// get user primary key id
$user_id = $db->getUserId($api_key);
}
对你自己来说最大的问题是,$user_id 作为全局变量的范围是什么?
身份验证函数将在执行deleteUser($user_id)
之前运行,因此无论您如何努力,最终都会删除当前经过身份验证的用户,因为$user_id = $db ->getUserId($api_key)
会将当前经过身份验证的 user_id 存储到全局变量中。
这对您的实现非常不利,因为当前用户会删除自己。那不是一个很酷的人。因此,我建议您使用最简单的解决方法,例如:
- 首先在
global $user_id
旁边声明另一个变量,名为global $executor_id
- 然后,将代码从
$user_id = $db->getUserId($api_key);
更改为$executor_id = $db->getUserId($api_key);
它指定谁将执行删除功能。 然后在index.php中创建delete()函数,如下所示:
$app->delete('/users/:user_id', 'authenticate', function() use($app) { global $user_id; global $executor_id; $db = new User(); $response = array(); $user_id = // please get the user_id that would be deleted here. $result = false; if($user_id != $executor_id) $result = $db->deleteUser($user_id); if ($result) { // user deleted successfully $response["error"] = false; $response["message"] = "User deleted succesfully"; } else { // user failed to delete $response["error"] = true; $response["message"] = "User failed to delete. Please try again!"; } echoRespnse(200, $response); });
抱歉,我对 SLIM 框架不熟悉,但希望它有帮助:)
关于PHP:如何删除用户而不删除 'authenticate'函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26731983/