8792 sujets

Développement web côté serveur, CMS

salut à tous,

je cherche depuis quelques jours à gérer une colonne checkbox dans mon tableau (liste de pilotes, une case cochée signifiant qu'il est engagé au rallye, soit que la valeur de ma colonne "engage" est à 1. L'inverse étant bien sur "non engagé", soit valeur à 0 dans la base). En gros, ça me servirait a engager un pilote.
Pour l'instant, j'arrive à afficher ma base sans problème et renvoyer correctement les case cochées ou non:

upload/10889-copieecran.jpg

Par contre, je ne vois pas comment faire pour pouvoir cocher un ou + pilotes et ainsi engendrer une modif dans ma base (passage de 0 à 1 sur tous les champs correspondants). Et pouvoir voir à chaque rafraichissement de page des cases cochées ou non selon les 0 ou 1.

Mon code:



<?php
            // information pour la connection ` le DB
            $host = 'xxx';
            $user = 'xxx';
            $pass = 'xxx';
            $db = 'xxx';

            // connection ` la DB
            $link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
            mysql_select_db($db) or die ('Erreur :'.mysql_error());

            // requjte SQL qui compte le nombre total d'enregistrement dans la table et qui
            //ricuphre tous les enregistrements
            $select = 'SELECT * FROM engages';
            $result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
            $total = mysql_num_rows($result);

            echo "<br/>";
            echo 'Nombre de pilotes : '.$total;
            echo "<br/><br/>";

            // si on a recupere un resultat on l'affiche.
            if($total) {
                // debut du tableau
                echo '<table width="590">'."\n";
                // premiere ligne 
				echo '<tr>';
                echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Pilote</b></td>';
                echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Singe</b></td>';
                echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Moto</b></td>';
                echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Categorie</b></td>';
				echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Engage</b></td>';
                echo '</tr>'."\n";
                // lecture et affichage des risultats
                while($row = mysql_fetch_array($result)) {
                    echo '<tr>';
                    echo '<td bgcolor="#666666" align="left">'.$row["pilote"].'</td>';
                    echo '<td bgcolor="#666666" align="left">'.$row["singe"].'</td>';
                    echo '<td bgcolor="#666666" align="left">'.$row["moto"].'</td>';
                    echo '<td bgcolor="#666666" align="center">'.$row["categorie"].'</td>';
					echo '<td bgcolor="#666666" align="center">';					
					if ($row["engage"]=="1") { 
						echo '<input type="checkbox" name="modif[]" value="oui" checked="checked" >'; }
					else { 
						echo '<input type="checkbox" name="modif[]" value="non">'; };					
					echo '</td>';
                    echo '</tr>'."\n";
                }
                echo '</table>'."\n";
                // fin du tableau.
            }
            else echo 'Pas d\'enregistrements dans cette table...';

            // on libhre le risultat
            mysql_free_result($result);

?>


Merci de votre aide
Modifié par el fab (03 Mar 2008 - 15:16)
Bonjour,

Si j'ai bien saisie, tu n'as pas de problème pour afficher le tableau, mais tu n'arrive pas à modifier le statut "engagé/non-engagé" pour les pilotes ?

Si c'est ça ton problème il te suffit de remplacer ton bout de code par :


echo '<tr>';
    echo '<td bgcolor="#666666" align="left">'.$row["pilote"].'</td>';
    echo '<td bgcolor="#666666" align="left">'.$row["singe"].'</td>';
    echo '<td bgcolor="#666666" align="left">'.$row["moto"].'</td>';
    echo '<td bgcolor="#666666" align="center">'.$row["categorie"].'</td>';
    echo '<td bgcolor="#666666" align="center">';
    if ($row["engage"]=="1")
    {
        echo '<input type="checkbox" name="modif['.$row["pilote_id"].']" value="oui" checked="checked" >';
    }
    else
    { 
        echo '<input type="checkbox" name="modif['.$row["pilote_id"].']" value="non">';
    }
    echo '</td>';
echo '</tr>'."\n";



En supposant que tu ai un "pilote_id" biensur Smiley rolleyes

Cordialement,
Polo
Merci Polo,

Mon id_pilote s'appelle "index".
Le pb est que je ne vois pas comment envoyer les données à la table .. avec $_POST ?
Je pense qu'il faut une boucle mais comment envoyer tout ça en cliquant sur un submit une fois les cases cochées/décochées ?

