在循环中,查询是否可能提供不同的结果?

时间:2013-05-28 15:56:53

标签: php mysql loops

我们有一个上传工具可以通过CSV上传用户。在这个循环中,如果用户以这种方式存在,我们用MySql检查:

SELECT id FROM user_table WHERE email = 'email@domain.com'

我们将此查询的结果保存在$sql_array

之后我们做count($sql_array)。如果该数量高于零,我们什么都不做。否则,我们将用户插入user_table。

现在我们注意到的奇怪之处在于,在某些情况下,它会向用户插入已存在的电子邮件地址。

如果查询导致错误,我们有一个向我们发送电子邮件的函数。例如,在MySQL超时或连接丢失的情况下。我们没有收到任何电子邮件,但仍然有这些重复的结果。有人知道这是怎么回事吗?

3 个答案:

答案 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).'"';