Wordpress WPDB和Mysql的奇怪行为

时间:2016-04-19 22:14:05

标签: php mysql wordpress wpdb

我正在使用$ wpdb,以下是调用$ wpdb-> update的代码的一部分。

如果这段代码是正常的email@domain.com,那么此代码效果很好,但如果用户在其用户名中使用+号,例如email+something@domain.com,wpdb没有读取+号

以下变量来自$ _GET,但我为了便于阅读而加入了值。

$open_email = 'something+ADDITION@gmail.com';
$open_key = '2f1e4b16a9a882bbef9b00906fc5c8f563fd70a5';
$open_time = time();

if (strlen($open_key) == 40) {
    $status_update = $wpdb->update('status', 
            array(
                'invite_status' => 'opened',
                'open_time' => $open_time
                ),
            array(
                'invite_email' => $open_email,
                'invite_token' => $open_key
                ),
            array(
                '%s',
                '%d'
                ),
            array(
                '%s',
                '%s'
                )
                );
}

$ wpdb-> last_query和$ wpdb-> last_error的var dump返回以下内容。

字符串(235)"更新status设置invite_status ='已打开',open_time = 1461103507 WHERE invite_email =&#39 ; ADDITION@gmail.com '和rating_invite_token =' 2f1e4b16a9a882bbef9b00906fc5c8f563fd70a5'"

我注意到上面的部分错误,以粗体突出显示,我的加号(+)已消失,并且它留下了空格,导致上述声明无法更新。

我可能知道我错过了什么吗?

更新:我问,因为一些gmails用户确实使用+号来对他们的电子邮件进行分类,因为username+anything@gmail.com仍然会回到username@gmail.com

如果有任何我应该做的消毒,但我错过了,请指导我。我认为所有$ _GET数据都应该被消毒。

1 个答案:

答案 0 :(得分:3)

不是wpdb或MySQL删除了加号。

在幕后,当您像这样调用更新时,WordPress会通过mysqli_real_escape_string()传递数据,而不是其他任何内容。

由于您提到数据来自查询字符串$_GET,因此很可能在查询之前删除了+,因为我们未转义并且+正在被转换为一个空间。

您可以通过以下方式查看:

$open_email = $_GET['email'];
var_dump($open_email);

并查看结果。

要获得加号,在完成所有清理和取消后,应该安全地执行以下操作:

$open_email = str_replace(' ', '+', $open_email);