Récupérer checkbox

Invitous
Invité n'ayant pas de compte PHPfrance

19 avr. 2012, 12:35

Bonjour,

J'ai une fonction contact assez spéciale qui enregistre les messages dans la BDD pour les retourner dans une page de mon administration.
J'ai mis une checkbox à chaque message avec l'option en liste déroulante « Répondre aux messages sélectionnés ».

1 - On sélectionne les messages
2 - On atterri sur un formulaire (ou on peut remplir un sujet/message)
3 - On envoi le formulaire, l'e-mail est envoyé aux adresses e-mail ayant écrit les messages sélectionnes.

Soucis :
Je bloque au niveau de la mise en place, il faut que je récupère tous les messages ayant été cochés et que je reprenne les adresses e-mail associées afin d'envoyer le mail.
Voici la partie intéressante de mon script (je ne met pas tout par soucis de lisibilité) :
if ($err != 1)	{

for($i = 0, $n = count($_POST["option"]); $i < $n; $i++){

$id_cherche = mysql_query("SELECT * FROM contact WHERE id ='". intval($_POST["option"][$i]) ."'"); }


while ($reponse = mysql_fetch_array($id_cherche)) {
$to = $reponse['email'];

// On envoi l'e-mail !
mail($to,$subject,$message,$headers); } 
echo '<div class="success-box">Le message a été envoyé avec succès aux e-mail séléctionnées</div>';  }
Les checkbox prennent la valeur de l'ID du message :
input type="checkbox" name="option[]" value="'. $contact['id'] .'" />
Voilà, j'éspère que j'ai été assez clair, si vous avez besoin d'informations complémentaires... !
Merci d'avance, là je bloque vraiment ^^ :P

ViPHP
ViPHP | 2577 Messages

19 avr. 2012, 13:34

