我正在使用$ 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数据都应该被消毒。
答案 0 :(得分:3)
不是wpdb
或MySQL删除了加号。
在幕后,当您像这样调用更新时,WordPress会通过mysqli_real_escape_string()
传递数据,而不是其他任何内容。
由于您提到数据来自查询字符串$_GET
,因此很可能在查询之前删除了+
,因为我们未转义并且+
正在被转换为一个空间。
您可以通过以下方式查看:
$open_email = $_GET['email'];
var_dump($open_email);
并查看结果。
要获得加号,在完成所有清理和取消后,应该安全地执行以下操作:
$open_email = str_replace(' ', '+', $open_email);