WordPress的WPDB和MySQL的奇怪行为

我正在使用$wpdb,以下是调用$wpdb- update的代码的一部分.如果使用普通的email@domain.com,但如果用户要使用其用户名登录,则此代码效果很好.电子邮件something @ domain.com,wpdb不会读取该标志下面的变量来自$_G...

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

如果使用普通的email@domain.com,但如果用户要使用其用户名登录,则此代码效果很好.电子邮件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)“更新状态设置vital_status =’已打开’,open_time = 1461103507,其中invit_email =’东西ADDITION@gmail.com’且rating_invite_token =’2f1e4b16a9a882bbef9b00906fc5c8f563fd70a5’”

我注意到上面的错误部分以粗体突出显示,我的加号()消失了,并且留了一个空格,导致上述语句不更新.

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

更新:我之所以问是因为gmails的某些用户的确使用该符号对电子邮件进行了分类,因为用户名“ anything@gmail.com”仍然返回到“ username@gmail.com”

如果我应该进行任何卫生处理,但我错过了,请也指导我.我认为所有$_GET数据都应该被清除.

解决方法:

不是wpdb或MySQL删除了加号.

在幕后,当您这样调用update时,WordPress会通过mysqli_real_escape_string()传递数据,而没有其他任何传递.

既然您提到数据是来自查询字符串$_GET的,那么很可能在查询之前将其删除了,因为我们已经对其进行了转义并且将其转换为空格.

您可以使用以下方法进行检查:

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

看看结果如何.

为了获得加分,经过所有清理和转义后,应该安全地执行以下操作:

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

本文标题为:WordPress的WPDB和MySQL的奇怪行为

基础教程推荐