SQLSTATE[23000]: Integrity constraint violation: [Résolu]

Signaler
Messages postés
69
Date d'inscription
mardi 16 janvier 2018
Statut
Membre
Dernière intervention
2 mai 2020
-
Messages postés
69
Date d'inscription
mardi 16 janvier 2018
Statut
Membre
Dernière intervention
2 mai 2020
-
Bonjour,

Ça fait plusieurs heures que je m'arrache les cheveux avec cette erreur.
J'ai cherché sur internet, beaucoup ont le même problème, mais ils semblent tous avoir ce problème dû à la conception de leur site.

En gros, dés que je me connecte sur mon site, j'ai ERROR 500 avec un detail :
Type: Exception
Message: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2147483647' for key 'PRIMARY'
File: /home/baggysag/www/ow_core/database.php
Line: 707

Le truc c'est que mon site n'a pas bougé depuis plusieurs années et j'ai cette erreur depuis hier.

J'ai essayé de remplacer le fichier cité par celui d'une ancienne sauvegarde, mais ça ne change pas.
Et je ne peux pas avoir de doublons dans mes key 'PRIMARY', car elles sont toutes UNIQUE.
Et j'ai fais une recherche dans ma base SQL, j'ai aucune entrée "2147483647".

Si quelqu'un aurai une suggestion pour m'aider.



Configuration: Windows / Chrome 80.0.3987.163

1 réponse

Messages postés
28957
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juillet 2020
2 617
Bonjour,

Pour pouvoir te venir en aide il serait utile que tu nous partages le codes correspondant
Fichier : /home/baggysag/www/ow_core/database.php
Ligne : 707 ( affiches nous quelques lignes avant/apres histoire de voir à quoi sert cette ligne de code )
Ca permettra sûrement d'identifier la table concernée.... et la requête qui génère cette erreur.
Sûrement une requête INSERT qui essaye d'insérer une ligne dans la bdd avec un ID déjà existant.


Vu le message d'erreur, je suppose que ton code doit ressembler à ça
 private function execute( $sql, array $params = null )
    {
        if ( $this->isProfilerEnabled )
        {
            $this->profiler->reset();
        }

        /* @var $stmt PDOStatement */
        $stmt = $this->connection->prepare($sql);
        if ( $params !== null )
        {
            foreach ( $params as $key => $value )
            {
                $paramType = PDO::PARAM_STR;
                if ( is_int($value) )
                    $paramType = PDO::PARAM_INT;
                elseif ( is_bool($value) )
                    $paramType = PDO::PARAM_BOOL;

                $stmt->bindValue(is_int($key) ? $key + 1 : $key, $value, $paramType);
            }
        }
        OW::getEventManager()->trigger(new OW_Event("core.sql.exec_query", array("sql" => $sql, "params" => $params)));
        $stmt->execute(); //TODO setup profiler
        $this->affectedRows = $stmt->rowCount();

        if ( $this->isProfilerEnabled )
        {
            $this->queryExecTime = $this->profiler->getTotalTime();
            $this->totalQueryExecTime += $this->queryExecTime;

            $this->queryCount++;
            $this->queryLog[] = array('query' => $sql, 'execTime' => $this->queryExecTime, 'params' => $params);
        }

        return $stmt;
    }

Il serait intéressante de faire un echo de la variable $sql
et également dans le foreach des params, faire un echo de $key et $value




Messages postés
28957
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juillet 2020
2 617 >
Messages postés
69
Date d'inscription
mardi 16 janvier 2018
Statut
Membre
Dernière intervention
2 mai 2020

Commence par modifier la fonction comme ceci
private function execute( $sql, array $params = null )
{
    if ( $this->isProfilerEnabled ) {
       $this->profiler->reset();
    }
    try{
      /* @var $stmt PDOStatement */
      $stmt = $this->connection->prepare($sql);
      if ( $params !== null ){
          foreach ( $params as $key => $value ){
              $paramType = PDO::PARAM_STR;
              if ( is_int($value) ){
                  $paramType = PDO::PARAM_INT;
              }elseif ( is_bool($value) ){
                  $paramType = PDO::PARAM_BOOL
              }

              $stmt->bindValue(is_int($key) ? $key + 1 : $key, $value, $paramType);
          }
      }
      OW::getEventManager()->trigger(new OW_Event("core.sql.exec_query", array("sql" => $sql, "params" => $params)));
      $stmt->execute(); //TODO setup profiler
      $this->affectedRows = $stmt->rowCount();
    } catch(PDOException $e) {
        echo "Erreur : " . $e->getMessage();
        echo "<br> SQL : " . $sql;
        echo "<pre>";
        print_r($params );
        echo "</pre>";
        exit;
    }
    if ( $this->isProfilerEnabled ){
        $this->queryExecTime = $this->profiler->getTotalTime();
        $this->totalQueryExecTime += $this->queryExecTime;
        $this->queryCount++;
        $this->queryLog[] = array('query' => $sql, 'execTime' => $this->queryExecTime, 'params' => $params);
    }

    return $stmt;
}
Messages postés
69
Date d'inscription
mardi 16 janvier 2018
Statut
Membre
Dernière intervention
2 mai 2020
>
Messages postés
28957
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juillet 2020

Le site devient inaccessible si je copie/colle cette modification.
Messages postés
28957
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juillet 2020
2 617 >
Messages postés
69
Date d'inscription
mardi 16 janvier 2018
Statut
Membre
Dernière intervention
2 mai 2020

Bizarre....

Tu es en local sur ton ordi ou sur un serveur ?
Que contient le fichier error.log d'apache ?
Sais tu comment activer le "profiler" ? Visiblement il existe cette option pour voir des logs sur l'exécution des requêtes.
Messages postés
28957
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juillet 2020
2 617 >
Messages postés
28957
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juillet 2020

Edit : En regardant la documentation, on tombe sur ça :

Message: SQLSTATE[23000]

Message: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‘2145871224’ for key “PRIMARY”
Reported to happen when: using “Newsfeed” plugin.
Caused by: duplicate entries in database ( known to happen on sites with lots of data).
Solution: truncate ow_newsfeed_action_set database table.
Link to the solution on Oxwall forum: https://developers.oxwall.com/forum/topic/11519?page=1#post-58164


Il serait peut-être utile d'y jeter un oeil.
Messages postés
69
Date d'inscription
mardi 16 janvier 2018
Statut
Membre
Dernière intervention
2 mai 2020
>
Messages postés
28957
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juillet 2020

Merci infiniment, j'avais pas trouvé ce lien.

Mon problème est résolu maintenant, grâce à vous.
Je vous remercie énormément.