Choix de lignes d'une table ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 mai 2006, 14:41

Oui tu affiches $valeurs à chaque tour donc c'est normal

Sors le echo de ta boucle, tu verras la valeur finale de ta chaîne :
foreach($tabJoueurs as $cle => $valeur) {
   $valeurs .= $valeur.", ";
   //echo $cle.' : '.$valeur.'<br>';
} 
echo $valeurs;

Eléphanteau du PHP | 46 Messages

26 mai 2006, 14:53

Oui la ça marche sans problème !

Mais j'ai une erreur au niveau de ma requête. J'ai ce code :
case 'affiche_choix_joueur':
         // vérifions que la variable a été transmise
         $tabJoueurs = (isset($_POST['joueur']))?$_POST['joueur']:null;

         // bouclons sur le tableau qui a été transmis et affichons les valeurs sélectionnées
         if (!empty($tabJoueurs)) {
         foreach($tabJoueurs as $cle => $valeur) {
           $valeurs .= $valeur." ";
              }
         echo $valeurs; //l'écho me renvoie bien uniquement les numéros choisis
         }

        // requête SQL qui selectionne les joueurs dont les numeros sont dans $valeurs
        $sql = "SELECT * from joueur WHERE numero IN (".$valeurs.")";
        $resultat = $db->query($sql);
        $resultat = $db->getAll($sql, DB_FETCHMODE_ASSOC );
        $tpl->assign('joueur', $resultat);
        $tpl->display('afficher_joueurs_choisis.tpl');
    break;
Le tableau "résultat" s'affiche mais avec ça dans la première case :
Fatal error: Cannot use object of type DB_Error as array in C:\wamp\www\projet_personnel\template\templates_c\%%B5^B54^B54DF555%%afficher_joueurs_choisis.tpl.php on line 44

Et je ne vois pas d'ou peut venir ce DB_Error... Ma requête SQL n'est pas correcte ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 mai 2006, 14:55

Alors attends... avant d'exécuter par PHP, fais un
echo $sql;
copie le code SQL affiché et teste le directement sur la base (via phpMyAdmin par exemple)
Et regarde si la requête fonctionne et renvoie ce que tu veux

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 mai 2006, 14:59

Et ensuite regarde ces lignes attentivement :
$resultat = $db->query($sql);
$resultat = $db->getAll($sql, DB_FETCHMODE_ASSOC ); 
Est-ce que tu ne vois pas quelques incohérences ? ;)

Eléphanteau du PHP | 46 Messages

26 mai 2006, 15:17

Donc avec l'echo de $sql, j'obtiens ça :
SELECT * from joueur WHERE numero IN (2 4 )

Je copie cette requête SQL dans PHPMyAdmin et il m'indique bien une erreur. Je crois que ça viens de ce qui est entre parenthèse (la syntaxe ne dois pas être bonne)

Et en regardant le code de plus près, je me suis rendu compte qu'il manquait un";" à la fin de la requête, et les virgules entre les différents nombres.

J'ai résolu le problème du point virgule j'ai une requête qui fonctionne dans PHPmyAdmin, mais je n'arrive pas à enlever la virgule qui reste après le dernier chiffre. (à cause de $valeurs .= $valeur.", ";)
Et ensuite regarde ces lignes attentivement :
PHP:
$resultat = $db->query($sql);
$resultat = $db->getAll($sql, DB_FETCHMODE_ASSOC );

Est-ce que tu ne vois pas quelques incohérences ? Wink
Je crois que la seconde ligne est en trop... J'ai récupéré ce code de la version "afficher" d'origine et je n'ai pas fait gaffe à ça...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 mai 2006, 15:31

Code : Tout sélectionner

SELECT * from joueur WHERE numero IN (2 4 )
Effectivement, il manque une virgule entre 2 et 4, ce qui est bizarre puisque elle devrait être rajoutée dans ta boucle.
Tu dois effectivement faire une petite manip pour enlever la dernière virgule qui sera en trop. Regarde la fonction substr(), qui te permet de tronquer une chaîne. (ce point correspond à ce que tu veux faire : Exemple 3. Utiliser une valeur négative avec length)

Le point-virgule à la fin de la requête n’est pas obligatoire. Et il est même interdit pour une requête qui doit être exécuté via mysql_query(), puisque tu ne peux exécuter qu’une requête à la fois par cette fonction et il provoquera une erreur s’il rencontre un ;

Au sujet de ces lignes, voici ce que je vois moi :
$resultat = $db->query($sql);
$resultat = $db->getAll($sql, DB_FETCHMODE_ASSOC );
première ligne : tu exécutes ta requête SQL qui est dans $sql via ta fonction, et tu renvoies le jeu de résultats brut dans $resultat => OK

deuxième ligne : tu devrais normalement ici traiter le jeu de résultats précédent ($resultat) et renvoyer le tout dans une autre variable pour traiter les valeurs.
Hors tu réutilises ton code SQL ($sql) et tu renvoies le résultat dans la même variable.

