我在运行Apache和Perl的网站上的CentOS服务器上使用MySQL。我看到了这种行为(嘲笑):
mysql> describe product;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(10) | YES | | NULL | |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> insert into product (name) values ('Widget');
Query OK, 1 row affected (0.00 sec)
mysql> insert into product (name) values ('Thing');
Query OK, 1 row affected (0.00 sec)
mysql> select * from product;
+----+--------+
| id | name |
+----+--------+
| 1 | Widget |
| 2 | Widget |
| 3 | Thing |
+----+--------+
3 rows in set (0.00 sec)
我的理论是Perl CGI脚本可以同时执行(可能是由于双击,浏览器刷新等),因此插入执行两次。这种情况相当罕见,但一旦发生就会引发问题。
如果发生这种情况,除了' id'之外的所有列有相同的价值观。除了列' id'允许重复的值。
有没有办法防止这种行为?
答案 0 :(得分:0)
如果您从CentOS存储库安装了Perl,Apache和MySQL,并且没有进行任何根本的配置更改,那么您很可能在平台中发现了错误。你使用mod_perl或PSGI还是绝对是CGI?您是否从CPAN源安装了任何Perl模块,或者是否已通过yum安装了所有内容?
您可能考虑实施的愚蠢解决方案是在脚本中生成某种nonce(一次性使用字符串或数字),为其添加一列,并在该列上为该列添加唯一索引,并将其插入与其余的表单数据。如果您发现重复键错误,请忽略它。这不会解释发生了什么,但它会阻止它发生。