2014-02-27 140 views
-1

我有一个四列的表格,其中一个保存用户输入的电子邮件地址。我试图使用PHP/SQL从“email”列中删除一封电子邮件,但前提是它与用户在我的“removeemail”表单中输入的内容匹配。如何使用带有变量的WHERE子句删除记录?

这里是我的表码:

<?php 
require_once("connectvars.php"); 

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 

$query = "CREATE TABLE email_list (
    id INT AUTO_INCREMENT, 
    first_name VARCHAR(20), 
    last_name VARCHAR(20), 
    email VARCHAR(60), 
    PRIMARY KEY (id))"; 
... 
?> 

删除电子邮件的形式:

<form method="post" action="removeemail.php"> 
    <label for="email">Email address:</label><br/> 
    <input type="text" id="email" name="email" /><br/> 
    <input type="submit" name="submit" value="Remove" /> 
</form> 

而且我的PHP来删除电子邮件:

<?php 
require_once('connectvars.php'); 

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 
$email = $_POST['email']; 
$query = "DELETE FROM email_list WHERE email = $email"; 

mysqli_query($dbc, $query) or die('Error querying database.'); 

echo 'Customer removed: ' . $email; 

mysqli_close($dbc); 
?> 

我不断收到或每次尝试删除电子邮件时出于某种原因死于错误。 任何帮助将不胜感激!

+0

用同样的方法*任何*数据是在SQL查询中使用 - [*与占位符*。](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)。 (占位符不仅可以防止恶意SQL注入,而且占位符也可以避免这种无用的引用问题,并且可以说查询更加整洁。) – user2864740

+1

啊,SQL注入! HTTP://计算器。com/questions/60174/how-can-i-prevent-sql -injection-in-php –

+0

@ user2864740占位符并不是魔力子弹,如果你不明白你为什么使用它,在那里。 – ollieread

回答

1

电子邮件是字符串,所以你需要使用报价。

$query = "DELETE FROM email_list WHERE email = '$email'"; 

而且你还需要使用real_escape_string()

$email = mysqli_real_escape_string($dbc,$_POST['email']); 

让你完整的脚本应该是这样的:

require_once('connectvars.php'); 

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 

$email = mysqli_real_escape_string($dbc,$_POST['email']); 
$query = "DELETE FROM email_list WHERE email = '$email'"; 

mysqli_query($dbc, $query) or die('Error querying database.'); 

echo 'Customer removed: ' . $email; 

mysqli_close($dbc); 
+0

'real_escape_string()'? :) –

+0

@Mr。史密斯:谢谢:)我纠正:) –

+0

对不起,但迟到了这个“错误”。但是也可以+1 –

-1

添加撇号在你的$电子邮件可变

$query = "DELETE FROM email_list WHERE email = '$email'"; 
+0

如果将撇号添加到查询中,它将返回一个错误,这些错误是单引号。信不信由你,差别很重要。 – ollieread

+0

单引号与键盘上的撇号不同?那么你指什么关键,因为我确定他们是同一个关键? – steinmas

+0

自从我开始使用MySQL并且相信与否以来,我每次都使用单引号,我没有收到任何错误! –

-1

首先,你要过滤用户输入,始终。最重要的是,在将其传递到数据库之前,您需要进行某种验证,您可能需要考虑使用预准备语句。

您收到错误的原因是因为说我传递的电子邮件地址“[email protected]”,您的查询会阅读:当你想它读取

DELETE FROM email_list WHERE email = [email protected]; 

DELETE FROM email_list WHERE email = '[email protected]'; 

在这种情况下,你可以在进入入查询时,只需围绕$email单引号。

$query = "DELETE FROM email_list WHERE email = '$email'"; 
+1

如果你在用户提供的电子邮件中有单引号,那么你可能会遇到一个糟糕的一天!不管你信不信,坏的一天和美好的一天之间的区别很重要! - 试想一下,如果$ email是'[email protected] 'OR''='' – user2864740

+1

我很清楚这一点,我没有详细讨论它的实践,我在上面提到了那些问题,问题是关于查询中存在变量的内容,而不是'我如何清理用户输入?',这是由于这个事实没有意识到价值需要被单引号包围,在这一点上可能会超过他的头。 – ollieread

+0

@ollieread“我在那上面提到了那些”。不,你没有,撇号是单引号相同的关键。 “ – steinmas

1

变化

$email = $_POST['email']; 
$query = "DELETE FROM email_list WHERE email = $email"; 

$email = mysqli_real_escape_string ($dbc, $_POST['email']); 
$query = "DELETE FROM email_list WHERE email = '$email'"; 

字符串应该被封装在单引号查询内,并直接在查询中使用的用户输入使得它容易受到SQL注入

+0

第一个完整答案。 –

+0

回答没有说​​明? –

+0

确实如此,在写评论时,我希望编辑和解释。 –

相关问题