0

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

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

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

之后我们做一个count($sql_array). 如果该计数高于零,我们将不做任何事情。否则,我们将用户插入到 user_table 中。

现在我们注意到的奇怪的事情是,在某些情况下,它会使用已经存在的电子邮件地址插入用户。

如果查询导致错误,我们有一个功能会向我们发送电子邮件。例如,在与 MySQL 发生超时或连接丢失的情况下。我们没有收到任何电子邮件,但仍然有这些重复的结果。有谁知道这怎么可能?

4

3 回答 3

1

确保电子邮件地址确实相同,并且在实际字符串之前或之后不包含任何杂散的空格。电子邮件地址的大小写也可能不同,但我的第一个猜测是未修剪的字符串。

要注意的另一件事是查询的性能。进行选择,将结果转换为数组然后对数组进行计数并不是最佳的。更好的你SELECT COUNT(*) FROM users_table WHERE email = '…'(在电子邮件上放置索引也有帮助)

于 2013-05-28T16:01:18.910 回答
1

如果出现以下情况,您的查询可能无法匹配记录:

  • 您的数据库的排序规则区分大小写 email@domain.com 不等于 Email@domain.com

  • 确保电子邮件被修剪并且它们存储在修剪后的数据库中。

重要更新:

如果您的脚本容易受到sql 注入的攻击,简单的引号 "'" 可能会导致查询失败。例如,如果 $email 具有价值

fdassdfsdf'sdfsfd@.com

将导致查询

SELECT id FROM user_table WHERE email = 'fdassdfsdf'sdfsfd@.com'

这不会执行,因为它有错误的语法,你会得到 0 行结果,你的脚本会认为用户不存在并允许注册。

于 2013-05-28T16:01:32.057 回答
0

根据您的数据在表中的保存方式,可能存在空白问题,使其成为误报

这样的事情可能会有所帮助

$query = 'SELECT id FROM user_table WHERE email = "'.trim($emailFromCsv).'"';
于 2013-05-28T16:02:03.180 回答