用户不被删除的链接点击
我有一个用户表,我希望能够删除一个用户,当一个链接被点击。 $ 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";?>
我不明白为什么它是执行该代码时不是从数据库中删除用户?
没有明确的原因为什么你的代码无法正常工作。但是,您提到的是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 ...这我不知道这是最好的解决办法,除非user_name
被设置为在你的MySQL的唯一字段删除用户数据库。
感谢所有的好建议。原来它并没有被删除,因为它是一个外键。我将设置更改为ON DELETE CASCADE,并且工作正常。 – Julian
首先,这是一个可怕的方式来做到这一点,你很容易进行SQL注入,并且使用GET字面上只是将查询标记到网址的末尾,这很容易被潜在的黑客或任何用户获得,作为事实。使用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);
}
**警告**:当使用'mysqli'你应该使用[参数化查询](http://php.net/manual/en/mysqli .quickstart.prepared-statements.php)和['bind_param'](http://php.net/manual/en/mysqli-st mt.bind-param.php)将用户数据添加到您的查询中。 **不要**使用字符串插值或连接来完成此操作,因为您创建了严重的[SQL注入漏洞](http://bobby-tables.com/)。 **不要**将'$ _POST','$ _GET'或**任何**用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。 – tadman
注意:'mysqli'的面向对象的接口明显不那么冗长,使得代码更易于阅读和审计,并且不容易与陈旧的'mysql_query'接口混淆。在你过于投入程序风格之前,它是值得转换的。例如:'$ db = new mysqli(...)'和'$ db-> prepare(“...”)过程接口是PHP4时代的一个神器,当引入mysqli API时,不应该在新的代码 – tadman
很多问题都可以通过[在mysqli中启用例外]来检测和解决(https://*.com/questions/14578243/turning-query-errors-to-exceptions-in-mysqli),所以错误不容易被忽略 – tadman