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 :

Attribuer le bon href d'un <a> à partir d'une BDD avec foreach.


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 13
    Par défaut Attribuer le bon href d'un <a> à partir d'une BDD avec foreach.
    Bonjour à tous , c'est mon premier message sur le forum, qui ceci-dit en passant est une mine d'or ! Néanmoins, je n'ai pas trouver la solution à mon problème, sans doute parce qu'il est beaucoup trop élémentaire (je suis débutant en PHP), et parce que avouons-le, qui à la foi de parcourir les 24k de pages ?

    Bref, voici mon problème ; lors de la connexion d'un utilisateur celui-ci est redirigé vers une page réservé aux membre, et sur celle-ci des liens (sous formes de button) lui permettent de télécharger des fichiers.
    Voici mon code exemple sur la page php qui traite la connexion ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $logiciels = array (1 => 'Fab1_1', 2 => 'Fab1_2');
     
    foreach($logiciels AS $key => $logiciel) {
        $querychemin = 'SELECT * FROM chemins_logiciels WHERE nom = "'.$logiciel.'"';
        $resultchemin = mysqli_query($db, $querychemin);
        $user = mysqli_fetch_assoc($resultchemin);
    }
    $_SESSION['logiciels'] = Array('Fab1_1' => $user['chemin'],'Fab1_2' => $user['chemin']);
    Et sur la page d'arrivée ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <div class="logiciel">
        <a href="<?= $_SESSION['logiciels']['Fab1_1'] ?>"><button id="img_Fab1_1"></button></a>
    </div>
    <div class="logiciel">
        <a href="<?= $_SESSION['logiciels']['Fab1_2'] ?>"><button id="img_Fab1_2"></button></a>
    </div>
    Ce que j'essayes de faire c'est tout simplement que chaque lien reçoive le bon contenu href (stocké dans une BDD), mais le problème c'est que quand je clique sur le lien 1 je reçois le href destiné au lien 2 (le lien 2 lui reçois bien le href qui lui est destiné). Je sais d'ores et déjà que c'est dû au fait que le foreach écrase la valeur stocké en session lors des itérations, seulement je ne sais pas vraiment comment l'en empêcher, je sais juste qu'il y a très certainement quelque chose à faire avec break et l'incrémentation, mais malgré maintes recherches et différents essais je ne récupère toujours qu'une valeur...

    A défaut de me donner la réponse toute cuite y'aurait-il au moins une âme charitable pour m'aiguiller vers la droite solution ?

  2. #2
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Salut,
    Quelque chose ne va pas dans ta boucle foreach.
    Tu écrases ta variable $user alors que tu passes 2 fois dans ta boucle.

    Montre la structure de ta table chemins_logiciels.

    mysqli est déprécié, plutôt utiliser PDO pour l'accès aux données.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 13
    Par défaut
    Bonsoir ma5t3r,
    Merci pour ta réponse,
    Oui je sais, c'est ce que je disais, je sais que c'est là d'où vient le problème mais jusqu'à présent je n'ai toujours pas réussi à le résoudre...

    J'avais lu que Mysqli était plus performant mais utilisable qu'avec MySQL & Co, alors que PDO est complètement versatile. C'est carrément "déprécier" ? De toute façon j'ai d'autre parties du site qui utilise PDO, et je comptais faire la bascule vers tout PDO plus tard.

    Pour ce qui est de la structure de la table ;
    #	Nom 	Type	        Interclassement	    Attributs	Null	Valeur par défaut	Commentaires	Extra
    1	id      Primaire	int(11)			          Non	Aucun(e)		
    2	nom	varchar(255)	latin1_swedish_ci	          Non	Aucun(e)		
    3	chemin	varchar(255)	latin1_swedish_ci	          Non	Aucun(e)
    Et les données exemples ;

    id        nom         chemin
    1         Fab1_1      blablabla/blabla/Fab1_1v2.3.exe
    2         Fab1_2      blablabla/blabla/Fab1_2v4.exe

  4. #4
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    J'imagine que tu veux récupérer tous les chemins stockés dans la table.
    Tu adaptes ta requête si ce n'est pas le cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $pdo = new PDO('mysql:host=localhost;dbname=db_name', 'utilisateur', 'mot_de_passe');
     
    $sql = 'SELECT * FROM chemins_logiciels'; // tu mets un ORDER BY si tu en as envie
    $req = $pdo->query($sql);
        while($row = $req->fetch()) {
            echo '<a href="'.$row['chemin'].'">'.$row['nom'].'</a><br/>';
        }
    $req->closeCursor();

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 13
    Par défaut
    Bonjour ma5t3r,
    Merci pour ta réponse,

    Mais ce que je cherche à faire c'est stocker les href récupérés dans une session en un tableau les associant aux noms, de sortes que dans la page vue je n'ai qu'a mettre ce code ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <div class="logiciel">
        <a href="<?= $_SESSION['logiciels']['le_nom_associé_au_href_de_Fab1_1'] ?>"><button id="img_Fab1_1"></button></a>
    </div>
    <div class="logiciel">
        <a href="<?= $_SESSION['logiciels']['le_nom_associé_au_href_de_Fab1_2'] ?>"><button id="img_Fab1_2"></button></a>
    </div>
    etc
    etc
    D'autant plus que les nom Fab1_1, Fab1_2, etc, sont génériques et ne changeront jamais.
    Parce que je ne vois pas comment exécuter ton code.
    A moins de le mettre directement dans la page avec le html et en incluant le fichier qui traite la requête et la connexion, dans le genre ??? ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php include('fichier_requete_et_co_bdd.php') ?>
    <?php while($row = $req->fetch()) { ?>
    <body>
        <div class="logiciel">
            <?php echo '<a href="'.$row['chemin'].'"><button id="img_Fab1_1"></button></a>'; ?>
        </div>
        <div class="logiciel">
            <?php echo '<a href="'.$row['chemin'].'"><button id="img_Fab1_2"></button></a>'; ?>
        </div>
        etc
        etc
    </body>
    <?php } ?>
    Ce qui me paraît en plus être problématique étant donné que l'ancre du lien est un button et non du texte..

  6. #6
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    C'est quoi le but ?
    Parce qu'intégrer un BUTTON dans une balise A, c'est la première fois de ma vie que je vois ça.

    Bon bref, chacun fait ce qu'il a à faire.

    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
     
    $pdo = new PDO('mysql:host=localhost;dbname=db_name', 'utilisateur', 'mot_de_passe');
     
    $logiciels = array();
    $sql = 'SELECT * FROM chemins_logiciels'; // tu mets un ORDER BY si tu en as envie
    $req = $pdo->query($sql);
        while($row = $req->fetch()) {
            $logiciel = array(
                  'id' => $row['id'],
                  'nom' => $row['nom'],
                  'chemin' => $row['chemin'],
            );
            //$logiciels[]=$logiciel;
             $_SESSION['logiciels'][] = $logiciel;   
        }
    $req->closeCursor();
    echo '<div class="wrapper">';
    foreach($SESSION['logiciels'] as $l) {
        echo '<div class="logiciel">';
        echo '<a href="'.$l['chemin'].'" id="idchemin-' . $l['id'] . '">'. $l['chemin'] .'</a>';
        echo '</div>';
    }
    echo '</div> <!-- /wrapper -->';
    Via du CSS tu peux donner l'apparence d'un bouton à ton lien.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Yehacid Voir le message
    ....De toute façon j'ai d'autre parties du site qui utilise PDO, et je comptais faire la bascule vers tout PDO plus tard.
    En effet : on passe de "ridicule" à "complètement stupide"...

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 13
    Par défaut
    Mais non c'est que j'apprends, je teste les deux manières de faire. C'est pour ça que je dis que je ferais la bascule après.

  9. #9
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    J'abandonne.

  10. #10
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Citation Envoyé par ma5t3r Voir le message
    mysqli est déprécié, plutôt utiliser PDO pour l'accès aux données.
    Citation Envoyé par Yehacid
    C'est carrément "déprécier" ?
    Non, absolument pas! Seul l'extension MySQL est obsolète (les fonctions mysql_***), mais ce n'est pas le cas de l'extension MySQLi (MySQL improved).

    Citation Envoyé par Yehacid
    J'avais lu que Mysqli était plus performant mais utilisable qu'avec MySQL & Co, alors que PDO est complètement versatile.
    Oui c'est ça. Cela dit, PDO n'est pas complètement versatile, dans le sens où les différents SGBDs ont chacun leurs particularités et que PDO n'émulera pas un de ces particularismes pour un SGBD qui ne l'a pas. En d'autres termes, même en utilisant PDO pour passer d'un SGBD à un autre, changer simplement de pilote ne suffit pas forcément.

  11. #11
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 13
    Par défaut
    Citation Envoyé par ma5t3r Voir le message
    C'est quoi le but ?
    Parce qu'intégrer un BUTTON dans une balise A, c'est la première fois de ma vie que je vois ça.

    Via du CSS tu peux donner l'apparence d'un bouton à ton lien.
    Ah eh bien merci ma5t3r de m'en informer parce que du coups je suis aller me renseigner sur cette pratique et elle ne fait effectivement pas partie des standards valide du HTML. J'ai refais tout mes liens ^^
    Et merci pour le code


    Citation Envoyé par CosmoKnacki Voir le message
    Non, absolument pas! Seul l'extension MySQL est obsolète (les fonctions mysql_***), mais ce n'est pas le cas de l'extension MySQLi (MySQL improved)
    Ah ! Bonjour CosmoKnacki et merci de l’information et des précisions ! La bascule attendra bien alors, je vais plutôt retranscrire et adapter le code de ma5tr3 à MySQLi, et ferait la bascule vers tout PDO une fois tout terminer comme initialement prévue (parce qu'en plus je viens d'essayer de le faire pour ma page de traitement des connexions et ça ne marchait qu'à moitié pour l'instant.. ma BDD se mettait bien à jour (comme j'enregistre la dernière date de connexion) mais la $_SESSION autorisant l'affichage de la page d'arrivée ne semblait pas être prise en compte.. . Bref.. je reviens vous dire si tout fonctionne correctement..

  12. #12
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Autant pour moi CosmoKnacki ,
    Ca fait tellement d'années que j'utilise un framework où les interactions bdd sont encapsulées, qu'en ce qui me concerne, je ne sais plus coder directement avec du PDO pur.

    Raconter des conneries ça arrive aux meilleurs, la preuve :-)

  13. #13
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 13
    Par défaut
    Bon, ça marche, mais à moitié ...

    Pour le fichier php qui traite la connexion ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $logiciels = array();
        $sql = 'SELECT * FROM chemins_logiciels';
        $req = $db->query($sql);
            while($row = $req->fetch_assoc()) {
                $logiciel = array(
                    'id' => $row['id'],
                    'nom' => $row['nom'],
                    'chemin' => $row['chemin'],
                );
                $logiciels[]= $logiciel;
                $_SESSION['logiciels'][] = $logiciel;   
            }
        $req->free();
    Et pour la page html d'arrivée ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php foreach($_SESSION['logiciels'] as $l) { ?>
        <div class="logiciel">
            <?php echo '<a href="'.$l['chemin'].'" id="img_' . $l['nom'] . '"></a>'; ?>
        </div>
        <div class="logiciel">
            <?php echo '<a href="'.$l['chemin'].'" id="img_' . $l['nom'] . '"></a>'; ?>
        </div>
    <?php } ?>
    Problème : j'obtiens toujours le fichier 1 et si je sors le $_SESSION de la boucle while alors j'obtiens toujours le fichier 2... J'ai bien conscience que c'est les valeurs de la session qui se font écrasées, et après divers essais je patine. C'est un array, ça ne devrait pas se stocker à la suite plutôt qu'écraser la valeur précédente ? Ou alors c'est ma retranscription en MySQLi qui est erronée ? De plus, du coups, comme visiblement c'est pas un tableau comme escompté, là les lignes 1 et 10 sont inutiles, ça fait la même chose sans.

  14. #14
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Tu le fais exprès ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php foreach($_SESSION['logiciels'] as $l) { ?>
        <div class="logiciel">
            <?php echo '<a href="'.$l['chemin'].'" id="img_' . $l['id'] . '">'. $l['nom'] .'</a>'; ?>
        </div>
    <?php } ?>

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

Discussions similaires

  1. [MySQL] Liste déroulante à partir d'une BDD avec Mysqli en procédural
    Par Denis Placé dans le forum PHP & Base de données
    Réponses: 23
    Dernier message: 14/08/2017, 13h04
  2. Obtenir le MCD a partir d'une BDD Oracle, possible?
    Par dipajero dans le forum Designer
    Réponses: 7
    Dernier message: 06/01/2006, 20h48
  3. Réponses: 18
    Dernier message: 08/08/2005, 20h52
  4. Réponses: 3
    Dernier message: 03/08/2005, 11h21
  5. [Listview] Remplissage à partir d'une bdd mysql
    Par Cybher dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/07/2005, 09h32

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