Choix de lignes d'une table ?

Eléphanteau du PHP | 46 Messages

23 mai 2006, 10:47

Bonjour à tous !

Je voudrais savoir comment faire pour afficher des lignes d'un tableau qu'on aurait choisies (en les cochant par exemple).

Plus concretement :
- On fait l'affichage des données d'un table sous forme de tableau avec des cases à cocher devant chaque ligne
- On coche les cases correspondant aux lignes qu'on veut afficher
- On clique sur un bouton "afficher les cases cochées"
- On obtient un nouveau tableau avec uniquement les lignes qu'on a cochées avant

Merci d'avance pour le coup de main !

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

23 mai 2006, 11:25

Chaque case à cocher à pour valeur l'identifiant de la ligne en base, si elle est cochée cet identififiant est transmis

Il n'y a plus qu'à sélectionner uniquement les lignes qui correspondent à ces identifiants

Eléphanteau du PHP | 46 Messages

23 mai 2006, 12:07

Et concrètement ça donne quoi ? j'avais bien compris le principe, mais je n'arrive pas à le faire fonctionner

J'ai ça dans le code principal :
case 'choix_joueur':
        // Choix des joueurs pour la feuille de match
        $sql = "SELECT * from joueur";
        $resultat = $db->query($sql);
        $tpl->assign('nombre_enregistrements', $resultat->numRows());
        $resultat = $db->getAll($sql, DB_FETCHMODE_ASSOC );
        $tpl->assign('joueur', $resultat);
        $tpl->display('choix_joueur.tpl');
    break;
et ça dans la template :

Code : Tout sélectionner

{include file="header.tpl"} <h3>Liste des joueurs</h3> <table border="1"> <tr> <th bgcolor="#eeeeee">&nbsp</th> <th bgcolor="#eeeeee">Numéro</th> <th bgcolor="#eeeeee">Nom</th> <th bgcolor="#eeeeee">Prénom</th> <th bgcolor="#eeeeee">Position</th> </tr> {section name="un_joueur" loop=$joueur} <tr> <td> <form name="test" action="" method="post"> <input type="checkbox" name="selectedId[]" value="1" /> </form> </td> <td>{$joueur[un_joueur].numero}</td> <td>{$joueur[un_joueur].nom}</td> <td>{$joueur[un_joueur].prenom}</td> <td>{$joueur[un_joueur].position}</td> </tr> {sectionelse} <tr> <td><b><br>Aucun joueur trouvé</b></td> </tr> {/section} </table> <input type="submit" name="submit" value="Valider" /> {include file="footer.tpl"}
[/code]

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

23 mai 2006, 13:41

et bien c'est presque ça sauf que là-dedans :

Code : Tout sélectionner

<input type="checkbox" name="selectedId[]" value="1" />
à la place du 1, tu mets l'identifiant de chaque ligne récupérée

Ce qui fait que quand tu transmettras ton formulaire, tu récupéreras la liste des identifiants sélectionnés ;)

Eléphanteau du PHP | 46 Messages

23 mai 2006, 14:16

et bien c'est presque ça sauf que là-dedans :

Code : Tout sélectionner

<input type="checkbox" name="selectedId[]" value="1" />
à la place du 1, tu mets l'identifiant de chaque ligne récupérée

Ce qui fait que quand tu transmettras ton formulaire, tu récupéreras la liste des identifiants sélectionnés ;)
Ok et je fais comment pour afficher ce que j'ai récupéré ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

23 mai 2006, 14:23

Ok et je fais comment pour afficher ce que j'ai récupéré ?
Quoi ? Quand ? Tu pourrais être plus précis ?

Y'a pas de difficultés là :

1 - SELECT * FROM table
affichage des lignes via PHP, avec une checkbox qui a pour value l'identifiant de la ligne

--> transmission du formulaire
on récupère un tableau avec les identifiants
on crée une requête dynamiquement (concaténation des identifiants) pour qu'elle ressemble à ça :
SELECT * FROM table WHERE identifiant IN (1,2,3,4)

Eléphanteau du PHP | 46 Messages

23 mai 2006, 14:29

Ok et je fais comment pour afficher ce que j'ai récupéré ?
Quoi ? Quand ? Tu pourrais être plus précis ?

Y'a pas de difficultés là :

1 - SELECT * FROM table
affichage des lignes via PHP, avec une checkbox qui a pour value l'identifiant de la ligne

--> transmission du formulaire
on récupère un tableau avec les identifiants
on crée une requête dynamiquement (concaténation des identifiants) pour qu'elle ressemble à ça :
SELECT * FROM table WHERE identifiant IN (1,2,3,4)
Je voulais savoir comment faire pour récupérer ce que j'ai coché... Faut créer un nouveau case ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

23 mai 2006, 14:34

Je voulais savoir comment faire pour récupérer ce que j'ai coché... Faut créer un nouveau case ?
http://www.phpfrance.com/forums/voir_sujet-5220.php

Eléphanteau du PHP | 46 Messages

23 mai 2006, 16:04

