Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PDO Inserts data twice on single query

Tags:

php

mysql

pdo

I have a terrible problem with pdo statements. My class generate a SQL Query based on the Object, then forward the query and params to Bd Class and execute, but data is inserted twice to database.

Table in database

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;

Generated query

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

Generated params array

Array
(
    [0] => 1
)

call Db function

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

Bd Class (just functions used to this job)

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

I have no more ideas how to solve this problem

like image 619
esik Avatar asked Jun 09 '15 14:06

esik


2 Answers

Why are you attempting to insert a NULL to the id_object column, when NULL is not allowed per the column constraints?

Instead, shouldn't you perhaps leave id_object out of the INSERT statement, and let MySQL add a new autoincremented value there?

like image 99
marcegarba Avatar answered Oct 15 '22 08:10

marcegarba


Thanks to @James Taylor for the suggestion of .htaccess file. The problem was hiding in RewriteRule and parameter QSA.

like image 44
esik Avatar answered Oct 15 '22 08:10

esik