Je galère
Modifié par el fab (29 Feb 2008 - 19:06)
Bonjour,

Comme l'as dit Polo il suffit d'utiliser la solution qu'il a donnée. Car ainsi tu vas pouvoir avoir les information sur l'engagement du pilote dans ta course avec son id_pilote.

Ensuite après ton submit sur ta page de traitement comme tu l'as dit toi même, il suffit de faire une boucle pour vérifier l'état de chaque pilote et de le modifier dans ta base de donnée.

Donc pour ta boucle tu as juste a refaire la même requête et de faire une boucle pour vérifier et changer chaque état de tes pilotes.

Pour avoir chaque l'état d'un de tes coureurs tu as juste a l'appeler comme cela


$_POST['modif['.$row["pilote_id"].']'];


Et avec cela tu auras son état et tu auras plus que a traité.
Bonjour,

a écrit :
Le pb est que je ne vois pas comment envoyer les données à la table .. avec $_POST ?


Humm... Pour sauvegarder les changements, il te faut un script PHP qui récupère le $_POST, qui parcours ce dernier pour construire une requête SQL de type UPDATE (ou REPLACE) et ensuite qui exécute cette requête.

Je n'avais pas fait attention lors de mon premier post mais tu ne semble pas avoir de balise "form" ni de bouton de sauvegarde dans ton code, il faut que tu entoure ton tableau avec ça :


<form action="la_page_de_sauvegarde.php" method="post">
... <= tout le tableau
<input type="submit" />
</form>


Ensuite dans la_page_de_sauvegarde.php :

$idz_qui_sont_engage = array_keys($_POST["modif"]);

