2017-10-08 59 views
-1

我有一個用戶表,我希望能夠刪除一個用戶,當一個鏈接被點擊。 $ 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://stackoverflow.com/questions/14578243/turning-query-errors-to-exceptions-in-mysqli),所以錯誤不容易被忽略 – tadman

回答

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. 開發時,將代碼分解爲多個步驟,以便您可以輕鬆排除各個部分的故障。

記住這三個簡單的事情,創建一個刪除文件。

<?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

0

首先,這是一個可怕的方式來做到這一點,你很容易進行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); 
}