PDO在单个查询中插入两次数据

时间:2015-06-09 14:33:38

标签: php mysql pdo

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

数据库中的表

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, ?)

生成的params数组

Array
(
    [0] => 1
)

调用Db函数

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

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

    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;
        }
    }

我没有更多的想法如何解决这个问题

3 个答案:

答案 0 :(得分:3)

为什么在根据列约束条件不允许NULL时,您是否尝试将id_object插入NULL列?

相反,你是不是应该将id_objectINSERT语句中删除,让MySQL在那里添加一个新的自动增量值?

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

如果是这种情况,您应该能够追踪它是否是由.htaccess等中的某些东西引起的。

如果这对您没有任何帮助,请尝试发表评论

$this->result = $pdoStatement;

        return $pdoStatement;

通过这种方式,您可以测试它是否与您再次调用$ pdoStatement有关。