2015-06-09 9 views
6

Ho un problema terribile con le istruzioni pdo. La mia classe genera una query SQL basata sull'oggetto, quindi inoltra la query e i parametri alla classe Bd ed esegue, ma i dati vengono inseriti due volte nel database.PDO Inserisce i dati due volte su una singola query

Tabella nel 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; 

generata interrogazione

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

params generati matrice funzione

Array 
(
    [0] => 1 
) 

chiamata Db

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

Bd Class (solo funzioni utilizzate per questo lavoro)

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

non ho più idee come risolvere questo problema

+0

Puoi anche mostrare il tuo metodo 'Db :: getInstance()'? – marian0

+0

@ marian0 Sì, ho aggiornato la domanda – esik

+0

È possibile che tu stia chiamando la funzione '_execute' due volte come in un ciclo o qualcosa del genere. Puoi usare [debug_backtrace] (http://php.net/manual/en/function.debug-backtrace.php) nella funzione '_execute' per vedere ogni volta che viene chiamato e da dove. – dan08

risposta

1

Grazie a @James Taylor per il suggerimento del file .htaccess. Il problema si nascondeva in RewriteRule e nel parametro QSA.

0

Prova ad aggiungere un po 'di registrazione sulla pagina che richiama _execute() e includono un timestamp. Vedi se per qualche motivo la pagina viene richiesta più di una volta.

Se questo è il caso si dovrebbe essere in grado di rintracciare se sia dovuto a qualcosa in .htaccess ecc

Se che non fa nulla per voi, a commentare la

$this->result = $pdoStatement; 

     return $pdoStatement; 

In questo modo puoi provare per vedere se ha qualcosa a che fare con la tua chiamata $ pdoStatement di nuovo.

3

Perché si sta tentando di inserire un NULL nella colonna id_object, quando NULL non è consentito per i vincoli di colonna?

Invece, non dovresti forse lasciare id_object dall'istruzione INSERT e lasciare che MySQL aggiunga un nuovo valore autoincrementato lì?