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