2012-11-16 58 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