Partage
  • Partager sur Facebook
  • Partager sur Twitter

function PHP dans un ORDER BY

    21 janvier 2018 à 14:27:36

     $liste = Bdd::connectBdd()->prepare("SELECT * FROM ".$table." WHERE valeur= 3 ORDER by  '".truc("id")."' desc");
     $liste -> execute();


    Bonjour à tous,

    j'ai créé une fonction php qui dépend d'un id. Appelons-la truc($id).

    Je souhaite utiliser la valeur renvoyée par cette fonction pour faire un tri avec ma bdd.

    Ma table $table contient id, valeur, etc...

     $liste = Bdd::connectBdd()->prepare("SELECT * FROM ".$table." WHERE valeur= 3 ORDER by  '".truc("id")."' desc");
     $liste -> execute();

    Mais je ne parviens pas à écrire cela.

    Une bonne âme pourrait-elle m'aiguiller ?? Ca fait 2h que je suis dessus sans résultat. Mille mercis d'avance !

    Sylvain

    -
    Edité par Sy1vain 21 janvier 2018 à 14:37:06

    • Partager sur Facebook
    • Partager sur Twitter
      21 janvier 2018 à 15:10:53

      Salut,

      Lorsque tu veux que la base de donnees trie les donner tu dois lu dire comment faire, pas avec une fonction php..

      En sql tu peux faire ceci :

      SELECT *, (champ_1 * champ_2 + 3 * champ_3) `func`
      FROM `ta_table`
      WHERE une_condition = `quelque_chose`
      ORDER BY `func` DESC

      Mais sinon tu vas devoir faire un fetchall et trier ton array avec un usort()

      bool usort ( &$array , "le nom de ta fonction" )

      Ta fonction devra retourner un int pour préciser quelle valeur est supérieure.

      PHP doc : usort()

      • Partager sur Facebook
      • Partager sur Twitter
      Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
        21 janvier 2018 à 15:35:52

        	$liste = Bdd::connectBdd()->prepare("SELECT *, ".mise_engagee."(Idjoueur) FROM ".$table." WHERE Numeroclub = '".Membre::info_sport($_SESSION['id'],'Numeroclub')."' ORDER by Paris+  ".mise_engagee."(Idjoueur) desc");


        Hello !

        D'abord un grand merci pour ta réponse, je pensais ne jamais trouver de solution.

        Oui, ma fonction renvoie bien un INT, pas de problème pour ça.

        En adaptant ce que tu as écrit, j'ai testé ceci :

        J'ai modifié les points, les guillemets (simples et doubles), la place de la fonction, etc.... Sans succès. As-tu une idée de la syntaxe correcte pour passer ton code SQL en PHP ?

        • Partager sur Facebook
        • Partager sur Twitter
          21 janvier 2018 à 15:48:04

          Hum.. ce n'est ce que j'ai expliqué ^^ je t'ai proposé deux solution, si tu souhaite utiliser php, fait comme ceci :

          function compare($a, $b) : int
          {
              return truc($a['id']) - truc($b['id']);
          // modifie si tu souhaite inverser l'ordre :
          //     return truc($b['id']) - truc($a['id']);
          }
          
          $liste = Bdd::connectBdd()->prepare("SELECT * FROM ".$table." WHERE valeur= 3 ORDER by id desc");
          //                                                                                  ^- ceci est modifié
          $liste -> execute();
          $array = $liste -> fetchAll();
          usort( $array , 'compare');



          -
          Edité par Skayotix 21 janvier 2018 à 15:51:19

          • Partager sur Facebook
          • Partager sur Twitter
          Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
            21 janvier 2018 à 16:22:00

            function compare($a, $b)
            {
                return mise_engagee($a['Idjoueur']) - mise_engagee($b['Idjoueur']);
            // modifie si tu souhaite inverser l'ordre :
            //     return truc($b['id']) - truc($a['id']);
            }
            
            $liste = Bdd::connectBdd()->prepare("SELECT * FROM ".$table." WHERE Numeroclub = '".Membre::info_sport($_SESSION['id'],'Numeroclub')."' ORDER by Paris + Idjoueur desc");
            $liste -> execute();
            $array = $liste -> fetchAll();
            usort( $array , 'compare');

            En adaptant ton code, j'ai écrit ceci mais sans vraiment comprendre. Du coup, ça ne marche pas.

            Je vais essayer d'expliquer plus clairement : j'ai une table de joueurs de différents clubs qui parient sur des matchs. Le montant de leur cagnotte, c'est le champ Pari. Moi, je voudrais les classer en fonction non pas de leur cagnotte, mais de la cagnotte+leurs mises en cours.
            Pour calculer les mises en cours, j'ai créé la fonction mise_engagee($Idjoueur).

            Est-ce plus clair ? Vois-tu d'où peut venir mon erreur ?

            Encore 10000 mercis :)

            • Partager sur Facebook
            • Partager sur Twitter
              21 janvier 2018 à 16:58:52

              Si j'ai bien compris, voici le code que tu souhaites obtenir :

              function compare($a, $b)
              {
                  return (mise_engagee($a['Idjoueur']) + $a['Paris']) - (mise_engagee($b['Idjoueur']) + $b['Paris']);
              }
              
              $liste = Bdd::connectBdd()->prepare("SELECT * FROM ".$table." WHERE Numeroclub = :numeroclub");
              $liste -> execute(array(
                  'numeroclub' => Membre::info_sport($_SESSION['id'],'Numeroclub')
              ));
              $array = $liste -> fetchAll();
              usort( $array , 'compare');

              S'il fonctionne, essaie de bien le comprendre ;)

              -
              Edité par Skayotix 21 janvier 2018 à 16:59:02

              • Partager sur Facebook
              • Partager sur Twitter
              Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
                21 janvier 2018 à 17:07:34

                Salut,

                Quelles sont les colonnes de ta table ou des tables qui doivent intervenir dans ton classement? Et à quoi ressemble ta fonction mise_engagee  ?

                • Partager sur Facebook
                • Partager sur Twitter
                le bienfait n'est jamais perdu
                  21 janvier 2018 à 19:10:28

                  @Skayotix, 

                  Ah mince, non, ça ne fonctionne pas. Ce que je souhaite faire, c'est ensuite afficher les joueurs dans l'ordre. Et la boucle en WHILE ne marche plus.

                  @ WillyKouassi,

                  Salut et merci de ton aide !

                  la fonction, c'est 

                  function mise_engagee ($Id)
                  {
                  		$historique0 =  Bdd::connectBdd()->prepare(" SELECT * FROM table_paris WHERE (Idjoueur='".$Id."') AND Vote<>0 AND Idmatch<>0 AND Gain<>0 ORDER BY Datepari DESC    ");
                  		$historique0 -> execute();
                  		$count0=$historique0->rowCount();						
                  		$mise_engagee=0;
                  			while($doto = $historique0->fetch())
                  			{				
                  				$Idmatcho=$doto['Idmatch'];
                  				$matchsnonvalides =  Bdd::connectBdd()->prepare("SELECT * FROM table_matchs_squash WHERE sport='".Membre::info($_SESSION['id'],'sport')."' AND  Idmatch='" . $Idmatcho . "' AND Validation>1 AND (Score1<>0 OR Score2<>0) ");
                  				$matchsnonvalides -> execute();
                  				$count2=$matchsnonvalides->rowCount();				
                  					if ($count2==1) {$nbmatchsnonvalides=$nbmatchsnonvalides+1;$mise_engagee=$mise_engagee+$doto['Mise'];}				
                  				
                  				$matchsnonjoues =  Bdd::connectBdd()->prepare("SELECT * FROM table_matchs_squash WHERE sport='".Membre::info($_SESSION['id'],'sport')."' AND  Idmatch='" . $Idmatcho . "' AND Validation>1 AND (Score1=0 AND Score2=0) ");
                  				$matchsnonjoues -> execute();
                  				$count3=$matchsnonjoues->rowCount();				
                  					if ($count3==1) {$nbmatchsnonjoues=$nbmatchsnonjoues+1;$mise_engagee=$mise_engagee+$doto['Mise'];}									
                  			}
                  		return $mise_engagee;
                  }


                  et la table contient entre autres les colonnes Idjoueur, Numeroclub, Paris, ...

                  La ligne que je voudrais corriger est celle_ci :

                  	$liste = Bdd::connectBdd()->prepare("SELECT * FROM ".$table." WHERE Numeroclub = '".Membre::info_sport($_SESSION['id'],'Numeroclub')."' ORDER by Paris+  '".mise_engagee("Idjoueur")."' desc");
                  	$liste -> execute();

                  Merci de ton aide ! 

                  -
                  Edité par Sy1vain 21 janvier 2018 à 19:34:53

                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 janvier 2018 à 19:53:24

                    IL faut donner le détail des tables du genre MLD.

                    Pour ta fonction mise_engagee c'est quoi la somme des matchs non joués et non valides + la mise ?

                    • Partager sur Facebook
                    • Partager sur Twitter
                    le bienfait n'est jamais perdu
                      22 janvier 2018 à 12:05:20

                      Je veux bien te copier coller tout le code et toute la bdd, mais je ne suis pas certain qu'il soit nécessaire d'aller autant dans le détail (cette partie du code dont tu parles n'est pas utilisée ici : somme des matchs non joués et non validés).

                      Je cherche juste à savoir s'il est possible d'appliquer une fonction sur le champ d'une table.

                      Le but, c'est d'afficher une liste non pas triée sur un champ, mais sur un chiffre que renvoie la fonction appliquée à ce champ (un calcul fait sur ce champ donc).

                      Merci beaucoup de ton aide !

                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 janvier 2018 à 17:50:17

                        Salut,

                        Comme je t'ai dit, pour ce genre de trie (qui met en jeu des fonction php) tu dois récupérer tous tes champs et trier ton array grâce a la fonction usort(). Ne connaissant pas ton code, je ne peux pas plus t'aider, mais le code que je t'ai donné peut etre ameliore pour fonctinner comme tu l'entends.

                        Sache que le serveur MySQL et le serveur Appache (du moins PHP) sont deux application différentes. Tu ne peux pas mélanger leur fonctionnement respectif.

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
                          28 janvier 2018 à 10:14:26

                          Je n'ai pas demandé toute la bdd mais que les tables qui interviennent dans ce que tu veux faire. Peut être que je n'ai toujours pas compris ce que tu souhaites obtenir. Si par exemple tu peux faire une sorte de représentation du résultat voulu, ça aiderait plus.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          le bienfait n'est jamais perdu

                          function PHP dans un ORDER BY

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown