-3

在使用 PHP 和 MySQL 时,我应用了 DELETE 命令,如下所示:

$query="DELETE FROM email_list WHERE email ="."$email";
mysqli_query($dbc,$query);

它没有用。但是当我这样说时:

$query="DELETE FROM email_list WHERE email ='$email'";
mysqli_query($dbc,$query);

这行得通。我想知道为什么串联不起作用。这里 $dbc 是我的数据库, $email 存储我要删除的电子邮件,而 email_list 是我在 $dbc 数据库表中的表。

4

6 回答 6

5

好吧,您的第一个构造会导致这样的查询:

DELETE FROM email_list WHERE email =user@example.com

你的第二个结果是:

DELETE FROM email_list WHERE email ='user@example.com'

那你告诉我!

于 2013-05-28T14:19:46.003 回答
2

您的连接不起作用,因为它缺少单引号。正确的方法是这样做:

$query="DELETE FROM email_list WHERE email = '" . $email . "'";
mysqli_query($dbc,$query);

$email如果包含单引号,这真的很不安全并且会中断。

防止 SQL 注入

由于您已经在使用mysqli,您应该将查询修改为准备好的语句:

/* create a prepared statement */
if ($stmt = $mysqli->prepare("DELETE FROM email_list WHERE email = ?")) {
    /* bind parameters for markers */
    $stmt->bind_param("s", $email);

    /* execute query */
    $stmt->execute();

    /* close statement */
    $stmt->close();
}

在这里阅读更多。

这可以立即保护您的脚本免受SQL 注入的影响,并使您免于引用转义的麻烦。

于 2013-05-28T14:19:23.673 回答
2

您在第一个查询中错过了单引号。所以假设$email包含 value example@example.com,然后 $query评估为:

 DELETE FROM email_list WHERE email =example@example.com

你需要正确地这样写:

$query="DELETE FROM email_list WHERE email ='"."$email'";
$query="DELETE FROM email_list WHERE email ="."'$email'";
于 2013-05-28T14:19:49.830 回答
1
$query = "DELETE FROM email_list WHERE email = '".$email."'";
mysqli_query($dbc,$query);

您必须将字符串放在引号中的查询中,但您不需要引号来连接变量

于 2013-05-28T14:21:50.053 回答
1

$email可能包含一个必须用引号括起来的字符串。您做了一些引号,但就在变量名周围,这没有多大帮助。

错误的:

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

正确的:

$query="DELETE FROM email_list WHERE email ='".$email."'";
于 2013-05-28T14:21:52.313 回答
0

那是对的。这是因为您需要确保正确连接字符串!

$foo = "harry " . "styles";
echo $foo

仅输出harry styles. 使用 MySQL,您需要的命令是... WHERE email = 'email_address';,因此您需要确保正确创建了字符串!

查看有关字符串连接的 PHP 手册页http://php.net/manual/en/language.operators.string.php 。

于 2013-05-28T14:22:02.687 回答