[RESOLU] Conserver la valeur d'un select après rechargement de la page

Eléphanteau du PHP | 23 Messages

24 janv. 2020, 14:08

Bonjour à tous,

Je viens vers vous car je rencontre un petit problème. J'ai un select qui va chercher des boxs en base de donnée afin de l'attribuer à un utilisateur, jusqu'à la, tout fonctionne. Mais j'aimerais qu'au rechargement de la page, la valeur du select soit conservé, car je dois re-sélectionner à chaque fois le box avant de valider la modification. Voici le code que j'ai fais :

<select class="form-control selectpicker" name="box_choice" data-live-search="true" data-size="10" title="Choisissez...">
<?php foreach ($boxs as $box): ?>
<?php $selected = "";
if (isset($_POST["box_choice"]) and $box->id == $_POST["box_choice"]) {
$selected = "selected";
} ?>
<option value="<?= $box->id; ?>"
data-subtext="<?= $box->adresse; ?>, <?= $box->code_postal; ?> <?= $box->ville; ?>"><?= utf8_encode($box->nom); ?></option>
<?php endforeach; ?>
</select>

Merci d'avance pour votre aide ! :)

Avatar du membre
Mammouth du PHP | 1609 Messages

24 janv. 2020, 14:12

Salut, il faut mettre sur la balise option un attribut selected="selected".
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 23 Messages

24 janv. 2020, 14:15

