SQLSTATE[23000]: Integrity constraint violation:

Résolu/Fermé
kisscool73 Messages postés 79 Date d'inscription mardi 16 janvier 2018 Statut Membre Dernière intervention 20 février 2023 - 27 avril 2020 à 19:38
kisscool73 Messages postés 79 Date d'inscription mardi 16 janvier 2018 Statut Membre Dernière intervention 20 février 2023 - 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 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
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 79 Date d'inscription mardi 16 janvier 2018 Statut Membre Dernière intervention 20 février 2023
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 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717 > kisscool73 Messages postés 79 Date d'inscription mardi 16 janvier 2018 Statut Membre Dernière intervention 20 février 2023
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