Je voulais savoir comment faire pour récupérer ce que j'ai coché... Faut créer un nouveau case ?
http://www.phpfrance.com/forums/voir_sujet-5220.php
Ce petit tuto m'a bien aidé, mais je suis toujours bloqué...

je résume ma situation :
Ce que j'ai dans mon code pincipal
case 'choix_joueur':
    $sql = "SELECT * from joueur";
        $resultat = $db->query($sql);
        $tpl->assign('nombre_enregistrements', $resultat->numRows());
        $resultat = $db->getAll($sql, DB_FETCHMODE_ASSOC );
        $tpl->assign('joueur', $resultat);
        $tpl->display('choix_joueur.tpl');
    break;

    case 'affiche_choix_joueur':
         // vérifions que la variable a été transmise
         $tabJoueurs = (isset($_POST['joueur']))?$_POST['joueur']:null;
         echo "tabJoueur : ".$tabJoueurs;

         // bouclons sur le tableau qui a été transmis et affichons les valeurs sélectionnées
         if (!empty($tabJoueurs)) {
         foreach($tabJoueurs as $cle => $valeur) {
         echo $cle.' : '.$valeur.'<br>';
              }
        }
        $tpl->display('afficher_joueur.tpl');
    break;
Je fais un echo de tab joueurs et il m'affiche :
tabJoueur : Array0 : on
1 : on
2 : on

Pourtant, mon tableau affiche désespérément "Aucun joueur trouvé"

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

23 mai 2006, 16:45

Pourquoi as-tu
0 on
1 on
2 on

Est-ce que 0, 1 et 2 sont bien des identifiants (clé primaires) des lignes joueurs de ta table ?
A quoi cela sert d'avoir "on" puisque tu n'as QUE les cases de cochées de transmises ?

Je verrais plutôt ce genre de tableau :
Array (
0 => 6,
1 => 7,
2 => 12
);

0, 1 et 2 sont les indices de cellules
6,7 et 12 sont les identifiants des joueurs à récupérer

Où est la requête utilisant ces identifiants transmis ? Ici, tu ne les utilises pas

Eléphanteau du PHP | 46 Messages

24 mai 2006, 08:31

Pourquoi as-tu
0 on
1 on
2 on

Est-ce que 0, 1 et 2 sont bien des identifiants (clé primaires) des lignes joueurs de ta table ?
A quoi cela sert d'avoir "on" puisque tu n'as QUE les cases de cochées de transmises ?
Justement non. Si je coche 2 cases (n'importe ou), j'obtiens 0 et 1.
Je verrais plutôt ce genre de tableau :
Array (
0 => 6,
1 => 7,
2 => 12
);

0, 1 et 2 sont les indices de cellules
6,7 et 12 sont les identifiants des joueurs à récupérer
Oui c'est ça que j'aimerais avoir, mais pas moyen !
Où est la requête utilisant ces identifiants transmis ? Ici, tu ne les utilises pas
Euh... Je n'en ai pas. Ou en tout cas je ne vois pas comment faire cette requête... :oops:

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

24 mai 2006, 09:38

Déjà montre nous ton HTML :)
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Eléphanteau du PHP | 46 Messages

24 mai 2006, 10:09

Déjà montre nous ton HTML :)
Voila !

Code principal:
<?php

include "connexionSmarty.php";
include "connexion.php";

$db=connexion("mysql");

// Message si erreur de connexion DB
if (DB::isError($db)) {
    die ($db->getMessage());
}

/*
 * Programme principal 
 */

// Récupération de l'action utilisateur, avec priorité sur $_POST
if (isset($_POST['action'])) {
    $action = $_POST['action'];
} elseif (isset($_GET['action'])) {
    $action = $_GET['action'];
} else {
    $action = '';
}

if ($_POST['action'] == 'ajouter_encadrement_DB'){

   //intégrer la classe
   require_once('classe_personne.php');

   //Test
   //personne valide
   $nom = $_POST['nom'];
   $prenom = $_POST['prenom'];
}

if ($_POST['action'] == 'ajouter_joueur_DB'){

   //intégrer la classe
   require_once('classe_personne.php');

   //Test
   //personne valide
   $nom = $_POST['nom'];
   $prenom = $_POST['prenom'];
}

