我有一个用户表,我希望能够在单击链接时删除用户。 $ user_name在会话中设置。这是链接:
<?php echo "<a href='delete_user.php?id=".$user_name."' onclick=\"return confirm('Are you sure?')\">Delete Account</a>" ?>
以下是delete_user.php上的代码:
<?php
session_start();
session_destroy();
require "connection.php";
?>
<?php
if($_GET['id'] != ""){
$user_name = $_GET['id'];
$sql = "DELETE FROM users WHERE user_name='{$user_name}'";
$result = mysqli_query($connection, $sql);
header('Location: register.php');
}
?>
<?php include "footer.php";?>
我不明白为什么在执行此代码时它没有从数据库中删除用户?
答案 0 :(得分:0)
为什么您的代码无效,没有明确的理由。但是,您提到了PHP的新手,因此使用代码获取良好实践可以(1)帮助解决手头的问题,(2)使代码更高效,更容易调试。
我建议你以面向对象的方式使用mysqli
,它需要更少的代码,通常更容易理解。
建立连接很简单:
<?php
$host = 'localhost';
$user = 'USERNAME';
$pass = 'PASS';
$data = 'DATABASE';
$mysqli = new mysqli($host, $user, $pass, $data);
// catch errors for help in troubleshooting
if ($mysqli->errno)
{
echo 'Error: ' . $mysqli->connect_error;
exit;
}
?>
为您的服务器创建安全的环境时请记住以下事项:
记住这三个简单的事情,创建一个删除文件。
<?php
if (isset($_GET['id'])
{
// never trust any user input
$id = urlencode($_GET['id']);
$table = 'users';
// set a LIMIT of 1 record for the query
$sql = "DELETE FROM " . $table . " WHERE user_name = ? LIMIT 1";
// to run your code create a prepared statement
if ($stmt = $mysqli->prepare( $sql ))
{
// create the bind param
$stmt->bind_param('s', $id);
$stmt->execute();
$message = array(
'is_error' => 'success',
'message' => 'Success: ' . $stmt->affected_rows . ' were updated.'
);
$stmt->close();
}
else
{
$message = array(
'is_error' => 'danger',
'message' => 'Error: There was a problem with your query'
);
}
}
else
{
echo 'No user id is set...';
}
代码将帮助您设置查询,并根据用户名删除用户...我不确定这是最佳解决方案,除非user_name
设置为MySQL上的唯一字段数据库中。
答案 1 :(得分:0)
首先,这是一种可怕的方法,你很容易进行SQL注入,并且使用GET字面上只是将查询标记到URL的末尾,这是潜在的黑客或任何用户可以轻易获得的事实。使用POST代替一些jQuery魔法,我还建议使用Ajax,这样你就不会被重定向到php文件,它就会运行。因为不是任何人都可以访问该URL并删除用户所以我建议使用PHP SESSIONS,以便只有您网站的人才能删除用户。另外简单地将id传递给PHP文件是非常不安全的,因为任何人都可以在他们的网站上创建一个指向你的php文件的链接并删除用户。
因此,请尝试此操作来修复您的代码(增加安全性):
请注意:我知道这可能不是最好的方式,也不是最差的方法,但它是一种运行良好的相当安全的方法。
您的主页index.php:
<?php
session_start();
// Create a new random CSRF token.
if (! isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = base64_encode(openssl_random_pseudo_bytes(32));
}
// Check a POST is valid.
if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
// POST data is valid.
}
?>
...
<form id="delete_user_form" action="delete_user.php" method="post">
<input type="hidden" name="user_id" value="<?php echo $user_name; ?>" />
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>" />
<input type="submit" value="Delete User" />
</form>
在.js文件中(确保链接了jQuery):
window.csrf = { csrf_token: $("input[name= csrf_token]").val() };
$.ajaxSetup({
data: window.csrf
});
$("#delete_user_form").submit(function(event) {
event.preventDefault(); //Stops the form from submitting
// CSRF token is now automatically merged in AJAX request data.
$.post('delete_user.php', { user_id: $("input[name=user_id]").val() }, function(data) {
//When it it's complete this is run
console.log(data); //With this you can create a success or error message element
});
});
现在,对于你的delete_user.php文件,这应该可以解决错误:
<?php
session_start();
require "connection.php";
// Checks if csrf_token is valid
if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
if(isset($_POST['user_id']) && $_POST['user_id'] != ""){
$user_name = $_POST['user_id'];
$sql = "DELETE FROM users WHERE user_name = '$user_name' LIMIT 1"; //LIMIT 1 only allows 1 record to be deleted
if ($conn->query($sql) === TRUE) {
echo "Record deleted successfully"; //You get this in your javascript output data variable
} else {
echo "Error deleting record: " . $conn->error; //You get this in your javascript output data variable
}
$conn->close();
}
}
?>
我不知道你的connection.php包含什么,所以这就是我的内容:
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}