8768 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à tous,
voilà mon problème, j'ai des checkbox à faire cocher à l'utilisateur pour choisir des salariés afin de créer une équipe. Ce nombre de checkbox (et donc le nom des salariés) change selon l'utilisateur. J'ai donc fait un for each en PHP afin de récupérer tout ça pour le mettre dans ma bdd.
Le but étant d'insérer cette chaîne de caractère style "salarié1, salarié2, salarié3" sous un champ "noms_salariés".
Seulement cela m'affiche seulement le dernier coché...
Quelqu'un aurait une idée?
Est-ce que je suis partis sur la bonne façon de faire?
Merci a vous
Peux tu nous montrer le code du formulaire à remplir avec ses checkboxes à remplir, tel que c'est actuellement codé dans ta page ?
Bien-sûr, si il faut je peux donner plus d'explication

HTML

<div id="div_ajout_equipe">
<h1>Ajouter une équipe</h1>
<form id="" action="" method="POST">
<label>Nom de l'équipe:</label></br >
<input type="text" name="nom_equipe"></br >

<?php
// On affiche chaque entrée une à une :
while ($donnees_noms_salaries = $affichage_noms_salaries->fetch())
{
?>
<!-- affichage des checkbox selon la bdd et infos correspondant au user -->
<input type="checkbox"
value="<?php echo $donnees_noms_salaries['nom'] . '&nbsp;' . $donnees_noms_salaries['prenom']; ?>"
name="noms_salaries[]"/><?php echo $donnees_noms_salaries['nom'] . '&nbsp;' . $donnees_noms_salaries['prenom']; ?></br >

<?php
}
$affichage_noms_salaries->closeCursor(); // Termine le traitement de la requête
?></br >
<input type="submit" name="" value="Ajouter"></br >
<input type="reset" name="" value="Annuler" onclick="cache_div(this, 'div_ajout_equipe')">
</form>
</div>

et le PHP

if (!empty($_POST['noms_salaries'])){
foreach($_POST['noms_salaries'] as $noms_salaries)
{
//$aaa = implode(", ", $_POST['noms_salaries']);
// echo $noms_salaries;
// echo (array_values($noms_salaries));
}

$req = $pdo->prepare("SELECT equipes.id FROM equipes JOIN utilisateurs_particuliers ON equipes.ID_utilisateur = utilisateurs_particuliers.id");
$req->execute($_POST['noms_salaries']);
$utilisateur_particulier = $req->fetch();
}else{
$erreurs['noms_salaries'] = "Vous n'avez pas choisis au moins deux salariés";
}
Si je comprends bien ce que tu fais, tu as une liste de nom/prénom avec une checkbox devant.
Si tu veux récupérer les checkbox, il faudrait leur donner un nom pour savoir lesquelles ont été choisies.

