我们有一个上传工具可以通过CSV上传用户。在这个循环中,如果用户以这种方式存在,我们用MySql检查:
SELECT id FROM user_table WHERE email = 'email@domain.com'
我们将此查询的结果保存在$sql_array
。
之后我们做count($sql_array)
。如果该数量高于零,我们什么都不做。否则,我们将用户插入user_table。
现在我们注意到的奇怪之处在于,在某些情况下,它会向用户插入已存在的电子邮件地址。
如果查询导致错误,我们有一个向我们发送电子邮件的函数。例如,在MySQL超时或连接丢失的情况下。我们没有收到任何电子邮件,但仍然有这些重复的结果。有人知道这是怎么回事吗?
答案 0 :(得分:1)
确保电子邮件地址非常相同,并且在实际字符串之前或之后不包含任何杂散空格。电子邮件地址的大写也可能不同,但我的第一个猜测是未修剪的字符串。
另外需要注意的是查询的性能。执行选择,将结果转换为数组然后计算数组不是最佳选择。更好的你SELECT COUNT(*) FROM users_table WHERE email = '…'
(在电子邮件上放一个索引也有帮助)
答案 1 :(得分:1)
如果符合以下情况,您的查询可能无法匹配记录:
您的数据库的排序规则区分大小写email@domain.com不等于Email@domain.com
确保修剪电子邮件并将其存储在数据库中。
重要更新:
如果您的脚本容易受到sql injection的攻击,则简单的引号“'”会导致查询失败。例如,如果$ email有值
fdassdfsdf'sdfsfd@.com
将导致查询
SELECT id FROM user_table WHERE email = 'fdassdfsdf'sdfsfd@.com'
这将不会执行,因为它具有错误的语法,结果会得到0行,并且您的脚本会认为用户不存在并且允许注册。
答案 2 :(得分:0)
根据数据在表格中的保存方式,可能会出现空白问题,导致误报
这样的事可能会有所帮助
$query = 'SELECT id FROM user_table WHERE email = "'.trim($emailFromCsv).'"';