【问题标题】:mysql inserting records twice in database [duplicate]mysql在数据库中插入记录两次[重复]
【发布时间】:2011-04-10 04:09:18
【问题描述】:

我有如下所示的简单代码。运行一次后,它会将结果插入 MySQL 数据库两次。 它在除 Firefox 之外的所有浏览器(IE、Chrome 和 Safari)中都能正常工作。

我正在使用 symfony php 框架和推进作为 ORM。

$con = Propel::getConnection();
   $sql =  "select * from tmp where user_id =$userid";  
   $stmt = $con->prepare($sql);  
   $stmt->execute(); 
   while($row = $stmt->fetch(PDO::FETCH_ASSOC))
   {
    $insert_sql = "INSERT IGNORE into library(xxx,xxx) VALUES('xyz','xys')";
    $insert_stmt = $con->prepare($insert_sql) ;
    $insert_stmt->execute();
   }

【问题讨论】:

  • 这段代码在你的浏览器中运行?!
  • 是的。除 Firefox 之外的所有浏览器都可以正常插入记录
  • 这不可能在您的浏览器中运行。 PHP 是服务器端的。
  • 只是一个注释。您正在使用您的 symfony php 框架并以完全错误的方式作为 ORM 推进。
  • 有时,当您在 POST 请求(例如表单提交)后调试和刷新网页时,它会再次发送数据。也许这就是麻烦?

标签: php mysql symfony1 cross-browser propel


【解决方案1】:

大多数时候这是不明智的 mod_rewrite 使用的结果,使某些文件充当 404 错误处理程序。
因此,如果找不到某些资源,则会调用并执行这样的文件。

在调用您的页面时检查 HTTP 标头并查看发出了哪些其他请求。

【讨论】:

    【解决方案2】:

    问题更深。我不是php开发人员,但我可以理解问题在于设计。理想情况下,我认为您的客户端正在向您的服务器发出多个请求,并且每个请求都会在检查记录是否已经存在之前在系统中插入一条记录。

    【讨论】:

    • 检查幂等性的一种方法是在导入之前检查该值是否可用。 (在你的 UI 和 Service 之间还有一个抽象层。不要直接从浏览器发起服务调用。)
    • 不管与这个问题有什么关系,POST 通常是保证/假定是幂等的方法。
    猜你喜欢
    • 2020-11-28
    • 2012-03-10
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多