<?php
// On affiche chaque entrée une à une :
while ($donnees_noms_salaries = $affichage_noms_salaries->fetch())
{
?>
<!-- affichage des checkbox selon la bdd et infos correspondant au user -->
<input type="checkbox" name = <?php echo ...; ?>
value="<?php echo $donnees_noms_salaries['nom'] . '&nbsp;' . $donnees_noms_salaries['prenom']; ?>"
name="noms_salaries[]"/><?php echo $donnees_noms_salaries['nom'] . '&nbsp;' . $donnees_noms_salaries['prenom']; ?></br >

<?php>
Merci de ta réponse !
Donc si je comprend bien, il faut que je fasse :
name="<?php echo $donnees_noms_salaries['nom'] . '&nbsp;' . $donnees_noms_salaries['prenom']; ?>" ?

et du coup remplacer tout ce qui concerne le name dans ce qui est récupéré?
Oui, je sais, mon soucis est que je récupère la dernière checkbox coché dans la liste...
:/
Je ne vois pas du tout comment faire du coup...
je voudrai les récupérer comme suit :
"salarié1, salarié2, etc" pour mettre ca dans une colonne "Salariés de la table MySQL
Bonsoir,

c'est normal ... en effet ton champ de formulaire s'appelle TOUJOURS "name" du coup tu ne passe qu'une valeur, la dernière.

le plus simple dans ton cas est d'assigner un name unique pour chaque checkbox et ton pb sera résolu.


<?php
// On affiche chaque entrée une à une :
$i = 1;
while ($donnees_noms_salaries = $affichage_noms_salaries->fetch()){ ?>

<!-- affichage des checkbox selon la bdd et infos correspondant au user -->

<input type="checkbox" name = <?= "salarie" . $i ?> value="<?= $donnees_noms_salaries['nom'] . '&nbsp;' . $donnees_noms_salaries['prenom']; ?>"
name="noms_salaries[]"/><?= $donnees_noms_salaries['nom'] . '&nbsp;' . $donnees_noms_salaries['prenom']; ?></br >

<?php 
$i++;
}
?>


J'ai pas testé mais cela devrait me faire ou presque lol Smiley langue
Modifié par biduletruck (30 Mar 2020 - 22:03)
Alors comment est ce que je peux faire sachant que je ne sais pas le nombre de checkbox car cela dépends des informations de l'utilisateur...il peut y en avoir 8 comme 20, du coup je fait un foreach pour les afficher...
Je ne sais pas trop comment mettre le om du coup...
:/

Edit : et merde désolé pas tout bien lu, je vais essayé!

Edit :J'ai essayé mais je n'arrive pas à les avoir...peut etre du au foreach?
:/
Modifié par melER5 (30 Mar 2020 - 23:08)
Voilà un petit exemple bateau avec un "while" j'espère que tu verras mieux ainsi.

Seule différence dans ton cas $i est égale a 1 lors de l'initialisation et en fin de boucle au lieu de faire un $I-- (comme dans l'exemple toi tu devras faire un $I++


<?php
$i = 15;
while ($i >= 0){ ?>
    <input type="checkbox" name = "<?= 'salarie' . $i ?>" value="<?= $i ?>" > <br>
<?php
$i--;
} ?>


via un interpréteur voilà le résultat


<input type="checkbox" name = "salarie15" value="15" > <br> 
<input type="checkbox" name = "salarie14" value="14" > <br> 
<input type="checkbox" name = "salarie13" value="13" > <br> 
<input type="checkbox" name = "salarie12" value="12" > <br> 
<input type="checkbox" name = "salarie11" value="11" > <br> 
<input type="checkbox" name = "salarie10" value="10" > <br> 
<input type="checkbox" name = "salarie9" value="9" > <br> 
<input type="checkbox" name = "salarie8" value="8" > <br> 
<input type="checkbox" name = "salarie7" value="7" > <br> 
<input type="checkbox" name = "salarie6" value="6" > <br> 
<input type="checkbox" name = "salarie5" value="5" > <br> 
<input type="checkbox" name = "salarie4" value="4" > <br> 
<input type="checkbox" name = "salarie3" value="3" > <br> 
<input type="checkbox" name = "salarie2" value="2" > <br> 
<input type="checkbox" name = "salarie1" value="1" > <br> 
<input type="checkbox" name = "salarie0" value="0" > <br>

Modifié par biduletruck (31 Mar 2020 - 01:15)
Merci pour ton code, je vois le principe, mon problème c'est que je n'arrive pas a récupérer chacunes des value... Smiley ohwell

voici mon foreach :

if (!empty($_POST['$nom_prenom . $i'])){ Smiley biggol
foreach($_POST['$nom_prenom . $i'] as $noms_salaries)
{
// echo $noms_salaries;
// echo (array_values($noms_salaries));
}

et ma partie qui récupère les noms des salariés suivant ce qui a été renseigné par l'utilisateur :

<?php
$i = 1;
// On affiche chaque entrée une à une :
while ($donnees_noms_salaries = $affichage_noms_salaries->fetch() || $i >= 2)
{
$nom_prenom = $donnees_noms_salaries['nom'] . '&nbsp;' . $donnees_noms_salaries['prenom'];
?>
<input type="checkbox"
value="<? '$nom_prenom' . $i; ?>"
name="<? '$nom_prenom' . $i; ?>">
<?php echo $donnees_noms_salaries["nom"] . '&nbsp;' . $donnees_noms_salaries["prenom"]; ?></br >
<?php
$i++;
}
$affichage_noms_salaries->closeCursor(); // Termine le traitement de la requête
?></br >

voilà voilà Smiley ohwell

Et merci pour ton aide !
Modifié par melER5 (31 Mar 2020 - 10:21)
Ajoute ce petit bout de code apres


if (!empty($_POST['$nom_prenom . $i'])){ Smiley biggol
foreach($_POST['$nom_prenom . $i'] as $noms_salaries)
{
// echo $noms_salaries;
// echo (array_values($noms_salaries));
}



<?php
echo "<pre>;
var_dump($affichage_noms_salaries)
echo "</pre>;
?>


et publie le résultat (même partiellement) afin de voir la structure
Je n'ai pas utilisé ces fonctions depuis pas mal de temps, donc je ne garantis pas ce qui suit à 100%

Le code HTML que génère ton programme est du genre

<form ...>
   <input type="checkbox" name="employe1" value="Dupont Pierre">
   <input type="checkbox" name="employe2" value="Durand Valérie">
   <input type="checkbox" name="employe3" value="Eloi Henri">
   <input type="checkbox" name="employe4" value="Fernandez Maria">
   <input type="checkbox" name="employe5" value="Grünwald Michael">
   <input type="checkbox" name="employe6" value="Mortensen Eric">
</form>

Suppose que tu coches le 2, le 5 et le 6
Dans $_POST, qui est un array, tu vas récupérer:

$_POST = [
  'employe2' => 'Durand Valérie',
  'employe5' => 'Grünwald Michael',
  'employe6' => 'Mortensen Eric',
]

pas facile à récupérer
Par contre si ton HTML est

<form ...>
   <input type="checkbox" name="employe[]" value="Dupont Pierre">
   <input type="checkbox" name="employe[]" value="Durand Valérie">
   <input type="checkbox" name="employe[]" value="Eloi Henri">
   <input type="checkbox" name="employe[]" value="Fernandez Maria">
   <input type="checkbox" name="employe[]" value="Grünwald Michael">
   <input type="checkbox" name="employe[]" value="Mortensen Eric">
</form>

tu vas récupérer

$_POST = [
  'employe' => [ 'Durand Valérie', 'Grünwald Michael',  'Mortensen Eric']
]

Tu as donc un array nommé "employe' avec les 3 valeurs sélectionées, que tu peux facilement traiter en php par

foreach($_POST['employe'] as $employe) {
    .....
}
Biduletruck, voila ce que j'ai :
Notice: Undefined variable: noms_salaries in C:\wamp\www\Equipes.php on line 94
C:\wamp\www\Equipes.php:94:null

Oui, PapyJP, c'est exactement ce que j'avais fait au début, je récupérai seulement la valeur de la dernière coché. Cependant, faut-il absolument mettre un code dans le foreach si c'est juste pour obtenir les noms les un derrière les autres comme une chaîne dans une variable?

Merci pour votre aide! Smiley smile
J'ai testé ce que j'ai écrit ci-dessus, ça fonctionne.
Je ne comprends pas ta question: si tu demandes de cocher des noms de personnes, c'est bien que tu veux en faire quelque chose ?
Je ne comprends plus rien Smiley lol
maintenant en faisant comme ça ( name="employe[]" ), je ne récupère même plus un seul caractère...

if (!empty($_POST['employe'])){
foreach($_POST['employe'] as $noms_salaries)
{
// echo (array_values($noms_salaries));
}



#PLUS LOIN DANS LE CODE...#




<?php
//$i = 1;
// On affiche chaque entrée une à une :
while ($donnees_noms_salaries = $affichage_noms_salaries->fetch())
{
$nom_prenom = $donnees_noms_salaries['nom'] . '&nbsp;' . $donnees_noms_salaries['prenom'];
?>
<input type="checkbox"
value="<?php $donnees_noms_salaries['nom'] . '&nbsp;' . $donnees_noms_salaries['prenom']; ?>"
name="employe[]">




<?php echo $donnees_noms_salaries["nom"] . '&nbsp;' . $donnees_noms_salaries["prenom"]; ?></br >

<?php
//$i++;
}
$affichage_noms_salaries->closeCursor(); // Termine le traitement de la requête
?></br >

Vous auriez une idée? :|
Franchement, ça fait trop longtemps que j'ai pas codé et je rouille ...

Ont s'y prend mal:

1- Tu récupères tous les salariés dans ta bdd
2- Tu les affiches sous la forme d'un form avec un name différent (jusque là nous somme OK)
3- Tu veux afficher toutes les données des tes salariés pour faire un traitement derrière - ET là nous avons tout faux (à mon sens)

3-1 Dans l'absolue nous n'avons pas besoin de 50 infos dans le formulaire:
a- Le nom de l'équipe (OK name="equipe")
b- Le salarié, mais ce qui caractérise ton salarié n'est pas son nom mais bien son ID dans la BDD

3-2 Donc au lieu de mettre un NAME aléatoire autant y mettre l'ID de la BDD
Quand tu enverras les données par ton formulaire tu devrais avoir:

form method="POST">
    <label for=nomEquipe>Nom de l'équipe
        <input type="text" name="nomEquipe">
    </label></br>

    <label for=1>Dupont Pierre
        <input type="checkbox" name=1 value=1>
    </label></br>

    <label for=2>Durand Valérie
        <input type="checkbox" name=2 value=2>
    </label></br>

    <label for=3>Eloi Henri
        <input type="checkbox" name=3 value=3>
    </label>
    </br>
<button type="submit">test</button> <!-- pas de name ici pour ne pas l'avoir dans le résultat -->



$_POST['equipe'] => "nomEquipe"
$_POST[1] => 1
$_POST[2] => 2
$_POST[3] => 3
etc.


et voici la logique de travail ...



<?php

if(isset($_POST) )
{
    foreach ($_POST as $post)
    {
        if($post > 0)
        {
            echo $post . "</br>"; //ici tu peux mettre ta requete SQL pour mettre ton salarié en liaison avec ton équipe
        }else{
            echo"Le nom de l'équipe est : " . $_POST['nomEquipe'] . "</br>"; // ici tu peux ajouter te nouvelle équipe
        }
    }
}

?>
<hr>
<html>
    <body>
        <form action="#" method="post">
            <label for=nomEquipe>Nom de l'équipe
                <input type="text" name="nomEquipe">
            </label></br>

        <label for=1>Dupont Pierre
            <input type="checkbox" name=1 value=1>
        </label></br>

        <label for=2>Durand Valérie
            <input type="checkbox" name=2 value=2>
        </label></br>

        <label for=3>Eloi Henri
            <input type="checkbox" name=3 value=3>
        </label>
        </br>
            <button type="submit">test</button>
        </form>

    </body>
</html>



bon courage
Modifié par biduletruck (31 Mar 2020 - 15:04)
Merci de ta réponse, je vais m'attarder dessus parceque de toute façon j'en ai besoin alors... Smiley biggrin
Merci de votre aide !
Bon...j'ai essayé plusieurs choses...

if (!empty($_POST['noms_salaries'])){

foreach($_POST['noms_salaries'] as $les_salaries)
{
if($les_salaries > 0){

//echo $les_salaries . "</br>"; //ici tu peux mettre ta requete SQL pour mettre ton salarié en liaison avec ton équipe
$req = $pdo->prepare("SELECT equipes.id FROM equipes JOIN utilisateurs_particuliers ON equipes.ID_utilisateur = utilisateurs_particuliers.id");
$req->execute($noms_salaries);
$utilisateur_particulier = $req->fetch();
}else{echo $les_salaries . "</br>";
$erreurs['noms_salaries'] = "Vous n'avez pas choisis au moins deux salariés";
}
}
}

avec ça, il passe dans le else, et niveau $les_salaries j'ai bien les deux cochés, et le var dump m'affiche seulement le dernier...
azert qzesr (le nom et prénom)
hgfd sdfghj
C:\wamp\www\Equipes.php:107:string 'hgfd sdfghj' (length=12) (seulement le dernier dans ma variable, le var dump est en fin de else en cas d'erreur)

tout le script :

if (!empty($_POST['noms_salaries'])){

foreach($_POST['noms_salaries'] as $les_salaries)
{
if($les_salaries > 0){

//echo $les_salaries . "</br>"; //ici tu peux mettre ta requete SQL pour mettre ton salarié en liaison avec ton équipe
$req = $pdo->prepare("SELECT equipes.id FROM equipes JOIN utilisateurs_particuliers ON equipes.ID_utilisateur = utilisateurs_particuliers.id");
$req->execute($noms_salaries);
$utilisateur_particulier = $req->fetch();
}else{echo $les_salaries . "</br>";
$erreurs['noms_salaries'] = "Vous n'avez pas choisis au moins deux salariés";
}
}

}

if(empty($erreurs)){

$req = $pdo->prepare('INSERT INTO equipes (nom_equipe, noms_salaries, ID_utilisateur) VALUES (:nom_equipe, :noms_salaries, :ID_utilisateur)');

$nom_equipe = $_POST["nom_equipe"];
// $noms_salaries = $noms_salaries;
$ID_utilisateur = $_SESSION['auth']->id;

$req->execute(array(
':nom_equipe' => $nom_equipe,
':noms_salaries' => $les_salaries,
':ID_utilisateur' => $ID_utilisateur));

header('Location: Equipes.php');

exit();
}else{

echo '<div id="div_ajout_salarie" style="display: block">';
echo '<h1>Ajouter un Salarié</h1>';
echo '<div>';

if(!empty($erreurs['nom_equipe'])){
echo $erreurs['nom_equipe'] . '</br>';}

if(!empty($erreurs['noms_salaries'])){
echo $erreurs['noms_salaries'] . '</br>';}

echo '</div>';
echo '<form id="" action="" method="POST">';
echo '<label>Nom :</label></br >';
echo '<input type="text" name="nom"></br >';
echo '<label>Prénom :</label></br >';
echo '<input type="text" name="prenom"></br >';
echo '<label>Age :</label></br >';
echo '<input type="text" name="age"></br >';
echo '<label>Adresse :</label></br >';
echo '<input type="text" name="adresse"></br >';
echo '<label>Spécialité :</label></br >';
echo '<input type="text" name="specialite"></br >';
echo '<label>Taux horaire but :</label></br >';
echo '<input type="text" name="taux_horaire_brut"></br >';
echo '<input type="submit" name="" value="Ajouter">';
echo '<input type="reset" name="" value="annuler" onclick="cache_div(this, \'div_ajout_salarie\')">';
echo '</form></div>';

echo "<div>";
echo "<pre>";
var_dump($les_salaries);
echo "</pre>";
echo "</div>";
}
}




et si je remplace le
if($les_salaries > 0){
par
if($les_salaries){
il me met bien la nouvelle équipe, mais seulement avec le dernier salarié...

ca commence a me.... hein... Smiley lol
Modifié par melER5 (31 Mar 2020 - 18:44)
Pages :