2012-11-16 55 views
1

如此處所示,如果存在與$ member_id相匹配的數字標識,那麼該記錄將被刪除,並且$ res的計算結果爲TRUE。如果表中包含一個'member_id',它是一個字符串,如abc1234,它只會在我將$ member_id作爲一個字符串的時候刪除,方法是將其封入引號'$ member_id'中,這會刪除所有匹配,但是當$ res總是計算爲TRUE時if有一個不匹配的東西被刪除(因爲它應該),但用戶得到一個「$ member_id」。從成員表已被刪除」的消息。我希望是明確的。涉及字符串的查詢結果總是計算爲TRUE

<?php 
$member_id = ""; 
require("connect.php"); 
if (isset($_POST['member_id']))$member_id = fix_string($_POST['member_id']); 

$sql=("DELETE FROM members WHERE member_id = $member_id"); 
$res = mysqli_query($con,$sql); 
**if($res) { 
echo "member with ID of ".$member_id." has been removed from members table"; 
} else { 
    echo "member was not deleted"; 
}** 

function fix_string($string) { 
    if (get_magic_quotes_gpc()) $string = stripslashes($string); 
    return htmlentities ($string); 
} 
?> 
+0

請檢查什麼功能,你使用的回報:http://php.net/mysqli_query而** ** ALWAYS你問別人之前協商的文件。 – zerkms

+0

嘗試先設置'$ member_id =「1或1 = 1」'。然後閱讀SQL注入。並告訴你的朋友也讀一讀。 –

+0

PS:你的'fix_string'函數根本沒有意義 – zerkms

回答

1

你的邏輯是在正確的地方,但不能正確執行。你想看看用戶/成員已被刪除這樣做的:

$res = mysqli_query($con,$sql); 
if($res) { 

然而,mysqli_query()將返回true如果一個DELETE正確執行的語句 - 它沒有,如果它刪除行或無關緊要

你會想要做的是利用。:

$res = mysqli_query($con, $sql); 
if (mysqli_affected_rows($con) == 1) { 
    echo "member with ID of ".$member_id." has been removed from members table"; 
} else { 
    echo "member was not deleted"; 
} 

這將檢查是否有受影響的DELETE聲明單條記錄(假設你的會員ID是唯一的;如果沒有,你可以用>= 1代替)。如果有的話,它被刪除了!

旁註(沒有回答具體的)
你應該放下你fix_string()方法和選擇mysqli的準備的語句將自動淨化輸入你。您可以嘗試爲您現有的代碼如下:

require("connect.php"); 
$member_id = (!empty($_POST['member_id']) ? $_POST['member_id'] : ''); 

// prepare the statement 
$stmt = mysqli_prepare($con, 'DELETE FROM members WHERE member_id = ?'); 

// bind the id 
mysqli_stmt_bind_param($stmt, "s", $member_id); 

// execute the statement 
mysqli_stmt_execute($stmt); 

if (mysqli_affected_rows($con) == 1) { 
    echo "member with ID of ".$member_id." has been removed from members table"; 
} else { 
    echo "member was not deleted"; 
} 
+0

完美!非常感謝! – jimeast

+0

只需要注意一點:如果未設置member_id,那麼根本沒有理由執行查詢 – zerkms