在PHP变量电子邮件地址中使用撇号的字符串值,mysql选择

时间:2010-02-08 03:46:47

标签: php mysql email variables escaping

我有一个电子邮件地址mike.o'malley@stack.com存储在一个已发布的变量中,我想在mysql中使用select语句来验证电子邮件地址的存在并从我的表中检索密码。 当它试图执行时,我的查询卡在了对象上。例如“SELECT pwd FROM tbl_users WHERE userName ='$ email'”;

3 个答案:

答案 0 :(得分:1)

您应该使用mysql_real_escape_string来引用该值。 事实上,每次在查询中插入值时都应该使用它,如果你不这样做,你不仅会遇到错误,也会SQL Injection

您应该像这样使用它:

if ( get_magic_quotes_gpc() ) {
    $email = stripslashes($email);
}
$quoted_email = mysql_real_escape_string($email, $db_connection);
$query = "SELECT pwd FROM tbl_users WHERE userName='".$quoted_email."'";

编辑: 如果PHP上有魔术引号,则所有超全球值($ _GET,$ _POST,...中的值)均以addslashes引用,这很糟糕。你应该考虑把它关掉。

答案 1 :(得分:0)

使用mysql_real_escape_string,例如:

$email = mysql_real_escape_string($email);

请注意,无论在未准备好的SQL中使用变量字符串以防止SQL注入漏洞,都应该这样做。

答案 2 :(得分:0)

如何在PHP的mysql_real_escape_string中包装$ email?清理所有用户生成的输入是一个好主意..

http://us.php.net/manual/en/function.mysql-real-escape-string.php

修改

Mike“\”是MySQL转义字符。这是MySQL 5.0's documentation on strings

mysql_real_escape_string正确地将电子邮件地址转义为'mike.o \'malley@stack.com'。这是一个完整的例子:

// Connect
$link = mysql_connect('localhost', 'simeon', 'password')
    OR die(mysql_error());

$db_selected = mysql_select_db('db', $link);

$email = "mike.o'malley@stack.com";
// Query
$query = "SELECT email FROM users WHERE email='".mysql_real_escape_string($email)."'";

$result = mysql_query($query);   

while ($row = mysql_fetch_assoc($result)) {
    echo 'email: '.$row['email']."\n";  // email: mike.o'malley@stack.com
}