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

PHP & Base de données Discussion :

le traitement de ma requète crée des doublons [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut le traitement de ma requète crée des doublons
    Bonjour et meilleurs vœux à toutes et à tous,
    je suis embêté, je suis néophyte et souhaite, à l'aide d'une base/table MySQL alimenter une page html.
    voici la partie de mon code php (pour lequel j'ai récupéré les infos ici et là), auquel j'ai retiré les valeurs des variables : $serveur, $nom_base et $pwd, qui concerne mon problème.
    Code : 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    		<?php
    			$charset = "utf8";	// Le charset "utf8"
     
    			$Table = array();		// Cr&eacute;ation et initialisation de variable : La table entière
    			$LignPHP = array();	// Cr&eacute;ation et initialisation de variable : 1 ligne de la table
    			global $TablPHP;		// Cr&eacute;ation de variable globale pour la port&eacute;e soit pour la page entière et non seulement pour la fonction locale
    			$TablPHP = array();	// Cr&eacute;ation et initialisation de variable : La table entière
    			//--------------------------------------------------------------------------------------------------------------------------------------------------------------------
    			//             MA REQUETE dans la base 'adc' table 'occupations'
    			//--------------------------------------------------------------------------------------------------------------------------------------------------------------------
     
    			// connexion &agrave; MySQL en utilisant PDO
    			try //  PHP essaie d'exécuter les instructions à l'intérieur du bloc try. S'il y a une erreur, il rentre dans le bloc catch et fait ce qu'on lui demande (ici, on arrête l'exécution de la page en affichant un message décrivant l'erreur).
    			{
    				$bdd = new PDO('mysql:host='.$serveur.';dbname='.$nom_base.';charset='.$charset, $login, $pwd);
    			}
    			catch (Exception $e) // S'il y a une erreur, il rentre dans le bloc catch et fait ce qu'on lui demande (ici, on arrête l'exécution de la page en affichant un message décrivant l'erreur).
    			{
    					die('Erreur : ' . $e->getMessage());    // En cas d'erreur, on affiche un message et on arrête tout
    			}
    			// Si tout va bien, on peut continuer
     
    			$Table = $bdd->query('SELECT * FROM occupations');// On récupère tout le contenu de la table occupations
     
     
    			// les deux boucles imbriquées 'foreach', ci-dessous, servent à créer un tableau PHP '$TablPHP' contenant la table 'occupations'
    			// Le premier foreach() lit chaque ligne du tableau
    			foreach($Table as $LignTab) 			// la boucle foreach : &Agrave; chaque tour de boucle, la valeur de l'&eacute;l&eacute;ment suivant, du tableau $Table, est mise dans la variable $LignTab (qui est elle même un tableau.
    			{
    				// Le deuxième foreach() lit chaque tableau de chaque ligne. On accède à ses propriétés et à ses valeurs avec les variables $cle et $valeur.
    				//foreach($LignTab as $cle=>$valeur) 		// la boucle foreach : &Agrave; chaque tour de boucle, la valeur de l'&eacute;l&eacute;ment suivant, du tableau $LignTab, est mise dans la variable $element.
    				foreach($LignTab as $valeur) 		// la boucle foreach : &Agrave; chaque tour de boucle, la valeur de l'&eacute;l&eacute;ment suivant, du tableau $LignTab, est mise dans la variable $element.
    				{
    					array_push($LignPHP,$valeur);	// Je rentre la valeur contenue dans '$valeur' dans '$LignPHP' 
    				}
    				array_push($TablPHP,$LignPHP); 		// Je rentre la valeur contenue dans '$LignPHP' dans '$TablPHP'
    				$LignPHP = array();					// pour vider mon tableau de ligne je le redéfinis
    			}
     
    			$Table->closeCursor(); 					// Termine le traitement de la requête
    		?>
    mon problème est que mon tableau $TablPHP contenant, je crois, l'intégralité de ma table 'occupations' est entièrement doublé, toutes les lignes sont dupliquées alors que dans la table MySQL d'origine çà n'est pas le cas.
    Je me doute bien que j'ai "pêché" quelque part, mais çà fait plusieurs jours que je trime dessus et je ne vois pas où.
    quelqu'un peut-il m'expliquer ce que j'ai fait de mal ?
    Je le répète, je suis néophyte, aussi, j'ai besoin d'explications vulgarisées!
    merci beaucoup

  2. #2
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut précision
    En fait ce ne sont pas "toutes les lignes qui sont dupliquées" mais dans chaque ligne, toutes les valeurs sont en double.
    un peu comme si dans la boucle interne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach($LignTab as $valeur)
    {
    	array_push($LignPHP,$valeur);	// Je rentre la valeur contenue dans '$valeur' dans '$LignPHP' 
    }
    le array_push($LignPHP,$valeur); s'exécute 2 fois à chaque fois.

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tu fais la récupération des données de façon implicite : autrement dit, en utilisant directement le résultat dans une boucle foreach au lieu d'appeler la fonction fetch. Tu utilises donc le mode de récupération par défaut qui est PDO::FETCH_BOTH. Or FETCH_BOTH remonte les données dans un tableau indexé par nom de colonne ET par numéro de colonne. Autrement dit, chaque donnée est remontée deux fois. D'où tes informations en double.

    Tu peux préciser le mode en utilisant la fonction setFetchMode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $Table = $bdd->query('SELECT * FROM occupations');// On récupère tout le contenu de la table occupations
    $Table->setFetchMode(PDO::FETCH_ASSOC);
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut Corrigé
    Merci Celira, çà fonctionne comme souhaité, c'est la première fois que j'utilise PDO, il est dit dans le manuel que PDO est l'avenir, alors j'ai voulu m'adapter mais ce n'est pas intuitif (je trouve) !

    Merci encore.

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Hum.. c'est peut-être parce que tu as utilisé la récupération implicite. Personnellement, je préfère utiliser une boucle while avec un appel à fetch.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $Table = $bdd->query('SELECT * FROM occupations');// On récupère tout le contenu de la table occupations
    $Table->setFetchMode(PDO::FETCH_ASSOC);
     
    // les deux boucles imbriquées 'foreach', ci-dessous, servent à créer un tableau PHP '$TablPHP' contenant la table 'occupations'
    // Le premier foreach() lit chaque ligne du tableau
    while ($LignTab = $Table->fetch()) 			// while à la place de la boucle foreach : &Agrave; chaque tour de boucle, la valeur de l'&eacute;l&eacute;ment suivant, du tableau $Table, est mise dans la variable $LignTab (qui est elle même un tableau.
    {
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut Merci Celira
    Le bout de code que j'ai utilisé est bâti comme le votre, mais je ne suis pas arrivé à le faire fonctionner comme je voulais alors j'ai modifié pour du foreach.

    Mais j'avais plusieurs problèmes et celui-ci était le dernier en date. Peut-être que le fonctionnement aurait été correct si je n'avais pas eu les autres soucis et je ne suis pas revenu en arrière après les avoir corrigé.

    Et comme maintenant çà fait exactement ce que je voulais que çà fasse, je ne vais pas prendre le risque de casser autre chose.

    Merci encore, c'est vraiment sympa.

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

Discussions similaires

  1. NuméroAuto qui crée des doublons!
    Par Chrysostome dans le forum VBA Access
    Réponses: 21
    Dernier message: 03/05/2016, 16h02
  2. Requête sur des doublons
    Par renaudjuif dans le forum Requêtes
    Réponses: 10
    Dernier message: 22/02/2010, 15h43
  3. REPLACE crée des doublons ?
    Par éric1 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/08/2009, 16h07
  4. saveOrUpdate() qui crée des doublons lors de l'update
    Par tamiii dans le forum Hibernate
    Réponses: 1
    Dernier message: 21/04/2009, 15h44
  5. Un EDIT/UPDATE me crée des doublons
    Par apprenti46 dans le forum VBA Access
    Réponses: 2
    Dernier message: 29/09/2008, 13h58

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