IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Alternative à ORDERY BY RAND()


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2011
    Messages : 131
    Par défaut Alternative à ORDERY BY RAND()
    Bonjour,

    Comment optimiseriez vous cet élément sachant que le rand tel que écrit n'est pas efficace.
    D'autres part dans ce cadre, je n'arrive pas faire fonctionner correctement l'ordre de tri.
    voir cet article : http://www.titov.net/2005/09/21/do-n...ws-from-table/

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
            if ($choice == 'rand') {
                $products_new_sort_order = 'rand() ';
              } elseif (choice == 'ASC') {
                $products_new_sort_order = 'p.products_sort_order ASC ';
              } elseif (choice == 'DESC') {
                $products_new_sort_order = 'p.products_sort_order DESC ';
              } elseif (choice == 'DATE') {
                $products_new_sort_order = 'p.products_sort_order products_date_added ';
              } else {
                $products_new_sort_order = 'p.products_date_added DESC ';
              }
     
                  $Qproduct = $OSCOM_PDO->prepare('select distinct p.products_id
                                                    from :table_products p left join specials s on p.products_id = s.products_id
                                                    where products_status = :products_status
                                                    and products_view = :products_view
                                                    and p.products_archive = :products_archive
                                                    order by  :products_sort_order
                                                    limit :products_limit
                                                  ');
                  $Qproduct->bindInt(':products_status', 1);
                  $Qproduct->bindInt(':products_view', 1);
                  $Qproduct->bindInt(':products_archive', 0);
                  $Qproduct->bindValue(':products_sort_order', $products_new_sort_order);
                  $Qproduct->bindInt(':products_limit', 10);
     
              $Qproduct->execute();
     
              if ($Qproduct->rowCount() > 0 ) {
              ........
                 while ($products = $Qproduct->fetch() ) {
                   ........
                }
            }

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Honnêtement, c'est hyper simple comme question mais la réponse en pur SQL est loin d'être facile (je te laisse en juger toi même en allant visiter ce lien).

    Personnellement, je ferai le tri en php (via shuffle par exemple), même s'il faut toujours mieux privilégier la solution SQL au premier abord.

    Autrement tu n'arrives pas à exécuter ta requête car tu ne peux utiliser les paramètres nommées que pour les valeurs elles-mêmes. Tu ne peux pas les utiliser pour les tables et pour l'ordre, tu dois les inclure directement dans le texte de la requête.

  3. #3
    Invité
    Invité(e)
    Par défaut
    1/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
              } elseif (choice == 'ASC') {
    Il manque le $ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
              } elseif ($choice == 'ASC') {
    2/ Cela dit, il existe la syntaxe : switch(...){ case:...

    3/ Que veux-tu dire par "...le rand tel que écrit n'est pas efficace..." ???
    Précise.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2011
    Messages : 131
    Par défaut
    le oui ok, c'est moi qui est fait une erreur dans le code, méa culpa

    sinon en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by  :products_sort_order
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Qproduct->bindValue(':products_sort_order', $products_new_sort_order);
    sont incompatibles.
    le tri ne fonctionne pas, il faut passer le code en dur et cela ne m'arrange pas dans ce cadre.

    Je voudrais trouver une solution qui permet de choisir ce que l'on souhaite et le passer ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Qproduct->bindValue(':products_sort_order', $products_new_sort_order);
    Pour rand, d'après ce que j'ai lu, c'est peu recommander car cela puise dans les ressources, il faudrait passer éventuellement par un array ou faire une requête de fous (cf stackoverflow)

    Suggestions pour pour le order by ?

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Il n'y a pas d'autres solutions que de passer directement en dur dans la requête.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    à partir du moment où tu maîtrises le contenu de la variable, ça ne pose pas de problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    switch ($choice)
    {
    	case 'rand':
    		$products_new_sort_order = ' RAND() ';
    		break;
    	case 'ASC':
    		$products_new_sort_order = ' p.products_sort_order ASC ';
    		break;
    	case 'DESC':
    		$products_new_sort_order = ' p.products_sort_order DESC ';
    		break;
    	case 'DATE':
    		$products_new_sort_order = ' p.products_sort_order products_date_added ';
    		break;
    	default:
    		$products_new_sort_order = ' p.products_date_added DESC ';
    }
    	  $Qproduct = $OSCOM_PDO->prepare('select distinct p.products_id
    			from :table_products p left join specials s on p.products_id = s.products_id
    			where products_status = :products_status
    			and products_view = :products_view
    			and p.products_archive = :products_archive
    			order by '.$products_new_sort_order.'
    			limit :products_limit

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. Alternative au dbms_output ?
    Par dam1311 dans le forum Oracle
    Réponses: 10
    Dernier message: 24/11/2004, 08h11
  3. [FORMATION] Formations par alternance
    Par chobol dans le forum Etudes
    Réponses: 10
    Dernier message: 20/02/2004, 11h28
  4. Probleme de tirage avec rand ?
    Par sunshine33 dans le forum MFC
    Réponses: 5
    Dernier message: 14/01/2004, 15h57
  5. rand
    Par drKzs dans le forum C
    Réponses: 6
    Dernier message: 21/09/2003, 16h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo