SQLSTATE[23000]: Integrity constraint violation:

Résolu/Fermé
kisscool73 Messages postés 78 Date d'inscription mardi 16 janvier 2018 Statut Membre Dernière intervention 11 avril 2022 - 27 avril 2020 à 19:38
kisscool73 Messages postés 78 Date d'inscription mardi 16 janvier 2018 Statut Membre Dernière intervention 11 avril 2022 - 27 avril 2020 à 21:54
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

jordane45 Messages postés 36608 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 décembre 2022 4 420
27 avril 2020 à 19:45
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




1
kisscool73 Messages postés 78 Date d'inscription mardi 16 janvier 2018 Statut Membre Dernière intervention 11 avril 2022
Modifié le 27 avril 2020 à 21:00
Merci pour cette réponse rapide.

C'est exactement ça mon script à la ligne près lol.

Le problème, c'est que c'est une function qui retourne un résultat, je dois donc retourner les 3 valeur pour ensuite faire un echo sur la page qui doit récupérer cette valeur. Mais je ne sais pas d'où est lancé cette function.

Après vérification, j'ai le problème uniquement avec mon compte Admin, avec les comptes test, j'ai pas l'erreur.
Donc je suppose que il doit y avoir une des 3 key PRIMARY UNIQUE qui n'est pas unique dans ma table USER ?
Et qui dois donc soit avoir le même id, pseudo, ou mail que moi.
(ben non en faite, je viens de vérifier)
0
jordane45 Messages postés 36608 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 décembre 2022 4 420 > kisscool73 Messages postés 78 Date d'inscription mardi 16 janvier 2018 Statut Membre Dernière intervention 11 avril 2022
27 avril 2020 à 21:02
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;
}
0
kisscool73 Messages postés 78 Date d'inscription mardi 16 janvier 2018 Statut Membre Dernière intervention 11 avril 2022 > jordane45 Messages postés 36608 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 décembre 2022
27 avril 2020 à 21:29
Le site devient inaccessible si je copie/colle cette modification.
0
jordane45 Messages postés 36608 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 décembre 2022 4 420 > kisscool73 Messages postés 78 Date d'inscription mardi 16 janvier 2018 Statut Membre Dernière intervention 11 avril 2022
27 avril 2020 à 21:41
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.
0
jordane45 Messages postés 36608 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 décembre 2022 4 420 > jordane45 Messages postés 36608 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 7 décembre 2022
27 avril 2020 à 21:42
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.
0