Un truc dans ce genre
<?PHP
if (isset($_POST['option'])    // Au moins une option coché
{
    foreach ($_POST['option'] as $id)
    {
        // traitement du contact dont l'identifiant est $id
    }
}
else
{
    // pas de destinataire coché
}
?>

Invitous
Invité n'ayant pas de compte PHPfrance

19 avr. 2012, 14:16


// Si le formulaire d'envoi d'e-mail a été envoyé !
	if (isset($_POST['env'])) {
	
// On vérifie que le champ sujet est bien remplis.
if((strlen($_POST['sujet']) < 5) || (strlen($_POST['sujet']) > 30)) {
$show_err[] = 'Le sujet doit être compris entre 5 et 30 caractères !<br /><br />';
$err = 1;
}

// On vérifie que le champ message est bien remplis.
if((strlen($_POST['message']) < 10) || (strlen($_POST['message']) > 3000)) {
$show_err[] = 'Le message doit être compris entre 5 et 3000 caractères !<br /><br />';
$err = 1;
}	

if ($err != 1)	{

// Si une option au moins a été cochée !
if (isset($_POST['option'])) {

$subject = $_POST['sujet'];
$message = $_POST['message'];

// On prépare les en-têtes.
### ICI MES HEADERS ###

foreach ($_POST['option'] as $id) {
$id_cherche = mysql_query("SELECT * FROM contact WHERE id ='$id'"); }

while ($reponse = mysql_fetch_array($id_cherche)) {
$to = $reponse['email'];

// On envoi l'e-mail !
@mail($to,$subject,$message,$headers); } 
echo '<div class="success-box">Le message a été envoyé avec succès aux e-mail séléctionnées</div>'; } 

else { echo '<div class="error-box">Aucune case n\'est cochée !</div>'; } }

else {
	echo '<div class="error-box">';
	echo join('',$show_err);
	echo '</div>'; }	}
Voilà ce que j'ai mis, mais cela ne marche pas car le mail n'est pas envoyé !
Une idée ? :oops:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 avr. 2012, 14:59

enlève l'@ devant la fonction mail.

il ne faut jamais l'utiliser quand on développe !!


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 6 Messages

19 avr. 2012, 15:26

Je l'ai enlevé et rien n'apparait, je crois que le soucis se trouve peut-être dans le reste de mon code. :(
Voici donc mon code dans son intégralité (mais toujours simplifié) :

### Le code a été retiré ###

Mais là je bloque je bloque !
Peut-être le soucis est du aux " isset" non ? :oops:
En faite le truc c'est que je dois valider un formulaire dans un autre formulaire donc c'est peut-être ça aussi..
Modifié en dernier par Invitous le 19 avr. 2012, 17:30, modifié 1 fois.

ViPHP
ViPHP | 2577 Messages

19 avr. 2012, 16:09

Ajoute des echo "toto 1" (puis toto2, toto3...) dans ton code pour voir ou passe le programme.
Et affiche le contenu de quelques variables.

Si tu présentais ton code un peu mieux (indentation), il serait plus facile de le lire.

Petit nouveau ! | 6 Messages

19 avr. 2012, 17:37

1 - J'ai corrigé toutes les fautes syntaxiques.
2 - J'ai mis en place l'indentation.

J'ai essayé de mettre des « echo » par-ci par-là mais aucuns d'eux ne s'affichait. Ce qui démontre que quelque chose ne va pas, vu que quand je valide mon formulaire, j’obtiens une page vide (ni message d'erreurs ou de succès). Peut-être que finalement le soucis ne se trouve pas dans le SQL mais dans la façon dont j'ai formé le PHP.

Je me demandais si ce n'était pas à cause du « if (isset($_POST['env'])) » qui est dans le « if(isset($_POST['submit'])) ».
Vu que lorsqu'on valide le « env » nous ne sommes plus dans le « submit », non :?:

Donc voici le code, enfin la partie du code qui nous intéresse :
<?php

    if(isset($_POST['submit']))
    {

/*
****************************************************
*     II. Répondre aux messages sélectionnés       *
****************************************************
*/   
        if ($_POST['choix'] == 2)
        {
            
            If(mysql_num_rows($requete) < 1)
            {
                echo '<div class="error-box">Suppression impossible : Aucune entrée correspondante à cet ID n\'a été trouvée dans la base de donnée.</div>';
                $err = 1;
            }

            
            if ($err != 1)
            {
                
                if (isset($_POST['env']))
                {
                    // On vérifie que le champ sujet est bien remplis.
                    
                    if((strlen($_POST['sujet']) < 5) || (strlen($_POST['sujet']) > 30))
                    {
                        $show_err[] = 'Le sujet doit être compris entre 5 et 30 caractères !<br /><br />';
                        $err = 1;
                    }

                    // On vérifie que le champ message est bien remplis.
                    
                    if((strlen($_POST['message']) < 10) || (strlen($_POST['message']) > 3000))
                    {
                        $show_err[] = 'Le message doit être compris entre 5 et 3000 caractères !';
                        $err = 1;
                    }

                    
                    if ($err != 1)
                    {
                        
                        if (isset($_POST['option']))
                        {
                            $subject = $_POST['sujet'];
                            $message = $_POST['message'];

                            $headers = 'From:  [email protected]' . "\n";
                            $headers .= 'MIME-Version: 1.0' . "\n";
                            $headers .= 'Content-type: text/plain; charset=utf-8'."\n";
                            $headers .= 'Content-Transfer-Encoding: 8bit' . "\n";
                            $headers .= 'Priority: urgent' . "\n";
                            $headers .= 'X-Priority: 1' . "\n";
							
                            foreach ($_POST['option'] as $id)
                            {
                                $id_cherche = mysql_query("SELECT * FROM contact WHERE id ='$id'");
                            }

                            while ($reponse = mysql_fetch_array($id_cherche))
                            {
                                $to = $reponse['email'];
                                mail($to,$subject,$message,$headers);
                            }

                            echo '<div class="success-box">Une réponse a été envoyée aux e-mails des messages sélectionnés.</div>';
                        }
                        else
                        {
                            echo '<div class="error-box">Désolé, mais aucune case n\'est cochée, vous ne pouvez donc pas « répondre ».</div>';
                        }

                    }
                    else
                    {
                        echo '<div class="error-box">';
                        echo join('',$show_err);
                        echo '</div>';
                    }

                }

            }
            else
            {
                echo '<div class="error-box">Une erreur inconnue s\'est produite et la réponse n\'a pas pu être distribuée.</div>';
            }

            
            if (!isset($_POST['env']))
            {
                ?>
				
<div class="ma-class">
<form action="members.php?page=admin&sp=contact" id="mon-id" method="post">

<div class="ma-class">RÉPONSE AUX MESSAGES</div>

<div>
<label for="sujet">Sujet :</label><input type="text" id="sujet" name="sujet"/>
</div>

<div style="margin-top: 12px,">
<label for="message">Message :</label><textarea name="message" rows="13" cols="40" id="message"></textarea>
</div>

<div class="ma-class">
<input type="submit" name="env" value="Envoyer"/>
</div>

</form>
</div>

<?php 
            }

        }

}

### Ici se trouve la partie HTML basique du formulaire, les cases à cocher et les messages ###


ViPHP
ViPHP | 2577 Messages

19 avr. 2012, 17:53

En ajoutant var_dump($_POST) tu verrais quels éléments sont renseignés.

Eventuellement tu peux aussi ajouter des var_dump de variables avant un if ou dans une boucle.

Cette boucle est bizarre puisque tu renseigne la meme variable qui s'écrase d'une itération à l'autre.
foreach ($_POST['option'] as $id)
{
      $id_cherche = mysql_query("SELECT * FROM contact WHERE id ='$id'");
}
Edit : étendre cette boucle au while qui suit.

Petit nouveau ! | 6 Messages

19 avr. 2012, 19:01

J'ai bien étendu la boucle, mais cela n'a rien changé. Néanmoins je la laisse comme ça car cela me semble plus logique !

J'ai ensuite essayé le système des var_dump($_POST); un peu partout.
  • Après avoir coché la case pour sélectionner un message et cliquer sur valider pour atterrir au formulaire cela m'a donné ceci :
    array(3) { ["option"]=> array(1) { [0]=> string(2) "24" } ["choix"]=> string(1) "2" ["submit"]=> string(5) "Aller" }
  • Dans les boucles, et les messages d'erreurs, rien ne se manifeste.
De plus, avec le code que j'ai actuellement, si aucune case est cochée aucune erreur est retournée.
Tel est le soucis, quand on valide le formulaire d'envoi d'e-mail on atterrit sur une page sans message de succès ou d'erreur :evil:

Pour la citation là, quelqu'un comprends quelque chose car j'ai un peu de mal à déchiffrer :oops:

ViPHP
ViPHP | 2577 Messages

19 avr. 2012, 21:00

array(3) { ["option"]=> array(1) { [0]=> string(2) "24" } ["choix"]=> string(1) "2" ["submit"]=> string(5) "Aller" }
$_POST a 3 éléments option, choix et submit

Donc pas de $_POST['env']

Edit : tu testes si $_POST['env'] existe, et tu ne l'utilises pas, bizarre...

Petit nouveau ! | 6 Messages

19 avr. 2012, 21:26

$_POST['env'] c'est une fois que j'ai validé pour envoyer l'e-mail.
Le soucis c'est que quand je valide ce formulaire, ben atterrit sur une page sans rien de noté (en faite si j'avais pas mis (!isset($_POST['env'])) plus bas je serais redirigé vers la page principale ou on sélectionne les messages). Donc normal que $_POST['env'] apparaisse pas car malgré que j'ai posé des var_dump($_POST); partout ils ne s'affichent pas une fois le formulaire validé. :x