/* Ceux qui apparaissent dans $_POST["modif"] sont ceux qui sont engagé */
$sql = "UPDATE engages SET engage=1 WHERE index IN (".implode(",", $idz_qui_sont_engage.")";
mysql_query($sql);

/* Donc tous ceux qui ne sont pas dans la liste sont non-engagé */
$sql = "UPDATE ma_table SET engage=0 WHERE index NOT IN (".implode(",", $idz_qui_sont_engage.")";
mysql_query($sql);


Voilà. Bon c'est pas la seule façon de faire mais c'est la plus courte que j'ai trouvé Smiley biggol

Ciao !
Salut, merci à tous les 2 de m'avoir répondu !

voilà ou j'en suis..je sens que j'y suis presque.

test.php:
<?php
include("connexion.php"); 

// requete SQL qui compte le nombre total d'enregistrement dans la table et qui
//recupere tous les enregistrements
$select = 'SELECT * FROM engages';
$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
$total = mysql_num_rows($result);
echo "<br/>";
echo 'Nombre de pilotes : '.$total;
echo "<br/><br/>";

// si on a recupere un resultat on l'affiche.
if($total) {

	// debut du tableau
	echo '<form action="sauve_engages.php" method="post">
	<table width="590">'."\n";

	// premiere ligne 
	echo '<tr>';
	echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Pilote</b></td>';
	echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Singe</b></td>';
	echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Moto</b></td>';
	echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Categorie</b></td>';
	echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Engage</b></td>';
	echo '</tr>'."\n";

	// lecture et affichage des résultats
	while($row = mysql_fetch_array($result)) {
		echo '<tr>';
		echo '<td bgcolor="#666666" align="left">'.$row["pilote"].'</td>';
		echo '<td bgcolor="#666666" align="left">'.$row["singe"].'</td>';
		echo '<td bgcolor="#666666" align="left">'.$row["moto"].'</td>';
		echo '<td bgcolor="#666666" align="center">'.$row["categorie"].'</td>';
		echo '<td bgcolor="#666666" align="center">';					
		if ($row["engage"]=="1") { 
			echo '<input type="checkbox" name="modif[]" value="oui" checked="checked" >'; }
		else { 
			echo '<input type="checkbox" name="modif[]" value="non">'; };					
		echo '</td>';
		echo '</tr>'."\n";
	}
	echo '</table>'."\n";
	echo '<input type="submit" name="OK" /></form>';
	// fin du tableau.

}
else {echo 'Pas d\'enregistrements dans cette table...';}

// on libère le résultat
mysql_free_result($result);
?>


et sauve_engages.php

<?php
include("connexion.php"); 
$idz_qui_sont_engage = array_keys($_POST["modif"]);
//Ceux qui apparaissent dans $_POST["modif"] sont ceux qui sont engagé 
$recherche=implode(",", $idz_qui_sont_engage);
$sql = "UPDATE engages SET engage=1 WHERE index IN (".$recherche.")";
mysql_query($sql) or die ('Erreur : '.mysql_error() );
// Donc tous ceux qui ne sont pas dans la liste sont non-engagé 
$sql = "UPDATE engages SET engage=0 WHERE index NOT IN (".$recherche.")";
mysql_query($sql) or die ('Erreur : '.mysql_error() );
?>


le retour que j'ai est:
a écrit :
Erreur : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index IN (0)' at line 1


Je n'arrive pas a trouver ou se situe le pb de syntaxe..
Modifié par el fab (03 Mar 2008 - 12:25)
rebonjour,

Regarde le premier poste de Polo, il te manque dans ta page de teste le fait d'ajouter l'id de tes pilotes dans le checkbox.

Car la toutes tes checkbox possède le même name donc tu ne peux pas les différencier.

Essai de rajouter ceux que t'a montrer Polo est normalement cela devrai marcher.
pardon pour cet oubli dans mon copier/coller , mais j'ai toujours ce pb
a écrit :
Erreur : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index IN (1)' at line 1


test.php
<?php
include("connexion.php"); 

// requete SQL qui compte le nombre total d'enregistrement dans la table et qui
// recupere tous les enregistrements
$select = 'SELECT * FROM engages';
$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
$total = mysql_num_rows($result);
echo "<br/>";
echo 'Nombre de pilotes : '.$total;
echo "<br/><br/>";

// si on a recupere un resultat on l'affiche.
if($total) {

	// debut du tableau
	echo '<form action="sauve_engages.php" method="post">
	<table width="590">'."\n";

	// premiere ligne 
	echo '<tr>';
	echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Pilote</b></td>';
	echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Singe</b></td>';
	echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Moto</b></td>';
	echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Categorie</b></td>';
	echo '<td bgcolor="#FF9900" align="center" style="color:#000"><b>Engage</b></td>';
	echo '</tr>'."\n";

	// lecture et affichage des résultats
	while($row = mysql_fetch_array($result)) {
		echo '<tr>';
		echo '<td bgcolor="#666666" align="left">'.$row["pilote"].'</td>';
		echo '<td bgcolor="#666666" align="left">'.$row["singe"].'</td>';
		echo '<td bgcolor="#666666" align="left">'.$row["moto"].'</td>';
		echo '<td bgcolor="#666666" align="center">'.$row["categorie"].'</td>';
		echo '<td bgcolor="#666666" align="center">';
		if ($row["engage"]=="1"){
			echo '<input type="checkbox" name="modif['.$row["index"].']" value="oui" checked="checked" >';
		}
		else { 
			echo '<input type="checkbox" name="modif['.$row["index"].']" value="non">';
		}
		echo '</td>';
		echo '</tr>'."\n";
	}
	echo '</table>'."\n";
	echo '<input type="submit" name="OK" /></form>';
	
	// fin du tableau.
}
else {echo 'Pas d\'enregistrements dans cette table...';}

// on libère le résultat
mysql_free_result($result);
?>
peut tu faires un echo de $sql dans ta page de vérification. Car sans doute que ceux que tu envois n'est pas bon...

Affiche tes deux requêtes et regarde si c'est bien les id de tes engagés.
si si ce que l'on envoie est bon: si je coche les lignes 2 et 3 il m'affiche (avec un echo $sql):
a écrit :
UPDATE engages SET engage=1 WHERE index IN (2,3)Erreur : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index IN (2,3)' at line 1

Modifié par el fab (03 Mar 2008 - 14:26)
Bon cela devrai être la fin Smiley cligne

un conseil, n'utilise jamais des mots générique comme index car mysql doit l'utilisé pour une raison spécifique... donc lors de ta requête il ne comprend pas pourquoi tu l'utilises ici.

Il suffit juste de rajouter des `` et pas des ' ' il faut mettre le altgr+la touche 7 pour l'avoir comme ceci `index`

Tu fais cela sur tes deux requête et cela devrai marcher maintenant.
merci, ça marche nickel !

reste juste a tester si aucune case n'est cochée .... et rajouter de quoi cocher toutes les checkboxes ..

MERCI