WordPress的WPDB和MySQL的奇怪行为
我正在使用$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);