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 :

Une question de débutante sur PHP-MySql


Sujet :

PHP & Base de données

  1. #21
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 31
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    Donc rien d’aléatoire ou de hasard. C’est même assez bestial.
    ????

    Sinon et plus sérieusement, concernant vos tables « dispersées » nous devrions nous en sortir avec une jointure si les enregistrements de ces tables possèdent tous un lien permettant de regrouper les informations.
    Je vous illustre la requête et le fonctionnement de celle-ci par un exemple trivial, une base de données gérant des personnes et plus particulièrement une partie de leur civilité (nom, prénom et age), dans des tables séparés.

    Ex :


    table 1
    IdentifiantTable1 Nom
    001 Dupond

    table 2
    IdentifiantTable2 prénom
    001 Bernard

    table 3
    IdentifiantTable3 Age
    001 20 ans


    Ici, inutile de faire trois requêtes, nous allons regrouper les informations à l’aide d’une requête un peu plus complexe effectuant une jointure.
    Je vous encourage à bûcher un peu sur le SQL (jointure et notamment left et right join…).
    Nous voulons pour chaque enregistrement récupérer le nom, prénom et l’âge de la personne concernée. Malheureusement ces informations sont dispersées. Cependant, un lien entre chaque information relative à un personne en particulier existe par l’intermédiaire de l’identifiant.

    Nous allons spécifier que nous voulons ni plus ni moins, le nom, prénom et l’âge des tous les enregistrements, en liant et regroupant ces enregistrements par l’intermédiaire de l’identifiant de chacun d’entre eux et ainsi avoir la requête suivante :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    Select nom, prénom, Age from table 1 left join table2 on table1.identifiantTable1 = table2.identifiantTable2 left join table3 on table2.IdentifiantTable2 = table3.IdentifiantTable3

    Nous avons spécifié ici les champs sélectionnés, et que l’identifiant de la table 1 sera lié à l’identifiant de la table 2 et que l’identifiant de la table2 sera quant à lui lié à celui de la table 3, et ainsi de suite.

    Vous obtenez ici un résultat de ce type :
    Nom => Dupond ; prénom => Bernard ; Age => 20ans
    Et pouvez faire votre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $ligne->nom.  ‘ ‘. $ligne->prénom etc;
    En espérant que cela vous puisse vous aider.

  2. #22
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 55
    Points : 22
    Points
    22
    Par défaut
    Bonjour Nikopol,

    Ah oui trivial au lieu de bestial.

    Oui j’ai regardé les jointures externes.
    Et c’est effectivement magique (et malin de votre part) car il n’y a plus à préciser si tel champ se trouve dans Taxabase1 ou un autre, si c’est joint.
    Donc a priori ma question est terminée car vous semblez être réticent à aborder le concret à ma façon.
    Mais comme vous êtes le fournisseur de services, gratuit en plus, je m’incline.

    Pour les internautes qui lirait ce post et voudrait y trouver du grain à moudre, voici le code que je vais tester.
    Si bien sûr Nikopol vous voulez réagir ou corriger, ne vous gênez pas.

    Dans le menu gauche (maintenant je n’utilise plus que la clé primaire de taxabase1, ici Rk_Hist=124, identique dans les taxabase2 à taxabase9) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="http://www.abc.org/v?identifier=124>BlablaX</a>
    Dans mon listetaxa.php
    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
            $requete = $connexion->prepare("SELECT nom_index, nom_complet, nom_vulgaire, nom_classique, superordre, ordre, famille, sous_famille, tribu, sous_tribu, coloration1, coloration2 FROM taxabase1 left join taxabase2 on taxabase1.identifiertaxabase 1 = taxabase 2.identifiertaxabase 2 left join taxabase3 on taxabase2.Identifier taxabase2 = taxabase3.Identifiertaxabase3 left join taxabase4 on taxabase3.Identifier taxabase3 = taxabase4.Identifiertaxabase4 left join taxabase5 on taxabase4.Identifier taxabase4 = taxabase5.Identifiertaxabase5 left join taxabase6 on taxabase5.Identifier taxabase5 = taxabase6.Identifiertaxabase6 left join taxabase7 on taxabase6.Identifier taxabase6 = taxabase7.Identifiertaxabase7 left join taxabase8 on taxabase7.Identifier taxabase7 = taxabase8.Identifiertaxabase8 left join taxabase9 on taxabase8.Identifier taxabase8 = taxabase9.Identifiertaxabase9 WHERE identifier = id ");
    $requete->execute();
            while($ligne=$requete->fetch(\PDO::FETCH_OBJ)){
               echo '<p>Nom Index: <b>'.$ligne-> nom_index . '</b></p>';
               echo '<p>Nom Complet: <b>'.$ligne-> nom_complet . '</b></p>';
               echo '<p>Nom Vulgaire: <b>'.$ligne-> nom_vulgaire . '</b></p>';
               echo '<p>Nom Classique: <b>'.$ligne-> nom_classique . '</b></p>';
               echo '<p>Superordre: <b>'.$ligne-> superordre . '</b></p>';
               echo '<p>Ordre: <b>'.$ligne-> ordre . '</b></p>';
               echo '<p>Famille: <b>'.$ligne-> famille . '</b></p>';
               echo '<p>Sous_famille: <b>'.$ligne-> sous_famille . '</b></p>';
               echo '<p>Tribu: <b>'.$ligne-> tribu . '</b></p>';
               echo '<p>Sous-Tribu Complet: <b>'.$ligne-> sous_tribu . '</b></p>';
               echo '<p>Coloration du lobe 1: <b>'.$ligne-> coloration1 . '</b></p>';
               echo '<p> Coloration du lobe 2: <b>'.$ligne-> coloration2 . '</b></p>';
    Sinon bonne chance à vous… et merci vivement de votre bénévolat.
    Bravos encore!!!

    Steph

    PS : j’ai essayé de vous envoyer 2 fois un message privé juste après le message précédent, hier, cela a eu l’air de marcher… sauf que quand j’ai voulu vérifier les messages envoyés mon dossier était vide.
    J’essaierai peut-être à partir d’un autre ordi public.

  3. #23
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 31
    Points : 42
    Points
    42
    Par défaut
    Donc a priori ma question est terminée car vous semblez être réticent à aborder le concret à ma façon.
    J'ai du louper une étape, je suis parfaitement enclin à aborder le concret à votre façon.
    Si vous avez d'autres interrogations allez y.
    Bonne fin de journée.

  4. #24
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 55
    Points : 22
    Points
    22
    Par défaut
    Bonjour Nikopol,

    Merci de votre compréhension.

    Dans le message d'hier j'ai mis au propre le code (2 séquences dans 2 boîtes) après ce que vous m'avez indiqué au long de ce post.
    J'aimerais que vous puissiez valider ce code et corriger les erreurs.
    Dans le détail, par exemple, si j'ai bien appliqué votre exemple pour les jointures, si le where est bon, si j'ai eu raison de remplacer 'identifiant' par 'identifier' et si id ne devrait pas être remplacé par Rk_Hist.
    Cela me permettrait d'avancer de façon plus solide. C'est à dire de produire une page avec du simple 'copier-coller', ou plutôt appel direct de champs sans modif.

    Je sais que tout au début vous avez déjà mis un bout de code qui permet de relever les erreurs et leurs numéros, mais je voudrais l'utiliser dans la 2ème phase qui va commencer pour moi seule.
    Car ce n'est pas que du 'copier-coller', il y a plein de conditions à régler, différentes, ligne à ligne.
    Et là je vais devoir revenir aux fondamentaux (les bouquins).

    Merci.

    A+ Steph

  5. #25
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 31
    Points : 42
    Points
    42
    Par défaut
    Le principe a l'air bon sauf que :


    Concernant votre WHERE identifier = id le moteur de base de données va peut être vous générer une erreur de type champ ambigu, il faudrait préfixer ce champ par le nom d'une des tables ex taxabase1.identifier = id.

    Noubliez pas les ":" pour signifier que id est un paramètre de votre requête.
    et ceci (voir instruction soulignée ci-dessous, que j'avais moi même oubliée dans mon exemple) entre la préparation de la requête et son exécution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // Je prépare la requête paramétrée pour éviter l'injection SQL
    $requete = $connexion->prepare("SELECT monChamp1, monChamp2 FROM maTable where identifiant = :id ");
    
    //Ici la ligne oubliée,
    //Dans mon exemple précédent j'avais oublié de créer et de valoriser le paramètre de la requête contenant l'identifiant de l'objet à rechercher en base de données.
    //Si dans le prepare (instruction/ligne de code précédente), je signifie que la requête contient par mesure de sécurité un paramètre (voir le :id) qui, lui même contiendra une valeur. Je dois bien évidement associer ce paramètre à une valeur. La ligne suivante associe au paramètre id le contenu de la variable permettant d'identifier l'objet concerné. Cette variable est bien entendu envoyée par le navigateur et donc contenue dans la super variable GET dans votre cas car envoyée par l'url, elle-même.
    $requete ->bindParam(':id', $GET["identifier"], PDO::PARAM_INT);
    
    // j’exécute la requête 
    $requete->execute();

    Vérifier les noms des champs contenant les identifiants des tables concernées, je pense qu'il y a des erreurs ou dans le where ou dans la jointure.
    je doute que taxabase8.Identifiertaxabase8 soit correct par exemple et je pense que c'est plutôt taxabase8.identifier et ce pour chacune des jointures.
    Cependant je ne connais pas bien votre base de données.

    PS Testez-vous le code que vous m'envoyez? J'ai l'impression que non.

    Cordialement et courage.

  6. #26
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 55
    Points : 22
    Points
    22
    Par défaut
    Bonjour Nikopol,

    Merci de votre patience et de votre indulgence.

    Je préfèrerais partir d’une situation saine sans erreur a priori car je me connais… si je rencontre d’emblée un problème je vais paniquer et tout bloquer.
    Le meilleur exemple que je puisse donner serait que si j’avais testé la précédente mouture je n’aurais pas pu deviner qu’il manquait une ligne entière de code.
    Dans le left join je pensais avoir appliqué exactement et scrupuleusement, il y a une subtilité qui m’échappe (j’ai vérifié 2 fois, si ce n’est pas la majuscule indue à "identifier"... j'ai ajouté aussi au where Rk_Hist), et là les bouquins ne m’aident pas. Voir la nouvelle proposition ci-après (sans garantie).

    Donc en fonction de vos remarques je joins une nouvelle proposition de code pour vos corrections.

    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
     
            $PARAM_hote = 'localhost'; // le chemin vers le serveur
            $PARAM_port = '3306';
            $PARAM_nom_bd = 'sdz'; // le nom de votre base de données à renseigner
            $PARAM_utilisateur = 'root'; // nom d'utilisateur pour se connecter
            $PARAM_mot_passe = ''; // mot de passe de l'utilisateur pour se connecter
            try
            {
                $connexion = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
            } catch(Exception $e) {
                echo 'Erreur : ' . $e->getMessage() . '<br />';
                echo 'N° : ' . $e->getCode();
            }
            $requete = $connexion->prepare("SELECT nom_index, nom_complet, nom_vulgaire, nom_classique, superordre, ordre, famille, sous_famille, tribu, sous_tribu, coloration1, coloration2 FROM taxabase1 left join taxabase2 on taxabase1.identifiertaxabase 1 = taxabase 2.identifier left join taxabase3 on taxabase2.identifier taxabase2 = taxabase3.identifier left join taxabase4 on taxabase3.identifier taxabase3 = taxabase4.identifier left join taxabase5 on taxabase4.identifier taxabase4 = taxabase5.identifier left join taxabase6 on taxabase5.identifier taxabase5 = taxabase6.identifier left join taxabase7 on taxabase6.identifier taxabase6 = taxabase7.identifier left join taxabase8 on taxabase7.identifier taxabase7 = taxabase8.identifier left join taxabase9 on taxabase8.identifier taxabase8 = taxabase9.identifier WHERE taxabase1.identifier = Rk_Hist:id ");
    $requete ->bindParam(':id', $GET["identifier"], PDO::PARAM_INT);
    $requete->execute();
            while($ligne=$requete->fetch(\PDO::FETCH_OBJ)){
               echo '<p>Nom Index: <b>'.$ligne-> nom_index . '</b></p>';
               echo '<p>Nom Complet: <b>'.$ligne-> nom_complet . '</b></p>';
               echo '<p>Nom Vulgaire: <b>'.$ligne-> nom_vulgaire . '</b></p>';
               echo '<p>Nom Classique: <b>'.$ligne-> nom_classique . '</b></p>';
               echo '<p>Superordre: <b>'.$ligne-> superordre . '</b></p>';
               echo '<p>Ordre: <b>'.$ligne-> ordre . '</b></p>';
               echo '<p>Famille: <b>'.$ligne-> famille . '</b></p>';
               echo '<p>Sous_famille: <b>'.$ligne-> sous_famille . '</b></p>';
               echo '<p>Tribu: <b>'.$ligne-> tribu . '</b></p>';
               echo '<p>Sous-Tribu Complet: <b>'.$ligne-> sous_tribu . '</b></p>';
               echo '<p>Coloration du lobe 1: <b>'.$ligne-> coloration1 . '</b></p>';
               echo '<p> Coloration du lobe 2: <b>'.$ligne-> coloration2 . '</b></p>';
    Vous n’avez pas à vous inquiéter sur la structure des tables taxabase1 à taxabase9, elles sont toutes pareilles avec en 1er champ (par défaut) le même nombre correspondant au même taxon (variété animale pour les béotiens) ligne à ligne, Rk_Hist, ensuite les champs sont remplis de textes différents, mais il n’y a AUCUNE correspondance de table à table (ce n’est plus le cas pour les 6 autres tables qui elles sont imbriquées comme dans une BDD standard et que je garde pour les cas difficiles).

    En partant d’une situation saine je vais pouvoir commencer à tester, promis.

    A+, Steph

  7. #27
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 31
    Points : 42
    Points
    42
    Par défaut
    Envoyez moi la structure complète (sans les enregistrements uniquement la structure de vos tables) et je ferai la requête.
    Sinon petit détail pour le paramètre
    WHERE taxabase1.identifier = Rk_Hist:id DOIT ETRE REMPLACE PAR WHERE taxabase1.identifier = :id

  8. #28
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 55
    Points : 22
    Points
    22
    Par défaut
    Bonjour Nikopol,

    Merci de votre patience.
    Comme je n’avais pas de message mail m'annonçant du nouveau (corrections) sur ce forum, j’ai avancé comme j’ai pu (lentement) sans regarder le forum (hélas).
    Mais à l'instant je vois que vous aviez réagi et peut-être que cela répond à la 2ème erreur???
    J'ai beaucoup cherché pendant mes heures libres mais je bloque.

    En locahost, j’ai testé quelques exemples avec du php simple (par ex. echo, dates, etc.) et cela marche.

    Pour mon fichier listoftaxa.php, j’ai tout de suite 2 erreurs,
    Un, la bdd n’est pas reconnue

    Erreur : SQLSTATE[HY000] [1049] Base 'sitetaxa' inconnue
    N° : 1049
    pourtant j’ai rempli comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $PARAM_nom_bd = 'sitetaxa';
    Deux, l’erreur qui dit :
    Notice: Undefined variable: connexion in D:\_Data\Taxa\wamp\www\sitetaxa\listoftaxa.php on line 19
    Fatal error: Call to a member function prepare() on a non-object in D:\_Data\Taxa\wamp\www\sitetaxa\listoftaxa.php on line 19

    La ligne 19 est celle qui commence par $requete = $connexion->prepare("SELECT…etc à la ligne 14 dans le message précédent du 29/03 à 16h58.

    Merci de vos commentaires.

    Steph

    PS: je confirme: impossible de vous envoyer des messages privés soit il y a une impossibilité (blocage) liée à mon alias (j’en doute) soit cela ne marche pas sur des postes Internet publics.
    maintenant je vois que vous m'aviez envoyé un message privé, je vais y répondre et peut-être que cela va marcher
    Sinon si vous pouviez m’envoyer par message privé votre adresse mail (je les reçois !), alors je pourrais vous prévenir lorsque j’alimenterai ce fil.

  9. #29
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 31
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    Les deux erreurs semblent être liées.
    La variable connexion est en principe un objet de type PDO. Comme tout objet elle contient des paramètres et des fonctions. La fonction prépare en est une.
    A la ligne 14 vous essayez légitimement d’appeler la fonction prépare de l’objet PDO contenu dans la variable $connexion.
    Cependant pour créer un objet d’une classe particulière et ainsi utiliser les composants de cette classe (attribut et méthodes). Il est nécessaire de créer un objet de cette classe, en programmation orienté objet nous appelons ça l’instanciation. En PHP la création d’un objet se fait par l’appel du constructeur de la classe correspondante. Le constructeur est une fonction particulière retournant un objet de la classe demandée et hydratant, valorisant les attributs de cet objet.

    Ainsi et à la ligne 14, vous créé bien un objet de type PDO en appelant le constructeur de la classe en lui passant un ensemble de paramètres qui valoriseront attributs de l’objet et retournera le dit objet.
    Vous récupérez l’objet dans une variable que vous appelez connexion.
    Le problème est que les paramètres nécessaire à la création d’un objet PDO sont les identifiants de la base de données et que ceux-ci doivent bien évidement être corrects.
    Le nom de la base de données étant erroné, la fonction devant vous retourner un objet de type PDO échoue. C’est la signification de la première erreur et vous ne récupérez pas l’objet attendu dans la variable $connexion puisque le constructeur lève une exception.

    Bref il vous faut vérifier le nom de votre base de données. Il semble être erroné.

    Vous ne pouvez donc pas par la suite utiliser la méthode prepare de l’objet PDO puisque vous ne manipulez pas un tel objet (le constructeur ayant échoué à vous renvoyer cet objet).

  10. #30
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 55
    Points : 22
    Points
    22
    Par défaut
    Bonjour Nikopol,

    Oh là là.
    Gros coup d'adrénaline.
    Je suis 100% confuse.
    J'avais oublié des lettres dans le nom de la base tellement j'étais stressée.
    Ne vous moquez pas svp!
    Merci de votre indulgence.

    Bon la correction a été vite faite (et aussi pour le id) et maintenant dans le localhost plus de message d'erreur mais une page complètement blanche.

    Donc j’ai re-scruté le code et comme je ne vois rien, j’ai décidé d’introduire des instructions simples (echos) dans la page (avant le code des jointures) pour voir si elles sont affichées… et çà marche, donc là je sèche
    De plus mon instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<p><a href="http://www.monsite.org/v?identifier=124”>BlablaX</a></p>';
    affiche bien BlablaX, et aussi le lien, mais au clic on a « adresse introuvable » (il doit y avoir un problème de chemin…)

    Voici le code avec des etc. pour racourcir (note pour le modérateur, donc je ne le met pas entre [ code ])
    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <?php
    		echo '<head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />';
    		echo '<title></title></head><body>';
    		echo '<p>Cette phrase a été écrite <strong>\'entièrement\'</strong> en PHP.<br />';
    		echo ('bonjour</p>');
    		echo '<p><a href="http://www.monsite.org/v?identifier=124>BlablaX</a></p>';
           $PARAM_hote = 'localhost'; // le chemin vers le serveur
            $PARAM_port = '3306';
            $PARAM_nom_bd = 'mabasetest'; // le nom de votre base de données à renseigner
            $PARAM_utilisateur = 'root'; // nom d'utilisateur pour se connecter
            $PARAM_mot_passe = ''; // mot de passe de l'utilisateur pour se connecter
            try
            {
                $connexion = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
            } catch(Exception $e) {
                echo 'Erreur : ' . $e->getMessage() . '<br />';
                echo 'N° : ' . $e->getCode();
            }
            $requete = $connexion->prepare("SELECT nom_index, etc. FROM etc. WHERE etc.  taxabase1.identifier = :id");
            $requete ->bindParam(':id', $GET["identifier"], PDO::PARAM_INT);
            $requete->execute();
            while($ligne=$requete->fetch(\PDO::FETCH_OBJ)){
               echo '<p>Nom Index: <b>'.$ligne-> nom_index . '</b></p>';
    etc.
           }
               echo '</body>';
               echo '</html>';
    ?>
    En tout cas je suis assez excitée car j’ai l’impression qu’on approche du but.

    A+, Steph

  11. #31
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 31
    Points : 42
    Points
    42
    Par défaut
    Bonjour Stéphanie,
    Le nom de votre fichier contenant le script s’appelle comment ?
    Si celui-ci est à la racine du répertoire public, votre lien sera de la sorte www.monsite.org/monfichier.php?variable=contenu.
    Votre fichier est-il bien dans le répertoire public (généralement à la base dans l’hébergement et se nommant www ou public) et votre script s’appelle-t-il bien v (d'après votre exemple) et il semble que vous ayez oublié l’extension (.php).

    Sinon votre page n’affiche rien. A vue de nez c’est parce que votre requête ne vous renvoie aucun résultat.
    Faite dans votre code et après le $connexion->prepare(«requête»), un var_dump($connexion).
    Ici la requête ne doit pas être correcte, après ça, ça devrait commencer à fonctionner. Nous devons revoir la requête en je pense, la simplifier et n'afficher qu'un résultat partiel pour tendre progressivement vers le résultat terminal et complet.

    Rien ne vous empêche de tester vos requêtes directement sur l’interpréteur de requêtes de votre administration de bases de données en local ou sur l'herbergeur.
    Accessible généralement en tapant dans votre navigateur 127.0.0.1, puis en sélectionnant le menu principal et PhpMyAdmin et enfin sélectionner la bdd et exécuter la requête en cliquant sur l'onglet correspondant.

  12. #32
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 55
    Points : 22
    Points
    22
    Par défaut
    Bonjour Nikopol,

    Merci de ces commentaires et pistes.
    Je vais répondre point par point (pas à pas).
    1-
    Le nom du fichier de départ s’appelle listoftaxa.php et quand on va cliquer sur le lien <a href="http://www.monsite.org/v?identifier=124>BlablaX</a>, cela doit ouvrir le fichier BlablaX.php (et là bien sûr je sais que cela ne colle pas, mais comme je n’ai pas compris cette instruction et que je ne sais même pas s’il faut un fichier BlablaX.php avec MySql...).
    Les codes de listdata.php et de BlablaX.php sont identiques puisqu’en fait dans le site statique (sans BDD) le lien BlablaX (et tous les autres) est dans le menu gauche dans une liste avec un php include et quand on clique on ouvre une page identique à la page d’accueil de la section membres sauf la partie centrale –center- qui alors contient les données appelées (c’est une page banale avec un header, un menu à gauche, un center et un footer).
    D’après vos commentaires il y a plusieurs soucis dans le lien type <a href="http://www.monsite.org/v?identifier=124>BlablaX</a>.
    D’abord, comme il s’agit d’une section membres, il y a un dossier spécifique et l’on a
    <a href="http://www.monsite.org/membresmonsite/v?identifier=124>BlablaX</a>.
    Et, dans le site statique au lieu de /v?identifier=124 on a /BlablaX.php.
    Ensuite, je n’avais pas compris qu’il fallait adapter le ‘v’ comme une variable… donc si je comprend bien, j’aurais alors ( ???)
    <a href="http://www.monsite.org/membresmonsite/BlablaX.php?identifier=124>BlablaX</a>,
    2-
    Oui dans Wamp, le site est bien dans www avec un sous-dossier appelé monsite (sans le .org) et un sous dossier appelé membresmonsite dans lequel sont tous les fichiers dont j’ai parlé ci-dessus
    3-
    Dans localhost (Internet pas activé), si je clique sur listoftaxa.php, j’obtiens seulement:
    Cette phrase a été écrite 'entièrement' en PHP.
    bonjour
    BlablaX (lien)
    (c-a-d toutes les instructions simples dans le code avant la jointure et les requêtes)
    Et si sur cette page je clique sur le lien BlablaX, j’ai bien l’adresse URL et dans la page j’ai adresse introuvable et dans la barre j’ai erreur de chargement.
    Et si j’active Internet, évidemment j’ai une erreur
    Error 404 - Not found
    car bien sûr il y a le barrage ID/PW de la section membres et le nom du dossier est différent de celui du dossier statique (et il n’a pas été mis chez l’hébergeur encore).
    Si j’ajoute le code var_dump que vous proposez, ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE taxabase1.identifier = :id");
    var_dump($connexion);
    $requete ->bindParam(':id', $GET["identifier"], PDO::PARAM_INT);
    J’obtiens une 4ème ligne avec
    object(PDO)[1]
    Enfin, dernier commentaire, si j’ajoute dans listoftaxa.php le code simple echo ('bonsoir'); dans la boucle while des requêtes au tout début, c-a-d juste avant echo '<p>Nom Index: <b>'.$ligne-> nom_index . '</b></p>'; alors la page n’affiche rien de plus que les 3 (ou 4) lignes précédentes (donc pas de bonsoir) donc c’est là qu’est l’os !
    4-
    le paragraphe commençant par « Rien ne vous empêche de tester vos requêtes… » dépasse mes compétences (même si on a mis en ligne la BDD mysql chez l’hébergeur, on n’a encore fait aucun test car il faudra –d’après mes livres- que je modifie le code avec les PARAM pour l’adapter aux données de l’hébergeur et que je mette le tout dans un fichier connect.php appelé par require ("connect.php");)

    Voilà. On progresse !
    Toujours merci !

    A+, Steph

  13. #33
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 31
    Points : 42
    Points
    42
    Par défaut
    Signifie que vous accédez au script toto.php dans le dossier membres, dossier lui-même placé dans le répertoire public de votre site internet (généralement le www).


    SI vous voulez appeler un script à la racine, l’url sera de la forme suivante

    Si vous voulez appeler un script appelé toto.php dans un dossier appelé dossierEnfant contenu dans un dossier parent appelé DossierParent, lui-même contenu dans un dossier grand parent appelé DossierGrandParent, dossier placé à la racine du site (généralement le www) alors l’url sera de la forme suivante
    http://www.monsite.org/DossierGrandParent/DossierParent/dossierEnfant/toto.php
    Ce qui suit le point d’interrogation est la variable envoyée au serveur, son nom suivi de son contenu.
    Avez-vous compris le principe ???

    Concernant votre requête. Sachant qu’il y a une boucle parcourant tous les résultats de votre requête et que vous placez un écho dans la boucle. Si la requête ne renvoie pas de résultat alors le echo ne sera jamais affiché. Le code de la boucle ne sera jamais parcouru. Votre requête ne renvoie pas de résultat il faut la revoir. Envoyez la moi.

    Le reste est un peu confus je ne suis pas sûr de la comprendre.

  14. #34
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 55
    Points : 22
    Points
    22
    Par défaut
    Bonjour Nikopol,

    Je crois que je comprend bien les différences de principe entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    http://www.monsite.org/toto.php (racine)
    http://www.monsite.org/membresmonsite/toto.php (section membres)
    http://www.monsite.org/membresmonsite/photos/toto.php (section membres, sous-dossier photos).
    Au moins conceptuellement.
    Désolée si dans le cas particulier il y a une conséquence qui m’échappe.
    Le site aura comme page d’accueil listoftaxa.php dans la section membres (avec dans cette page à gauche la liste des taxa et au centre une partie variable qui dépend du « taxa » choisi et par défaut des généralités)
    Mon interrogation était sur le fait d’avoir seulement un seul fichier listoftaxa.php ou listoftaxa.php plus autant de fichiers que de taxa.

    Donc dans ma liste j’ai les liens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <a href="http://www.monsite.org/membresmonsite/BlablaX.php?identifier=124">BlablaX</a>
    <a href="http://www.monsite.org/membresmonsite/BlablaY.php?identifier=125">BlablaY</a>
    OU
    <a href="http://www.monsite.org/membresmonsite/listoftaxa.php?identifier=124">BlablaX</a>
    <a href="http://www.monsite.org/membresmonsite/listoftaxa.php?identifier=125">BlablaY</a>
    J’ai essayé les 2 mais comme la boucle ne marche pas, pas de réponse.
    Peut-être la réponse viendra d’elle même quand la boucle marchera.

    Donc voici le code actuel complet y compris la boucle du fichier listoftaxa.php.
    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
    43
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <?php
    		echo '<head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />';
    		echo '<title></title></head><body>';
    		echo '<p>Cette phrase a été écrite <strong>\'entièrement\'</strong> en PHP.<br />';
    		echo ('bonjour</p>');
    		echo '<p><a href="http://www.monsite.org/membresmonsite/listoftaxa.php?identifier=124>BlablaX</a></p>';
    		echo '<p><a href="http://www.monsite.org/membresmonsite/listoftaxa.php?identifier=125>BlablaY</a></p>';
            $PARAM_hote = 'localhost'; // le chemin vers le serveur
            $PARAM_port = '3306';
            $PARAM_nom_bd = 'mabasetest'; // le nom de votre base de données à renseigner
            $PARAM_utilisateur = 'root'; // nom d'utilisateur pour se connecter
            $PARAM_mot_passe = ''; // mot de passe de l'utilisateur pour se connecter
            try
            {
                $connexion = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
            } catch(Exception $e) {
                echo 'Erreur : ' . $e->getMessage() . '<br />';
                echo 'N° : ' . $e->getCode();
            }
    $requete = $connexion->prepare("SELECT nom_index, nom_complet, nom_vulgaire, nom_classique, superordre, ordre, famille, sous_famille, tribu, sous_tribu, coloration1, coloration2 FROM taxabase1 left join taxabase2 on taxabase1.identifiertaxabase 1 = taxabase 2.identifier left join taxabase3 on taxabase2.identifier taxabase2 = taxabase3.identifier left join taxabase4 on taxabase3.identifier taxabase3 = taxabase4.identifier left join taxabase5 on taxabase4.identifier taxabase4 = taxabase5.identifier left join taxabase6 on taxabase5.identifier taxabase5 = taxabase6.identifier left join taxabase7 on taxabase6.identifier taxabase6 = taxabase7.identifier left join taxabase8 on taxabase7.identifier taxabase7 = taxabase8.identifier left join taxabase9 on taxabase8.identifier taxabase8 = taxabase9.identifier WHERE taxabase1.identifier = :id");
            var_dump($connexion);
            $requete ->bindParam(':id', $GET["identifier"], PDO::PARAM_INT);
            $requete->execute();
            while($ligne=$requete->fetch(\PDO::FETCH_OBJ)){
               echo ('bonsoir');
               echo '<p>Nom Index: <b>'.$ligne-> nom_index . '</b></p>';
               echo '<p>Nom Complet: <b>'.$ligne-> nom_complet . '</b></p>';
               echo '<p>Nom Vulgaire: <b>'.$ligne-> nom_vulgaire . '</b></p>';
               echo '<p>Nom Classique: <b>'.$ligne-> nom_classique . '</b></p>';
               echo '<p>Superordre: <b>'.$ligne-> superordre . '</b></p>';
               echo '<p>Ordre: <b>'.$ligne-> ordre . '</b></p>';
               echo '<p>Famille: <b>'.$ligne-> famille . '</b></p>';
               echo '<p>Sous_famille: <b>'.$ligne-> sous_famille . '</b></p>';
               echo '<p>Tribu: <b>'.$ligne-> tribu . '</b></p>';
               echo '<p>Sous-Tribu Complet: <b>'.$ligne-> sous_tribu . '</b></p>';
               echo '<p>Coloration du lobe 1: <b>'.$ligne-> coloration1 . '</b></p>';
               echo '<p> Coloration du lobe 2: <b>'.$ligne-> coloration2 . '</b></p>';
           }
               echo '</body>';
               echo '</html>';
    ?>
    Voilà. J’espère que je suis claire.
    Veuillez m’excuser pour la fin confuse de mon message précédent.
    Toujours merci !
    A+
    Steph

  15. #35
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 31
    Points : 42
    Points
    42
    Par défaut
    Effectivement c’est plus clair.

    Vous aurez un seul fichier qui va vous renvoyer des informations différentes en fonction de l’identifiant envoyé. Heureusement pour vous et pour tous les concepteurs de logiciels d’ailleurs.

    Grosso modo vous avez UN SEUL script dont le boulot est d’envoyer un type d’informations (ici des informations sur les machins en rapport avec de la biologie ou je ne sais plus quelle science obscure) , informations différentes selon le paramètre ou le groupe de paramètres envoyés par le navigateur.
    C’est pour cela que nous utilisons des bases de données sinon tous serait en statique.

    Ce script récupère les identifiants des objets dont les informations sont à renvoyer. Si les informations changent le script lui est immuable.

    Lorsque vous allez faire vos courses, la liste de courses peut changer, cependant vous vous dirigerez toujours vers le même centre commercial. Ici c’est pareil.
    Donc un seul script !


    Concernant la requête, elle ne peut pas marcher (c’est le moins que l’on puisse dire…).
    Essayez plutôt ceci.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT nom_index, nom_complet, nom_vulgaire, nom_classique, superordre, ordre, famille, sous_famille, tribu, sous_tribu, coloration1, coloration2 
    FROM taxabase1 
        LEFT JOIN taxabase2 ON taxabase1.identifier = taxabase2.identifier 
        LEFT JOIN taxabase3 ON taxabase2.identifier = taxabase3.identifier 
        LEFT JOIN taxabase4 ON taxabase3.identifier = taxabase4.identifier 
        LEFT JOIN taxabase5 ON taxabase4.identifier = taxabase5.identifier 
        LEFT JOIN taxabase6 ON taxabase5.identifier = taxabase6.identifier 
        LEFT JOIN taxabase7 ON taxabase6.identifier = taxabase7.identifier 
        LEFT JOIN taxabase8 ON taxabase7.identifier = taxabase8.identifier 
        LEFT JOIN taxabase9 ON taxabase8.identifier = taxabase9.identifier 
    WHERE taxabase1.identifier = :id

    Voilà qui dans un premier temps devrait être mieux.

    Tenez-moi au courant.

  16. #36
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 55
    Points : 22
    Points
    22
    Par défaut
    Bonjour Nikopol,


    Merci de ces précisions. Cela va mieux.
    J’ai copié le code de la jointure à la place du code précédent (message précédent) avec plus haut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo '<p><a href="http://www.monsite.org/membresmonsite/listoftaxa.php?identifier=124>BlablaX</a></p>';
    echo '<p><a href="http://www.monsite.org/membresmonsite/listoftaxa.php?identifier=125>BlablaY</a></p>';
    En localhost sous wamp quand je clique sur www, puis membresmonsite, puis sur listoftaxa.php, j’ai :

    Cette phrase a été écrite 'entièrement' en PHP.
    bonjour

    BlablaX

    BlablaY

    object(PDO)[1]

    donc il doit rester un problème peut-être dans la jointure ( ?)

    BlablaX et BlablaY sont des liens et si je clique sur le premier j’ai « adresse introuvable » (avec l’adresse :
    http://www.monsite.org/membresmonsit...identifier=124
    )
    Voilà. Cela m’ennuie de rester ainsi avec le même message d’erreur (object(PDO)[1]) et de n’avoir rien à proposer.
    J’ai vérifié qu’il n’y a pas d’erreur dans les noms des champs pour le test.
    Je dois dire (est-ce utile ?) que dans le test, il y a 12 requêtes concernant donc 12 champs, mais que ces champs sont seulement dans 3 des tables (évidemment la suite des requêtes impliquera la totalité des 9 tables jointes).
    Je dois dire aussi (est-ce utile ?) que dans le code, la liste des 12 champs n’est pas dans l’ordre des tables.
    Je ne sais pas comment essayer de vous aider davantage.
    J’ai regardé à nouveau le livre du sdz sur les jointures externes, mais désolée, je ne vois rien à dire.
    Toujours merci !
    A+, Steph

  17. #37
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 31
    Points : 42
    Points
    42
    Par défaut
    Bon,
    On va s’organiser et régler un problème après l’autre.
    Vous avez un problème de lien et un problème avec votre requête. On a identifié les soucis alors ne désespérez pas.

    Lorsque vous déployez un site internet vous indiquez deux choses à votre serveur web en local;
    - L’alias, c’est-à-dire l’adresse à laquelle votre dossier sera accessible. (monsite)
    - Le dossier lié justement à cet alias.

    S’il vous plait et bien sûr si cela est possible faite deux choses. Envoyez moi, un schéma de l’arborescence de votre site avec vos fichier.
    Je veux aussi que vous m’indiquiez deux choses; le fichier appelé ET/OU le contenu du dossier que vous visualisez lorsque vous tapez en local 127.0.0.1/moniste où monsite est l’alias que vous avez donnez en local.

    Je disposerai alors du nom du dossier constituant le répertoire public de ce site. En gros le nom du dossier dans lequel on tombe en tapant l’url en local et sur lequel vos futur internautes tomberont sur le web.

    Voilà, heureusement pour vous je suis un peu obsessionnel et j’aime bien finir ce que j’ai commencé
    Aller vous allez y arriver.

  18. #38
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 55
    Points : 22
    Points
    22
    Par défaut
    Re-bonjour Nikopol,

    Vous voulez l'URL réelle du site et son arborescence?

    Je ne peux décider: c'est une association et je ne suis que bénévole (d'ailleurs vous aussi... et pas si obsessionnel que cela!).
    Il faut que je demande et cela passerait par mail direct.
    Pourriez-vous m'envoyer en MP une adresse mail de contact (même temporaire) car je reçois les MP (mais je ne peux émettre)?

    Pour ce qui est du test de 127.0.0.1/monsite je vais le faire ce WE et vous dirai Lundi ou Mardi.

    D'ici là, bon WE et encore merci pour tout (et votre patience).

    A+
    Steph

  19. #39
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 55
    Points : 22
    Points
    22
    Par défaut
    Bonjour Nikopol,

    Pour le test demandé (wamp a été installé sur mon ordi sous D/ :, dans un sous-sous-dossier) voici les résultats, si j'ai bien compris :

    test en local sur http://127.0.0.1/monsite/

    j'ai une page qui affiche:
    Index of/monsite
    [ICO] Name last modified Size Description
    [PARENTDIR] Parent Directory
    [DIR] monsousdossier 2016-04-22 09:31
    Apache/2.4.9 (Win32) PHP/5.5.12 Server at 127.0.0.1 Port 80


    Pour le reste, le bureau de l’assoce m’a indiqué que c'est OK et tout ouvert (en vous remerciant) et qu’il faut passer par mail (pas en public).

    Merci toujours !
    A+

    Steph

Discussions similaires

  1. [MySQL] Inserer une page de login (en php/mysql) sur site deja existant
    Par ludovic787 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 03/02/2016, 13h36
  2. Une question de débutant sur les conditions
    Par pierrot10 dans le forum Langage
    Réponses: 12
    Dernier message: 08/01/2012, 14h30
  3. Questions de débutant sur le cache php
    Par maxence64 dans le forum Langage
    Réponses: 1
    Dernier message: 30/11/2011, 10h03
  4. [c#] une question de noob... sur les textbox
    Par warenbe dans le forum Windows Forms
    Réponses: 3
    Dernier message: 02/08/2005, 23h13
  5. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51

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