Salut, il faut mettre sur la balise option un attribut selected="selected".
Oui j'ai testé, mais le problème c'est que ça me garde la même réponse à chaque fois (à savoir 'box 2'), quand je vais modifier les infos et que je met 'box 1', et que je valide, si je retourne sur la page, il sera de nouveau affiché 'box 2' :(
Merci de ta réponse en tout cas :D

Avatar du membre
Mammouth du PHP | 1609 Messages

24 janv. 2020, 14:23

Si c'est pas la bonne option qui est en selected c'est que tu ne compares pas les bonnes valeurs. Mais la dans ton code je ne vois pas d'attribut selected sur la balise option. Tu définis juste une variable $selected que tu n'utilises pas.

<option <?php echo (isset($_POST["box_choice"]) && $box->id == $_POST["box_choice"]) || $box->id == $entity->id ? 'selected="selected"' : '' ?> value=...
Avec $entity qui est la ligne que tu es en train de modifier.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 23 Messages

24 janv. 2020, 14:51

Voici le code modifié :
<option <?php echo (isset($_POST["box_choice"]) && $box->id == $_POST["box_choice"]) || $box->id == $_POST['box_choice'] ? 'selected="selected"' : '' ?> value="<?= $box->id; ?>"
Cela me renvois l'erreur suivante : Call Stack #TimeMemoryFunctionLocation

Eléphanteau du PHP | 23 Messages

24 janv. 2020, 15:38

Voici le code modifié :
<option <?php echo (isset($_POST["box_choice"]) && $box->id == $_POST["box_choice"]) || $box->id == $_POST['box_choice'] ? 'selected="selected"' : '' ?> value="<?= $box->id; ?>"
Cela me renvois l'erreur suivante : Call Stack #TimeMemoryFunctionLocation
EDIT : J'ai essayé autre chose :
  <select class="form-control selectpicker" name="box_choice" data-live-search="true" data-size="10" title="Choisissez...">
                                        <?php
                                        foreach ($boxs as $box):
                                            $selected = "";
                                            if (isset($_POST["box_choice"]) and $box->id == $_POST["box_choice"]) {
                                                $selected = "selected = 'selected'";
                                            } ?>
                                            <option <?= selected; ?> value="<?= $box->id; ?>"
                                                    data-subtext="<?= $box->adresse; ?>, <?= $box->code_postal; ?> <?= $box->ville; ?>"><?= utf8_encode($box->nom); ?></option>
                                        <?php endforeach; ?>
                                    </select>
Mais là encore, j'ai la même erreur ...

Mammouth du PHP | 2703 Messages

24 janv. 2020, 15:44

Cela me renvois l'erreur suivante : Call Stack #TimeMemoryFunctionLocation
erreur qui pourrait ne rien avoir avec le code présenté :
https://stackoverflow.com/questions/230 ... 0000143728

Avatar du membre
Mammouth du PHP | 1609 Messages

24 janv. 2020, 15:45

Je te redis pareil. La tu re-sélectionnes la valeur soumise quand on soumet le formulaire mais à aucun moment tu ne testes la valeur enregistrée en base de données. Le $entity dont je parle dans mon message et que tu dois bien entendu adapter à ton code.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 23 Messages

24 janv. 2020, 16:10

J'avoue que je suis complètement paumé pour le coup, pour moi, avec le code que j'ai posté plus haut, je compare déjà l'id sauvé ($_POST) avec l'id de la valeur courante, je ne comprend pas pourquoi le select ne se pose pas sur la valeur selectionné. J'ai vérifié dans ma BDD, et malgrés cela, l'id du box se met à jour, seul le select ne change pas

Avatar du membre
Mammouth du PHP | 1609 Messages

24 janv. 2020, 16:11

$_POST ne contient pas l'id sauvé en base de données il contient juste la valeur soumise quand tu soumets le formulaire. Donc quand tu quittes le formulaire et que tu reviens plus tard $_POST est vide.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 23 Messages

24 janv. 2020, 16:14

Donc je dois trouver le moyen de sauvegarder la valeur du $_POST après rafraîchissement de la page.

Avatar du membre
Mammouth du PHP | 1609 Messages

24 janv. 2020, 16:17

Pas clair ton affaire.

Normalement en très simplifié, puisqu'il s'agit d'un formulaire d'édition tu dois avoir quelques chose du genre :

Code : Tout sélectionner

// $object : la ligne qu'on édite sous forme objet (avec un fetchObject) // $boxes : les options du select box_id // boucle de création des options du select box_id : foreach $boxes as $box <option <?php echo (isset($_POST['box_id']) && $_POST['box_id'] == $box->id) || (!isset($_POST['box_id']) && isset($object) && $object->box_id == $box->id) ? 'selected="selected"' : '' ?> ...

EDIT
J'ai relu le sujet et tu dis :
J'ai un select qui va chercher des boxs en base de donnée afin de l'attribuer à un utilisateur, jusqu'à la, tout fonctionne.
Donc s'il s'agit d'attribuer une box à un user et bien tu dois enregistrer le box_id sur le user. Et quand tu édites le user donc, tu utilises $user->box_id == $box->id en plus de la partie avec le $_POST qui reste intéréssante si soumission du formulaire mais erreur (pour restaurer la valeur sélectionnée mais non enregistrée).

En te basant sur mon exemple $object serait en fait $user dans ton cas.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 23 Messages

24 janv. 2020, 16:51

Effectivement, ta solution fonctionne (un grand grand merci )! Le box est bien sauvegardé ! Mais j'ai une erreur de requête SQL quand j'essai de le sauvegarder maintenant :

Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1366 Incorrect integer value: 'box2' for column 'box_id' at row 1

Voici la requête en question :
  public function update($username, $email, $box_id, $role, $statut, $id)
    {

        $req = $this->pdo->prepare("update users set username=? ,email=?, box_id = ?, role=?, statut = ?, modification_date = CURRENT_TIMESTAMP where id = ?");
        $req->execute([$username, $email, $box_id, $role, $statut, $id]);


    }
Encore merci de prendre le temps de m'aider, vraiment ! :priere:

Avatar du membre
Mammouth du PHP | 1609 Messages

24 janv. 2020, 16:57

Bah box_id attend un integer (Incorrect integer) et la dans la variable $box_id tu as une chaine 'box2' (value: 'box2' for column 'box_id') au lieu de juste 2 à priori ? Un problème sur l'attribut value de la balise option. Logiquement avec ça value="<?= $box->id; ?>" tu ne devrais pas avoir de problème, mais peut être as tu fait une modification sur le code ?
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 23 Messages

24 janv. 2020, 17:02

Pourtant sur la value de l'option je lui passe bien un id, et non une chaîne de caractère, enfin je crois ! Voici le code :
<option <?php echo (isset($_POST['box_choice']) && $_POST['box_choice'] == $box->id) || (!isset($_POST['box_choice']) && isset($users) && $users->box_id == $box->id) ? 'selected="selected"' : '' ?>"  value="<?= $box->id; ?>"