Php 单击链接时未删除用户

Php 单击链接时未删除用户,php,mysql,sql,mysqli,Php,Mysql,Sql,Mysqli,我有一个用户表,我希望能够在单击链接时删除用户$在会话中设置用户名。以下是链接: <?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

我有一个用户表,我希望能够在单击链接时删除用户$在会话中设置用户名。以下是链接:

<?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...';
    }
    

    首先,这是一种可怕的方法,你很容易接受SQL注入,而且还可以使用GET直接将查询标记到URL的末尾,这很容易被潜在的黑客或任何用户获得。使用POST代替jQuery,我还建议您使用Ajax,这样您就不会被重定向到php文件,而只需运行它。因为不是任何人都可以访问该URL并删除用户,所以我建议使用PHP会话,这样只有来自您站点的用户才能删除用户。另外,简单地将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>
    
    现在,对于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();
    
        }
    }
    ?>
    

    警告:使用
    mysqli
    时,您应该使用和将用户数据添加到查询中。不要使用字符串插值或串联来完成此操作,因为您已经创建了严重的错误。切勿将
    $\u POST
    $\u GET
    或任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。注意:
    mysqli
    的面向对象界面明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的
    mysql\u查询
    接口混淆。在你对程序性风格投入太多之前,值得换一种。示例:
    $db=newmysqli(…)
    $db->prepare(“…”)
    过程接口是PHP 4时代的产物,当时引入了
    mysqli
    API,不应该在新代码中使用。很多问题都可以被检测到并解决,因此错误不容易被忽略。因此您触发了一些标准注释。阅读它们。但也要考虑一下您在这里做什么。有人知道我们吗ername可以在脚本运行后删除用户。不需要密码。这就是你想要的吗?基本上,你不应该以这种方式使用用户名。我希望这是出于学术目的,因为使用此代码会非常糟糕。你绝对不会检查是否有人被允许删除该用户,所以ally有人可以随时随意删除数据库中的每个用户,直到所有用户都消失了,你才知道。感谢所有的好建议。事实证明,这不是删除,因为它是一个外键。我将设置更改为“ON delete CASCADE”,效果很好。
    <?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();
    
        }
    }
    ?>
    
    $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);
    }