用户不被删除的链接点击

问题描述:

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

我不明白为什么它是执行该代码时不是从数据库中删除用户?

+1

**警告**:当使用'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

+0

注意:'mysqli'的面向对象的接口明显不那么冗长,使得代码更易于阅读和审计,并且不容易与陈旧的'mysql_query'接口混淆。在你过于投入程序风格之前,它是值得转换的。例如:'$ db = new mysqli(...)'和'$ db-> prepare(“...”)过程接口是PHP4时代的一个神器,当引入mysqli API时,不应该在新的代码 – tadman

+0

很多问题都可以通过[在mysqli中启用例外]来检测和解决(https://*.com/questions/14578243/turning-query-errors-to-exceptions-in-mysqli),所以错误不容易被忽略 – tadman

没有明确的原因为什么你的代码无法正常工作。但是,您提到的是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. 开发时,将代码分解为多个步骤,以便您可以轻松排除各个部分的故障。

记住这三个简单的事情,创建一个删除文件。

<?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的唯一字段删除用户数据库。

+0

感谢所有的好建议。原来它并没有被删除,因为它是一个外键。我将设置更改为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); 
}