IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Contrainte d'intégrité avec PhpMyadmin


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    avril 2015
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : avril 2015
    Messages : 254
    Points : 0
    Points
    0
    Par défaut Contrainte d'intégrité avec PhpMyadmin
    Bonsoir;
    La liaison entre mes deux tables me créer de problème;
    Quand je fait la requête il m'affiche un problème de contrainte d’intégrité;
    voici les deux tables:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    CREATE TABLE IF NOT EXISTS `personne` (
      `num_personne` bigint(20) NOT NULL AUTO_INCREMENT,
      `photo_personne` text NOT NULL,
      `nom_personne` text NOT NULL,
      `prenom_personne` text NOT NULL,
      `pseudo` varchar(30) NOT NULL,
      `mot_de_passe` text NOT NULL,
      `email_personne` text NOT NULL,
      `logo_entreprise_personne` text NOT NULL,
      `entreprise_personne` text NOT NULL,
      `fonction_personne` text NOT NULL,
      `profession_personne` text NOT NULL,
      `nationalite` text NOT NULL,
      `lieu_naissance` text NOT NULL,
      `date_naissance` date NOT NULL,
      `pays_personne` varchar(50) NOT NULL,
      `ville_personne` varchar(50) NOT NULL,
      `tel_personne` int(10) NOT NULL,
      `date_inscription` datetime NOT NULL,
      `kapital_entreprise` int(11) NOT NULL,
      `adresse_ip` varchar(16) NOT NULL,
      `timestamp` bigint(16) NOT NULL,
      PRIMARY KEY (`num_personne`),
      KEY `pays_personne` (`pays_personne`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=118 ;
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE TABLE IF NOT EXISTS `message_copie1` (
      `num_message_copie1` bigint(20) NOT NULL AUTO_INCREMENT,
      `num_message` bigint(20) NOT NULL,
      `date_message` datetime NOT NULL,
      `object_message` text NOT NULL,
      `contenu_message` text NOT NULL,
      `emeteur_message` bigint(20) NOT NULL,
      `recepteur_message` bigint(20) NOT NULL,
      `num_personne` bigint(20) NOT NULL,
      `est_lu` tinyint(1) NOT NULL,
      PRIMARY KEY (`num_message_copie1`),
      KEY `num_personne` (`num_personne`),
      KEY `emeteur_message` (`num_personne`),
      KEY `recepteur_message` (`num_personne`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=689 ;
    voici la requete:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $req3 = $db->query('SELECT * FROM personne, message_copie1 where personne.num_personne= message_copie1.num_personne AND(((num_personne="'.$_SESSION['num_personne'].'") AND (emeteur_message="'.$_SESSION['recepteur_message'].'"))OR ((num_personne="'.$_SESSION['num_personne'].'") AND (recepteur_message="'.$_SESSION['recepteur_message'].'")))ORDER BY 
       date_message ASC');
    avec cette liaison il me créer le problème mais quand j’enlève la liaison tout devient ok alors que je dois les liées pour afficher la photo.
    merci d'avance

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2003
    Messages
    1 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : avril 2003
    Messages : 1 293
    Points : 1 376
    Points
    1 376
    Par défaut
    Bonjour,

    j'ai quelques questions et remarques :
    - Ce message devrait être dans le forum MySQL, pas Web.
    - Qu'appelez-vous liaison ? (histoire qu'on soit bien d'accord)
    - Vous devriez ajouter une clé étrangère sur num_personne dans message_copie1.
    - Vous devriez enlever les guillemets dans votre requêtes, les champs sont numériques, pas alphanumériques.
    - Pour faire une jointure, on préfère maintenant utiliser JOIN.
    Christophe

    Pensez à mettre quand c'est le cas.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Quel est précisément le message d'erreur ?


    Discussion déplacée dans le forum SQL

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    7 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 7 844
    Points : 27 431
    Points
    27 431
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Christophe P. Voir le message
    Bonjour,

    j'ai quelques questions et remarques :
    - Ce message devrait être dans le forum MySQL, pas Web.
    - Qu'appelez-vous liaison ? (histoire qu'on soit bien d'accord)
    - Vous devriez ajouter une clé étrangère sur num_personne dans message_copie1.
    - Vous devriez enlever les guillemets dans votre requêtes, les champs sont numériques, pas alphanumériques.
    - Pour faire une jointure, on préfère maintenant utiliser JOIN.
    Tout à fait, et aussi, remplacez select * (instable et gourmand) par la liste des colonnes utiles , à minima avec select * vous transportez 2 fois les colonnes de jointures, et probablement plein d'autres colonnes dont vous n'avez que faire.

    De plus, êtes vous certains d'avoir plus de 4 milliards d'individus dans votre database ? si la réponse est non, vous pouvez remplacer vos bigint par de l'intéger simple, moins couteux

    Enfin qui dit demande de diagnostic, dit nécessité de communiquer le SGBD, sa version, et le message d'erreur complet

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    avril 2015
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : avril 2015
    Messages : 254
    Points : 0
    Points
    0
    Par défaut
    Bonjour
    Quel est précisément le message d'erreur ?
    Quand j’enlève ça: Where personne.num_personne=message_copie1.num_personne
    ;voici le message erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ( ! ) Warning: PDO::query(): SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'num_personne' in where clause is ambiguous in D:\wamp\www\message_private.php on line 148
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0020	183328	{main}( )	..\message_private.php:0
    2	0.0610	207744	query ( )	..\message_private.php:
     
    ( ! ) Fatal error: Call to a member function fetch() on a non-object in D:\wamp\www\message_private.php on line 179
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0020	183328	{main}( )	..\message_private.php:0
    et si je mets de nouveau personne.num_personne=message_copie1.num_personne

    voici le message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Warning: PDO::query(): SQLSTATE[42000]: Syntax error or access violation: 1305 FUNCTION message_copie1.num_personne does not exist in D:\wamp\www\message_private.php on line 148
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0020	183392	{main}( )	..\message_private.php:0
    2	0.1000	207856	query ( )	..\message_private.php:148
    ( ! ) Fatal error: Call to a member function fetch() on a non-object in D:\wamp\www\message_private.php on line 179
    Call Stack
    #	Time	Memory	Function	Location
    1	0.0020	183392	{main}( )	..\message_private.php:0
    merci pour votre aide!
    De plus, êtes vous certains d'avoir plus de 4 milliards d'individus dans votre database ? si la réponse est non, vous pouvez remplacer vos bigint par de l'intéger simple, moins couteux
    cette table est une copie et est chargé et supprimer fréquemment à opération d'affichage;mais les champ correspondent à un des champs de type bigint et je compte maintenir ces champs à ça car je rêve d'avoir des milliards d'utilisateurs.

  6. #6
    Invité
    Invité(e)
    Par défaut
    "...is ambiguous..."
    Ca signifie qu'il est présent dans plusieurs tables de la requête, et qu'il ne sait pas lequel choisir.
    Il faut donc préciser : "...nom_table.nom_champ..."

    S'il s'agit de cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $req3 = $db->query('SELECT * FROM personne, message_copie1 
    where personne.num_personne= message_copie1.num_personne 
    AND(((num_personne="'.$_SESSION['num_personne'].'") 
    AND (emeteur_message="'.$_SESSION['recepteur_message'].'"))
    OR ((num_personne="'.$_SESSION['num_personne'].'") 
    AND (recepteur_message="'.$_SESSION['recepteur_message'].'")))
    ORDER BY date_message ASC');
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AND(((personne.num_personne=....
    AND (personne.emeteur_message=...
    OR ((personne.num_personne=....
    ...
    3/ CELA DIT, ta requête est MAL construite : on utilise des JOINTURES
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $req3 = $db->query('SELECT * 
    FROM personne AS PER
    INNER JOIN message_copie1 AS MSG
      ON PER.num_personne = MSG.num_personne
    WHERE (((PER.num_personne="'.$_SESSION['num_personne'].'") 
      AND (PER.emeteur_message="'.$_SESSION['recepteur_message'].'"))
      OR ((PER.num_personne="'.$_SESSION['num_personne'].'") 
      AND (MSG.recepteur_message="'.$_SESSION['recepteur_message'].'")))
    ORDER BY MSG.date_message ASC');
    N.B. "PER" et "MSG" sont des ALIAS des noms de table (respectivement) "personne" et "message_copie1"
    (ça permet une écriture/lecture simplifiée)

    4/ re-CELA DIT, ta requête n'est PAS SECURISEE : on utilise une requête préparée.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // 1/ préparation :
    $req3 = $db->prepare('SELECT * 
    FROM personne AS PER
    INNER JOIN message_copie1 AS MSG
      ON PER.num_personne = MSG.num_personne
    WHERE (((PER.num_personne = :num_personne) 
      AND (PER.emeteur_message = :emeteur_message))
      OR ((PER.num_personne = :num_personne2) 
      AND (MSG.recepteur_message = :recepteur_message)))
    ORDER BY MSG.date_message ASC');
    // 2/ execution
    $req3->execute( array(
       ':num_personne' => $_SESSION['num_personne'],
       ':emeteur_message' => $_SESSION['recepteur_message'],
       ':num_personne2' => $_SESSION['num_personne'],
       ':recepteur_message' => $_SESSION['recepteur_message']
    ));

    5/ Remarque :
    Citation Envoyé par sandaff Voir le message
    un des champs de type bigint et je compte maintenir ces champs à ça car je rêve d'avoir des milliards d'utilisateurs.
    • INT : -2.147.483.647 à 2.147.483.647 (0 à 4.294.967.295 en précisant UNSIGNED) Tu as raison : pas suffisant pour enregistrer TOUTE la population mondiale !
    • BIGINT : -> 9.223.372.036.854.775.807 !! Ca laisse de la marge.....
    Dernière modification par Invité ; 08/12/2016 à 16h08.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    avril 2015
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : avril 2015
    Messages : 254
    Points : 0
    Points
    0
    Par défaut
    Merci beaucoup Monsieur jreaux62
    Grace à votre aide et ainsi que les deux autres intervenant j'ai réussit et je prendrai soin de modifier le type en int!!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] problème avec mes contraintes d'intégrité
    Par Morfus dans le forum Symfony
    Réponses: 1
    Dernier message: 28/07/2013, 11h29
  2. Import des données avec contraintes d'intégrités
    Par Marwa_87 dans le forum Import/Export
    Réponses: 2
    Dernier message: 30/04/2012, 17h38
  3. contrainte d'intégrité avec table intermédiaire
    Par Shatter dans le forum Débuter
    Réponses: 2
    Dernier message: 12/03/2011, 20h45
  4. Phpmyadmin et contraintes d'intégrité référentielle ?
    Par Jiraiya42 dans le forum Requêtes
    Réponses: 28
    Dernier message: 22/02/2008, 11h31
  5. [WD 11] Insertion avec contrainte d'intégrité
    Par leroidje dans le forum WinDev
    Réponses: 9
    Dernier message: 11/12/2007, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo