用户未在链接点击时被删除

时间:2017-10-08 00:04:55

标签: php mysql sql mysqli

我有一个用户表,我希望能够在单击链接时删除用户。 $ 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";?>

我不明白为什么在执行此代码时它没有从数据库中删除用户?

2 个答案:

答案 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;
}
?>

为您的服务器创建安全的环境时请记住以下事项:

  1. 不信任用户输入(永远!)
  2. 不要对数据库执行直接查询。
  3. 开发时,将代码分解为多个步骤,以便轻松排除每个部分的故障。
  4. 记住这三个简单的事情,创建一个删除文件。

    <?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);
}