--------------

Je viens de positionner le var_dump($_POST); hors du if(isset($_POST['submit'])).
Et quand je valide le formulaire d'e-mail j’obtiens ceci :
array(3) { ["sujet"]=> string(6) "conteudusujet" ["message"]=> string(12) "contenudumessage" ["env"]=> string(7) "Envoyer" }
Donc c'est bien repris par $_POST. 8-|
Mais je vois pas ['choix'], c'est normal ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 avr. 2012, 22:36

C'est quoi le vrai formulaire au finale parce que la y a aucun champ "choix" dans les bout de code parsemer.

S'il s'agit d'une checkbox lorsque qu'elle n'est pas cochée elle n'existe pas, idem pour un radio.


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 6 Messages

19 avr. 2012, 23:02

Je me suis trompé, je voulais dire « option » (oui vu que la checkbox est name="option[]").
Le truc c'est que là elle est cochée et n'apparait pas !

-------------

Il se peut que ce soit du au faite qu'après avoir sélectionné les messages et appuyé sur « submit » puis avoir remplis le formulaire d'envoi d'e-mail et avoir appuyé cette fois sur « env » là variable $_POST[''option]; a pu être perdu entre les deux :?:

Petit nouveau ! | 6 Messages

20 avr. 2012, 20:37

Re !

Donc j'ai un peu replacé des var_dump par-ci par-là.. :P

Et il se trouve qu'après avoir sélectionné les messages, cliqué sur valider on est toujours dans submit (rien d'anormal jusque-là). Mais lorsqu'on remplir le formulaire suivant, on sort de submit donc on perd les messages sélectionnés. Voici un schéma simplifié de la construction :
if(isset($_POST['submit']))
{

Là on met tous le traitement + ceci :

if (isset($_POST['env'])) {

Là on met le traitement des messages sélectionnés

} Fin de "env"

} Fin de "submit"
Le soucis vient donc de la façon dont le php est positionné..

Par ce que là ce que j'essayais de faire, c'est de traiter un formulaire dans un autre formulaire :?