【问题标题】:PDO Inserts data twice on single queryPDO 在单个查询中插入数据两次
【发布时间】:2015-08-24 10:51:55
【问题描述】:

我对 pdo 语句有一个可怕的问题。 我的类根据 Object 生成一个 SQL Query,然后将查询和参数转发给 Bd 类并执行,但数据两次插入数据库。

数据库中的表

CREATE TABLE IF NOT EXISTS `es_simple_object` (
    `id_object` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `active` tinyint(1) NOT NULL,

    PRIMARY KEY (`id_object`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

生成的查询

INSERT INTO es_simple_object (es_simple_object.id_object, es_simple_object.active) VALUES (NULL, ?)

生成的参数数组

Array
(
    [0] => 1
)

调用数据库函数

static::$db = Db::getInstance();    
static::$db->_execute($sql, $params);

Bd 类(只是用于此工作的函数)

    public static function getInstance()
    {
        if (!isset(self::$instance))
            self::$instance = new Db();

        return self::$instance;
    }

    private function __construct()
    {
        $connection = 'mysql:host='.$this->server.'; port='.$this->port.'; dbname='._DB_NAME_.'; charset='._DB_CHARSET_;

        try 
        {
            $this->link = new PDO($connection, _DB_USER_, _DB_PASSWD_);
            $this->link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } 
        catch (PDOException $ex) 
        {   
            Tools::_catchException($ex);

            exit;
        }

        return $this->link;
    }

    public function _execute($sql, $params = array())
    {
        try
        {           
            $pdoStatement = $this->link->prepare($sql);
            $pdoStatement->execute($params == null ? array(null) : $params);

            $this->rows_affected = $pdoStatement->rowCount();
            $this->rows_returned = $pdoStatement->columnCount();
            $this->last_id = $this->link->lastInsertId();
            $this->result = $pdoStatement;

            return $pdoStatement;
        }
        catch (PDOException $ex) 
        {
            Tools::_catchException($ex, array($sql, $params));

            return false;
        }
    }

我不知道如何解决这个问题

【问题讨论】:

  • 你能不能也展示一下你的Db::getInstance()方法?
  • @marian0 是的,我更新了问题
  • 您是否有可能像在循环中一样两次调用_execute 函数。您可以在 _execute 函数中使用 debug_backtrace 来查看每次调用的时间和位置。
  • @dan08 我检查了这个,但一切看起来都很好,函数被调用了一次。我尝试在 localhost 上运行此函数,结果相同。
  • 我手动写了一个查询,从index.php调用_execute函数,结果还是一样

标签: php mysql pdo


【解决方案1】:

感谢@James Taylor 对.htaccess 文件的建议。问题隐藏在 RewriteRule 和参数QSA 中。

【讨论】:

    【解决方案2】:

    当每个列约束不允许NULL 时,为什么要尝试将NULL 插入id_object 列?

    相反,您不应该将id_object 排除在INSERT 语句之外,让MySQL 在其中添加一个新的自动增量值吗?

    【讨论】:

      【解决方案3】:

      尝试在调用 _execute() 的页面上添加一些日志记录并包含时间戳。查看是否由于某种原因该页面被多次请求。

      如果是这种情况,您应该能够追踪它是否是由于 .htaccess 等中的某些原因造成的。

      如果这对您没有任何帮助,请尝试注释掉

      $this->result = $pdoStatement;
      
              return $pdoStatement;
      

      这样你可以测试看看它是否和你再次调用 $pdoStatement 有关系。

      【讨论】:

        猜你喜欢
        • 2019-10-04
        • 2014-11-26
        • 2014-08-23
        • 2010-11-13
        • 2017-09-09
        相关资源
        最近更新 更多