Je pense que ceci conviendrait mieux :
$resultat = $db->query($sql);
$resultat_bis = $db->getAll($resultat, DB_FETCHMODE_ASSOC );
Tu peux renommer $resultat_bis pour une variable plus parlante.

Eléphanteau du PHP | 46 Messages

26 mai 2006, 15:49

C'est vrai que le point virgule n'est pas nécessaire. J'ai testé sans et ça marche aussi.

J'ai utilisé la fonction que tu m'as montré ($valeurs = substr($valeurs, 0, -2);) et j'ai bien la virgule et l'espace qui suivent le dernier caractère qui disparaissent !

Ma requête SQL est correcte.
Au sujet de ces lignes, voici ce que je vois moi :
PHP:
$resultat = $db->query($sql);
$resultat = $db->getAll($sql, DB_FETCHMODE_ASSOC );


première ligne : tu exécutes ta requête SQL qui est dans $sql via ta fonction, et tu renvoies le jeu de résultats brut dans $resultat => OK

deuxième ligne : tu devrais normalement ici traiter le jeu de résultats précédent ($resultat) et renvoyer le tout dans une autre variable pour traiter les valeurs.
Hors tu réutilises ton code SQL ($sql) et tu renvoies le résultat dans la même variable.

Je pense que ceci conviendrait mieux :
PHP:
$resultat = $db->query($sql);
$resultat_bis = $db->getAll($resultat, DB_FETCHMODE_ASSOC );

Tu peux renommer $resultat_bis pour une variable plus parlante.
Pour ce que tu m'as indiqué ici, j'ai changé la seconde ligne, mais ça ne fonctionne pas. J'ai donc rééssayé avec ce que j'avai au départ et ça marche !

Je voudrais juste encore savoir s'il était possible de faire un test sur le tableau obtenu (vérifier s'il y a 11 joueurs sélectionnés et si un est gardien de but)

Je fais ça au niveau de la requête SQL ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 mai 2006, 15:58

$resultat = $db->query($sql);
$resultat = $db->getAll($sql, DB_FETCHMODE_ASSOC ); 
Alors si ceci marche je dirais qu'il y a une ligne qui ne sert à rien, la première... puisque tu écrases $resultat au deuxième passage, et vu que tu utilises dans chacun ta requête $sql, je pense que ces deux fonctions font à peu de choses près la même chose. C'est à dire exécuter une requête SQL sur la base, donc regarde la doc de ta classe pour vérifier laquelle te convient le mieux.

Sinon pour ton test de gardien de but je ne sais pas, ça dépend comment c'est indiqué et ce que tu veux faire ensuite.

Eléphanteau du PHP | 46 Messages

26 mai 2006, 16:06

Donc le premier test à faire, c'est compter le nombre de cases qui ont été cochées. J'aurais bien aimé faire un compteur du genre :
Il vous reste X cases à chocher en dessous du formulaire, à coté du bouton valider... et pourquoi pas n'afficher le bouton "valider" uniquement lorsque 11 cases sont cochées...
C'est possible ?

Ou il vaut mieux indiquer un message du genre "vous devez sélectionner 11 joueurs" avec le réaffichage du formulaire ?

Et pour le gardien de but, il faudrait (avec une requete SQL par exemple) compter le nombre de joueurs "WHERE poste = gardien" et si le résultat est différent de 1, afficher une erreur avec le formulaire

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 mai 2006, 16:16

Donc le premier test à faire, c'est compter le nombre de cases qui ont été cochées. J'aurais bien aimé faire un compteur du genre :
Il vous reste X cases à chocher en dessous du formulaire, à coté du bouton valider... et pourquoi pas n'afficher le bouton "valider" uniquement lorsque 11 cases sont cochées...
C'est possible ?
Oui, tout est possible en théorie, faut trouver le moyen de le faire :D
Compteur : Javascript
Affichage du bouton : pareil
Ou il vaut mieux indiquer un message du genre "vous devez sélectionner 11 joueurs" avec le réaffichage du formulaire ?
Dans l'idéal les 2, car quelqu'un qui désactive le JS pourra esquiver la vérification
[/quote]
Et pour le gardien de but, il faudrait (avec une requete SQL par exemple) compter le nombre de joueurs "WHERE poste = gardien" et si le résultat est différent de 1, afficher une erreur avec le formulaire
Tu peux effectivement faire une requête pour vérifier cela, et n'exécuter l'autre que si c'est bon, ou faire ce test en PHP dans les résultats, là c'est à toi de voir

Eléphanteau du PHP | 46 Messages

26 mai 2006, 17:53

Comme je ne connais pas Javascript, je vais le faire en PHP seul...

Donc pour commencer, pour le choix du gardien, j'ai affiché un tableau séparé avec uniquement les gardiens de buts et, à la place des cases à cocher, j'utilise des boutons "ratio".

J'aimerais que le premier gardien de la liste soit coché par défaut. J'ai trouvé qu'il fallait rajouter "checked" à la fin de la ligne mais ça ne marche pas...

<td><input type="radio" name="joueur[]" value="{$joueur[un_joueur].numero} checked"></td>