8768 sujets

Développement web côté serveur, CMS

Bonjour,
Je voudrais afficher des valeurs nom prénom d'un ID select multiple.
Je ne sais pas siu je me fais bien comprendre mais voici mon code :

<div class="mb-4 form-group">
    <label style="width:250px" class="d-inline pl-4" for="ChildID">Enfant(s)</label>
    <select style="width:850px" class="form-control" id="ChildID" name="ChildID[]" multiple>
        <?php
        if (!empty($_SESSION['ChildID'])) {
            $ChildID = ($item['ChildID']);
            foreach ($bdd->query('SELECT * FROM children WHERE ChildID = "' . $_SESSION['ChildID'] . '"') as $row) {
                if ($row['ChildID'] == $ChildID)
                    echo '<option selected="selected" value="' . $row['ChildID'] . '">' . $row['child_firstname'] . ' ' . $row['child_lastname'] . ' </option>';
                else
                    echo '<option value="' . $row['ChildID'] . '">' . $row['child_firstname'] . ' ' . $row['child_lastname'] . ' </option>';
            }
        }
        ?>
    </select>
</div>

Ce code ne m'affiche que le premier prénom et nom liés à ChildID alors que lorsque je fais un var_dump de ChildID, les deux ChildID s'affichent bien, mais je souhaite afficher les deux prénoms et noms liés à ces ChildID.
J'espère que vous comprendrez mon souci et que vous pourrez m'aider.
En attendant mille mercis de ce que vous pourrez faire pour moi.
Modifié par Loutschi (05 Jan 2023 - 14:24)
Salut,

Dans ton foreach fais un var_dump de $row, il doit y avoir qu'un seul résultat.

Et... ton if il est bizarre.... pourquoi mettre le childid de ta session dans ton where, au lieu de $ChildID direct ?

après difficile de capté, tu as $item['ChildID'], $_SESSION['ChildID'], $ChildID, $row['ChildID']... ça serait pas mal de renommé un peu..

et utilise des requêtes préparé pour éviter les injections SQL Smiley smile
Modifié par JENCAL (05 Jan 2023 - 11:07)
Merci #JENCAL de ton retour.
J'ai fait un var_dump de $row, effectivement je n'ai que le premier résultat.
J'ai modifier mon code par une requête prtéprer comme ci-dessous, mais ça ne change rien, j'ai toujours que la première valeur qui s'affiche et lorsque je fais un var_dump de $list, toujours que la première valeur qui s'affiche.

<div class="mb-4 form-group disable">
    <label style="width:250px" class="d-inline pl-4" for="ChildID">Enfant(s)</label>
    <?php
    $ChildID = $_SESSION['ChildID'];
    $result = $bdd->prepare('SELECT * FROM children WHERE ChildID = "' . $ChildID . '"');
    $result->execute(array($ChildID));
    $list = $result->fetchAll();
    echo '<select style="width:850px" class="form-control" name="ChildID[]" multiple>';
    foreach ($list as $child)
        echo '<option value="' . $child["ChildID"] . '">' . $child["child_firstname"] . ' ' . $child["child_lastname"] . '</option>';
    echo '</select>';
    ?>
    <?php
    echo '<pre>';
    var_dump($list); // s'affiche que la première valeur
    echo '/<pre>';
    ?>
</div>

Dans ma table members de ma BDD j'ai les valeurs ChildID "1, 2 " mais au format VARCHAR(10) alors que dans la table children le ChildID est au format INT(10). En fait je ne peux pas mettre le format INT dans la table membres car, j'imagine, le fait que lorsqu'il y a 2 valeurs, les ID sont séparés par une virgule, et à cause de cette virgule le format INT ne fonctionne pas !
Est-ce que le problème pourrait venir de là ? Pour ma part je ne pense pas puisque le code affiche la première valeur correctement !
Loutschi a écrit :
Merci #JENCAL de ton retour.
J'ai fait un var_dump de $row, effectivement je n'ai que le premier résultat.
J'ai modifier mon code par une requête prtéprer comme ci-dessous, mais ça ne change rien, j'ai toujours que la première valeur

Yes Parce que la requête te retourne qu'une valeur. rien a voir avec une requêtes préparé ou non. Dans ta base, il n'y a qu'une ligne avec l'IDchild que tu envoie dans le where.

Loutschi a écrit :

Dans ma table members de ma BDD j'ai les valeurs ChildID "1, 2 " mais au format VARCHAR(10) alors que dans la table children le ChildID est au format INT(10).


Met tout au bon format sinon ça marchera pas. ou alors il faut bricoler un truc. qui petera surement un jour
En faite, il te faut une table intermédiaire ou stocker un json / tableau dans ton champs.

Avec un table intermédiaire c'est plus parlant... avec un array/json dans un champs c'est plus rapide.

Mais oui, si tu dis "WHERE ID = 10" et que dans ton id (champs de la base) tu as "10,11"... pas sûr que ça fasse des miracles Smiley smile

P.S tu as fais le prepare() php à moitié.

il faut nommé ses variables avec ":"

ex :

$result = $bdd->prepare('SELECT * FROM children WHERE ChildID = :ChildID');
$result->bindValue(':ChildID', $ChildID);
$result->execute(
);
Modifié par JENCAL (05 Jan 2023 - 15:03)
Ouf !! Je t'avour que je suis un peu perdu là car :

a écrit :
En faite, il te faut une table intermédiaire ou stocker un json / tableau dans ton champs.
Avec un table intermédiaire c'est plus parlant... avec un array/json dans un champs c'est plus rapide.

ça je ne sais pas faire !
Je vais déjà essayer d'harmoniser les formats pour voir ce que ça donne.
En tout cas merci pour ton aide.
Modifié par Loutschi (08 Jan 2023 - 18:47)