【问题标题】:String value with an apostrophe in a PHP variable email address, mysql selectPHP变量电子邮件地址中带有撇号的字符串值,mysql选择
【发布时间】:2010-02-08 03:46:47
【问题描述】:

我有一个电子邮件地址 mike.o'malley@stack.com 存储在一个张贴的变量中,我想要一个 mysql 中的 select 语句来验证电子邮件地址的存在并从我的表中检索密码。 我的查询在尝试执行时卡在撇号处。例如 "SELECT pwd FROM tbl_users WHERE userName = '$email'";

【问题讨论】:

    标签: php mysql email variables escaping


    【解决方案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 引用,这很糟糕。您应该考虑将其关闭。

    【讨论】:

    • 我尝试过并在回显我的查询时得到了这个,但没有结果(自然) SELECT pwd FROM tbl_users WHERE userName = 'mike.o\\'malley@stack.com'
    • 我想你有魔术引号。现在要对其进行编辑。
    • 幸运的是和上面的结果一样:)
    • 是的,你应该这样做,这是一个已弃用的功能,它会让你做任何事情两次。奇怪的是它不起作用。
    • 我现在得到这个 SELECT pwd FROM tbl_users WHERE userName = 'mike.o\'malley@stack.com'。我检查了数据库并正确存储了电子邮件地址。我认为这是撇号......不知何故
    【解决方案2】:

    使用mysql_real_escape_string,例如:

    $email = mysql_real_escape_string($email);
    

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

    【讨论】:

    • 使用它但从 tbl_users WHERE userName = 'mike.o\'malley@stack.com' 获取此 SELECT pwd
    【解决方案3】:

    在 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
    } 
    

    【讨论】:

    • 使用它但从 tbl_users WHERE userName = 'mike.o\'malley@stack.com' 获取此 SELECT pwd
    • Michael,正如 Juan 所指出的,请确保魔术引号已关闭。上面,我用更详细的解释编辑了我的帖子。希望这会有所帮助。
    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2013-12-27
    • 2023-04-07
    • 1970-01-01
    • 2012-02-08
    • 2023-04-02
    相关资源
    最近更新 更多