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

Langage PHP Discussion :

Requète sur BDD avec l'objet PDO


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Points : 65
    Points
    65
    Par défaut Requète sur BDD avec l'objet PDO
    Bonjour à tous.

    Tout d'abord, je m'excuse pour ce titre vague qui reflète ma totale incompréhension de mon problème.

    Contexte : j'ai développé un site web pour le partage des agendas au sein de mon entreprise.
    Dans un premier temps, je l'ai fais en local sur mon pc avec wamp manager et tout marche bien.
    J'ai ensuite migré le site sur internet et plus précisément sur l'hébergeur amen.
    J'ai transféré mes fichiers par le biais de FileZilla.
    J'ai importé la Base de donnée MySQL.

    Problème : Les bases de données sont identiques(celle en local sous wamp et celle que j'ai migré sur Amen) au niveau du nommage des champs.
    J'ai bien changé la connexion à la base de donnée en fonction de l'hébergeur. Voici la ligne qui correspond :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //connexion à la BDD
    $bdd = new PDO('mysql:host=localhost;dbname=calendrier_ventana', '[user]', '[mdp]');
    Bien sûr [user] et [mdp] sont à remplacer par les vrais champs

    Normalement, ce changement aurait du suffire(enfin je pense) au bon fonctionnement du site.
    Seulement j'ai eu des erreurs : certaines requêtes SQL ne fonctionnaient plus.



    Par exemple, ici je parcours un tableau associatif contenant, en clé, le nom de l'entreprise, et en valeur, le tableau des employés de l'entreprise.

    Pour chaque entreprise j'affiche son nom en h5
    Pour chaque employé j'affiche son nom sous forme de liste li
    Si la dernière maj est vieille de plus d'un semaine, je surligne en rouge le nom de l'employé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    foreach($membres as $entreprise => $liste_membres){
    				echo "<h5>".$entreprise."</h5>";
    				foreach($liste_membres as $membre){
                                             //cette ligne plante
    					$date_maj = $bdd->query("SELECT date_derniere_maj FROM employe WHERE nom ='".$membre."'")->fetch();
    					$couleur=(mktime()-strtotime($date_maj[0])>(7 * 24 * 60 * 60))?"style=\"background-color:red;\"":"";
    					echo "<li ".$couleur.">".$membre."</li>";
    				}	
    			}
    La requête plante et, suite à celle-ci, le code s'arrête complètement.
    Code source générée par ce script:
    (ce sera la dernière ligne de code HTML générée dans la page car le script fait planter le chargement de la page)

    Alors que la bdd contient 5 entreprises et plusieurs personnes dans chaque entreprise



    Après j'ai résolu d'autre problèmes similaire en changeant le nom des variables => peut être des conflits vu que j'utilisais tout le temps $result et $ligne comme récepteur des résultats des requêtes SQL mais jamais sur plusieurs requêtes à la fois

    ou encore en optimisant les requêtes(en imbriquant deux requêtes ensemble) => Amen empêche t il l'exécution de trop de requête à la suite?

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $result = $bdd->query("SELECT * from entreprise ORDER BY nom");
    				while($ligne = $result->fetch()){
    					$occurence = $bdd->query("SELECT COUNT(*) FROM employe WHERE id_entreprise='".$ligne["id_entreprise"]."' ")->fetch();
    					if($occurence[0]!=0)
    						echo '<input type="checkbox" name ="CB_entreprise_'.$ligne['id_entreprise'].'" value="'.$ligne['nom'].'"/><span style="position:relative;top:2px;">'.$ligne['nom'].'</span><br/><br/>';
    				}
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $liste_entreprises = $bdd->query("SELECT DISTINCT ent.id_entreprise as id_entreprise, ent.nom as nom from entreprise ent, employe e WHERE e.id_entreprise = ent.id_entreprise ORDER BY nom");
    				while($entreprise = $liste_entreprises->fetch()){
    						echo '<input type="checkbox" name ="CB_entreprise_'.$entreprise['id_entreprise'].'" value="'.$entreprise['nom'].'"/><span style="position:relative;top:-2px;">'.$entreprise['nom'].'</span><br/><br/>';
    				}
    Si quelqu'un a une idée... je suis perdu

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    hello, deja activer la gestion des erreurs pour PDO : http://php.net/manual/fr/pdo.error-handling.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bdd->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
    ton $liste_membres il est sous quelle forme ?

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Points : 65
    Points
    65
    Par défaut
    merci pour ta réponse rapide.

    J'active la gestion des erreurs et j'édit...

    Quand à mon $liste_membres il est sous la forme
    [nom_entreprise] => {nom_employé, nom_employé, nom_employé, ...}
    [nom_entreprise] => {nom_employé, nom_employé, nom_employé, ...}
    [nom_entreprise] => {nom_employé, nom_employé, nom_employé, ...}
    ....
    deux tableaux imbriqué : 1 associatif qui contient le nom de l'entreprise et un tableau avec les membres de cette entreprise

    Mais là n'est pas le problème étant donné que ça marchait très bien en local.

    [edit] = aucune erreur ne s'affiche avec la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bdd->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
    en plus

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_export($liste_membres);

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Points : 65
    Points
    65
    Par défaut
    je l'ai ajouté avant le script et ça met NULL

    Après le tableau n'est pas vide car déjà il met CIMB (qui est la première entreprise par ordre alphabétique)

    [Edit] : Arf j'ai dis nimportequoi excusez moi!

    contenu de print_r($liste_membres)
    array ( 0 => 'Adrien', )

    contenu de var_export($liste_membres);
    Array ( [0] => Adrien )

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    t'as bien la gestion des erreurs PHP d'activée ?

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Points : 65
    Points
    65
    Par défaut
    Bah je pense pas vu que c'est sur l'hébergeur Amen..

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par zenico64 Voir le message
    Bah je pense pas vu que c'est sur l'hébergeur Amen..
    fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump(ini_get('display_errors'), error_reporting());

  9. #9
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Points : 65
    Points
    65
    Par défaut
    j'ai ajouter ta ligne en début de code, et ya ça qui est apparu :
    string(0) "" int(2047)
    juste après la balise <body>

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par zenico64 Voir le message
    j'ai ajouter ta ligne en début de code, et ya ça qui est apparu :
    string(0) "" int(2047)
    juste après la balise <body>
    aie, t'as l'affichage des erreurs déactiver, et t'es en niveau E_ALL, parcontre c'est un ancien niveau, t'as quelle version de PHP ?

  11. #11
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Points : 65
    Points
    65
    Par défaut
    php 5

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par zenico64 Voir le message
    php 5
    plus précisément ?

  13. #13
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    plus précisément ?
    Excuse moi, comment je peux voir ça?

    [edit] : php : 4.4.9 - 5.2.5
    source : http://www.amen.fr/web-hosting/hosting-linux.html

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par zenico64 Voir le message
    Excuse moi, comment je peux voir ça?

    [edit] : php : 4.4.9 - 5.2.5
    source : http://www.amen.fr/web-hosting/hosting-linux.html
    ok, donc 5.2.5

    au debut de ton code fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ini_set('display_errors', true);
    error_reporting(E_ALL | E_STRICT);

  15. #15
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Points : 65
    Points
    65
    Par défaut
    array ( 0 => 'Adrien', )Array ( [0] => Adrien )
    Warning: PDO::query() [function.PDO-query]: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. in /var/www/vhosts/ventana-aerospace.fr/subdomains/calendrier/httpdocs/afficher_agenda.php on line 97

    Fatal error: Call to a member function fetch() on a non-object in /var/www/vhosts/ventana-aerospace.fr/subdomains/calendrier/httpdocs/afficher_agenda.php on line 97


    Merci beaucoup
    Je m'y penche et j'édit

    [edit] : si j'ai bien compris, il faut que je vide les variable contenant les requêtes avec la fonction fetch() ou fetchAll() avant de pouvoir réutiliser cette fonction. C'est ça?

    [edit] : c'est peut être du à ce genre de ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $occurence = $bdd->query("SELECT COUNT(*) FROM employe WHERE id_entreprise='".$ligne["id_entreprise"]."' ")->fetch();
    je fais juste 1 fetch() et si il y a d'autres lignes tan pis


    [edit] : Hola ça s'agite!

    j'ai d'abord changé ce morceau de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $entreprises = $bdd->query("SELECT ent.nom AS nom FROM entreprise ent, employe e WHERE e.nom='".$employe."' AND ent.id_entreprise = e.id_entreprise");
    		$entreprise = $entreprises->fetch();
    		$membres[$entreprise["nom"]][]=$employe;
    j'y ai ajouté ceci à la fin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $entreprises->fetchAll();
    et maintenant les erreurs semblent venir de mes objet time et tout ce qui est relié à cela:
    Strict Standards: mktime()
    Strict Standards: strtotime()
    Strict Standards: date()

    message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Strict Standards: date() [function.date]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Berlin' for 'CET/1.0/no DST' instead in /var/www/vhosts/ventana-aerospace.fr/subdomains/calendrier/httpdocs/afficher_agenda.php on line 109
    n'y a t il pas une bibliothèque à inclure ou autre pour que ces objets re fonctionnent?

    [edit] : j'ai ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	date_default_timezone_set("Europe/Paris");
    c'est pareil..

  16. #16
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Points : 65
    Points
    65
    Par défaut
    petit up

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    hello, quand tu fais qu'un seul fetch il faut faire un closeCursor après, si tu fais un fetchAll pas besoin, pareil si tu récupères tout les fetch, par contre n'utilise pas fetchAll a la place closeCursor, tu va bouffer de la ressource pour rien

    pour ton erreur de date c'est ton serveur qui est mal configurer, change les valeur direct dans le php.ini ou dans un htaccess si possible

  18. #18
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Points : 65
    Points
    65
    Par défaut
    Niquel merci beaucoup!

    Que dois-je changer dans le php.ini pour éviter ceci?

    [edit] :
    Ha et comment je fais si je veux faire une requète dans l'éxécution d'une autre?
    genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    req1=requête
    while(req1->fetch()){
           //là le server ne veut pas faire une autre requete pendant que la première n'est pas vide
           req2=requête
           req2->fetch()
           req2->closecursor()
    }

  19. #19
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    dans le php.ini il faut mettre :
    date.timezone = Europe/Paris


    ensuite si tu regarde bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    req1=requête
    while(req1->fetch()){
           //là le server ne veut pas faire une autre requete pendant que la première n'est pas vide
           req2=requête
           req2->fetch()
           req2->closecursor()
    }
    ca correspond a une jointure

  20. #20
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 105
    Points : 65
    Points
    65
    Par défaut
    Ouep j'ai vu ça mais paie ta jointure...
    Perso j'ai pas réussi a résoudre le problème enfin..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $liste_employes = $bdd->query("SELECT ent.nom AS entreprise, e.nom AS nom, e.id_employe AS id_employe from employe e, entreprise ent WHERE e.id_entreprise = ent.id_entreprise ORDER BY ent.nom, e.nom");
    			$ancienne_entreprise="";
    			while($employe = $liste_employes->fetch()){
                                    //Si le nom de l'entreprise n'a pas encore été affiché, je l'affiche
    				if($ancienne_entreprise!=$employe['entreprise']){
    					echo '<tr><td style="text-align:left;"><h4 style="text-align:left;margin-left:0px;">'.$employe["entreprise"].' : </h4></td></tr>';
    				}
    				$ancienne_entreprise=$employe['entreprise'];
                                    // j'affiche une checkbox, checké ou pas selon si l'employé éxiste déjà dans le groupe ou non
    				echo '<tr><td id="'.$employe['nom'].'" style="text-align:left;"><input type="checkbox" name="CB_'.$employe['id_employe'].'" value="'.$employe['id_employe'].'" '.$etat.'/>'.$employe['nom'].'</td></tr>';
    			}
    la variable $etat doit contenir soit "checked" soit ""
    j'avais imbriqué une requête qui ressemblais à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bdd->query("SELECT COUNT(*) AS existe FROM contenir WHERE id_groupe='".$_GET["groupe"]."' AND id_employe='".$employe['id_employe']."'");
    après je faisais un fetchAll() et la variable etat recevait ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$etat = ($etat[0][0]!=0)?"checked":"";
    [edit] : J'ai contourné mon problème de cette mannière :
    J'ai ajouté ça en avant la première requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			$contenir = $bdd->query("SELECT id_employe from contenir WHERE id_groupe='".$_GET["groupe"]."'");
    			While($employe_groupe = $contenir->fetch()){
    				$existe[$employe_groupe["id_employe"]]="";
    			}
    et ça pendant le parcours des lignes données par la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $etat = (isset($existe[$employe['id_employe']]))?"checked":"";

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. mysql_insert_id avec un objet PDO
    Par fredu dans le forum Langage
    Réponses: 2
    Dernier message: 04/04/2009, 23h31
  2. Requête sur table avec beaucoup de champs
    Par Lideln75 dans le forum Requêtes
    Réponses: 16
    Dernier message: 04/12/2008, 02h37
  3. Requêtes sur enregistrements avec critères dates
    Par Aliveli dans le forum Access
    Réponses: 10
    Dernier message: 05/06/2006, 13h41
  4. Probleme avec l'objet PDO en PHP
    Par krovomi dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 03/05/2006, 12h18
  5. [phpMyAdmin] Problème de connexion sur BDD avec phpMyAdmin 2.8.0.2
    Par romca dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 21/03/2006, 14h35

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