我们有一个上传工具,通过CSV上传用户。在这个循环中,我们使用MySql检查用户是否以这种方式存在:
SELECT id FROM user_table WHERE email = 'email@domain.com'我们将此查询的结果保存在$sql_array中。
在那之后,我们做一个count($sql_array)。如果计数大于零,我们什么也不做。否则,我们将用户插入到user_table中。
现在,我们已经注意到的奇怪的事情是,在某些情况下,它插入的用户的电子邮件地址已经存在。
我们有一个函数,如果查询结果出错,它会给我们发送一封电子邮件。例如在超时或与MySQL的连接丢失的情况下。我们没有收到任何电子邮件,但仍然有这些重复的结果。有人知道这是怎么回事吗?
发布于 2013-05-29 00:01:19
确保电子邮件地址确实相同,并且在实际字符串之前或之后不包含任何零散的空格。电子邮件地址的大小写也可能不同,但我的第一个猜测是未修剪的字符串。
另一件需要注意的事情是查询的性能。执行select操作,将结果转换为数组,然后对该数组进行计数并不是最优的。更好的SELECT COUNT(*) FROM users_table WHERE email = '…' (在电子邮件上建立索引也有帮助)
发布于 2013-05-29 00:01:32
在以下情况下,您的查询可能无法匹配记录:
重要更新:
如果您的脚本易受sql injection攻击,则一个简单的引号"'“就可能导致查询失败。例如,如果$email具有值
fdassdfsdf'sdfsfd@.com将导致查询
SELECT id FROM user_table WHERE email = 'fdassdfsdf'sdfsfd@.com'这将不会执行,因为它有错误的语法,您将得到0行作为结果,并且您的脚本将认为用户不存在,并将允许注册。
发布于 2013-05-29 00:02:03
根据数据在表中的保存方式,可能存在空格问题,从而导致误报
像这样的事情可能会有所帮助
$query = 'SELECT id FROM user_table WHERE email = "'.trim($emailFromCsv).'"';https://stackoverflow.com/questions/16796462
复制相似问题