// Aiguillage en fonction de l'action utilisateur
switch($action) {

    case 'ajouter_encadrement':
        // Affichage du formulaire d'ajout
        $tpl->display('formulaire_ajout_encadrement.tpl');
    break;

    case 'ajouter_encadrement_DB' :
        require_once('classe_personne.php');
        $nom = $_POST['nom'];
        $prenom = $_POST['prenom'];
        $personne = new personne($nom, $prenom);
        $personne->estValide();
        $personneManager = new personneManager();
        $personneManager->add($personne);
        // Insertion effective de la personne de l'encadrement en BD
        $sql = 'INSERT INTO encadrement (nom, prenom, fonction)';
        $sql .= ' VALUES (';
        $sql .= '\'' . $_POST['nom']. '\',';
        $sql .= '\'' . $_POST['prenom']. '\',';
        $sql .= '\'' . $_POST['fonction']. '\'';
        $sql .= ');';
        $db->query($sql);
    // pas de break, pour afficher la liste de contact après l'ajout

    case 'afficher_encadrement':
    // Affichage de tous les joueurs
        $sql = "SELECT * from encadrement";
        $resultat = $db->query($sql);
        $tpl->assign('nombre_enregistrements', $resultat->numRows());
        $resultat = $db->getAll($sql, DB_FETCHMODE_ASSOC );
        $tpl->assign('encadrement', $resultat);
        $tpl->display('afficher_encadrement.tpl');
    break;

    case 'ajouter_joueur':
        // Affichage du formulaire d'ajout
        $tpl->display('formulaire_ajout_joueur.tpl');
    break;

    case 'choix_joueur':
    $sql = "SELECT * from joueur";
        $resultat = $db->query($sql);
        $tpl->assign('nombre_enregistrements', $resultat->numRows());
        $resultat = $db->getAll($sql, DB_FETCHMODE_ASSOC );
        $tpl->assign('joueur', $resultat);
        $tpl->display('choix_joueur.tpl');
    break;

    case 'affiche_choix_joueur':
         // vérifions que la variable a été transmise
         $tabJoueurs = (isset($_POST['joueur']))?$_POST['joueur']:null;
         echo "tabJoueur : ".$tabJoueurs;

         // bouclons sur le tableau qui a été transmis et affichons les valeurs sélectionnées
         if (!empty($tabJoueurs)) {
         foreach($tabJoueurs as $cle => $valeur) {
         echo $cle.' : '.$valeur.'<br>';
              }
        }
        $tpl->display('afficher_joueur.tpl');
    break;

    case 'supprimer':
        //supprimer();
        //afficher();
        $sql = "DELETE FROM contacts WHERE numero = ".$_REQUEST['numero'];
        print $_REQUEST['numero'];
        $resultat = $db->query($sql);
        if (DB::isError($resultat)) {
            print "Une erreur est survenue, contact non supprimé";
        } else {
            print "Contact supprimé";
        }
    break;
    
    case 'ajouter_joueur_DB' :
        // Insertion effective du joueur en BD
        $sql = 'INSERT INTO joueur (numero, nom, prenom, poste)';
        $sql .= ' VALUES (';
        $sql .= '\'' . $_POST['numero']. '\',';
        $sql .= '\'' . $_POST['nom']. '\',';
        $sql .= '\'' . $_POST['prenom']. '\',';
        $sql .= '\'' . $_POST['poste']. '\'';
        $sql .= ');';
        $db->query($sql);
    // pas de break, pour afficher la liste de contact après l'ajout

    default:
    case 'afficher_joueur':
        // Affichage de tous les joueurs
        $sql = "SELECT * from joueur";
        $resultat = $db->query($sql);
        $tpl->assign('nombre_enregistrements', $resultat->numRows());
        $resultat = $db->getAll($sql, DB_FETCHMODE_ASSOC );
        $tpl->assign('joueur', $resultat);
        $tpl->display('afficher_joueur.tpl');
    break;

}

?>
Template "choix":
{include file="header.tpl"}

<h3>Liste des joueurs à choisir</h3>
<form name="test" method="post" action="projet.php" >
<table border="1">
  <tr>
    <th bgcolor="#eeeeee">&nbsp</th>
    <th bgcolor="#eeeeee">Numéro</th>
    <th bgcolor="#eeeeee">Nom</th>
    <th bgcolor="#eeeeee">Prénom</th>
    <th bgcolor="#eeeeee">Position</th>
  </tr>
  
{section name="un_joueur" loop=$joueur}
  <tr>
    <td><input type="checkbox"/ name="joueur[]"></td>
    <td>{$joueur[un_joueur].numero}</td>
    <td>{$joueur[un_joueur].nom}</td>
    <td>{$joueur[un_joueur].prenom}</td>
    <td>{$joueur[un_joueur].poste}</td>
  </tr>
{sectionelse}
  <tr>
      <td>Aucun joueur trouvé</td>
  </tr>
{/section}
</table>
<input type="hidden" name="action" value="affiche_choix_joueur">
<input type="submit" name="submit" value="Valider" />
</form>
{include file="footer.tpl"}

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

24 mai 2006, 10:11

Oui, fais par étapes

Tu dois obtenir un truc qui ressemble à ce que je t'ai montré au début :

Code : Tout sélectionner

<input type="checkbox" name="selectedId[]" value="1" />
name : un nom avec des crochets vide, ce qui fait que les valeurs des cases cochées transmises seront dans un tableau auto-indexé

value : l'identifiant de chaque joueur

Fais déjà ça et on verra la suite

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

24 mai 2006, 10:12

ça ce n'est pas du HTML mais bon...

Ici :
<td><input type="checkbox"/ name="joueur[]"></td> 
tu n'as pas d'attribut "value", c'est pour ça qu'il met "on", par défaut

Tu dois rajouter un attribut "value", qui contiendra donc l'identifiant
A priori ça :
{$joueur[un_joueur].numero}