Kommunauty
Connexion
Inscription

Trier mon tableau via ma clause WHERE


Furiol Messages : 50

Bonjour,

J'ai un problème avec mon code qui a pour but de trié via la clause WHERE mon tableau grâce a des critères soit différent soit successif.

En somme, mes requêtes fonctionne bien, mais à terme si je souhaite rajouter 3 ou 4 critères de plus cela deviendrais très vite un code avec des centaines de lignes.

Je souhaiterai trouver une solutions pour avoir un code plus logique qui me permettrai de trier avec ma clause WHERE un ou plusieurs critères soit différent soit successif sans passer par des requêtes avec des centaines de lignes..

Cette requête signifie que mon tableau comporte tous mes membres

if (isset($_GET['page']) AND !empty($_GET['page']))
{
 
$requete_classement = $bdd->prepare("SELECT f.id f_id,
f.username f_username,
c.id_designer c_id_designer,
f.moyenne f_moyenne
FROM forum_users f
LEFT JOIN user_detail c
ON f.id = c.id_designer
ORDER BY f.moyenne DESC
LIMIT :nombre_un, :nombre_deux");
$requete_classement->bindValue('nombre_un', ($_GET['page'] - 1) * $NombreDeMembresParPage, PDO::PARAM_INT);
$requete_classement->bindValue('nombre_deux', $NombreDeMembresParPage, PDO::PARAM_INT);
$requete_classement->execute();
}

Cette requete signifie que mon tableau comporte tous mes membres selon le type

if (isset($_GET['page']) AND !empty($_GET['page']) OR isset($_GET['type']) AND !empty($_GET['type']))
{
 
$requete_classement = $bdd->prepare("SELECT f.id f_id,
f.username f_username,
c.id_designer c_id_designer,
f.moyenne f_moyenne,
c.cat_".$_GET['type']." c_cat_".$_GET['type']."
FROM forum_users f
LEFT JOIN user_detail c
ON f.id = c.id_designer
WHERE c.cat_".$_GET['type']." > '0'
ORDER BY f.moyenne DESC
LIMIT :nombre_un, :nombre_deux");
$requete_classement->bindValue('nombre_un', ($_GET['page'] - 1) * $NombreDeMembresParPage, PDO::PARAM_INT);
$requete_classement->bindValue('nombre_deux', $NombreDeMembresParPage, PDO::PARAM_INT);
$requete_classement->execute();
}
<?php while($classement = $requete_classement->fetch())
{ ?>
 
...
 
<?php
}
$requete_classement->closeCursor();
?>

Voila j'ai vraiment essayer d'expliquer clairement la situation, je ne suis pas très doué dans ce domaine, si vous avez une explications pouvez vous simplifier au maximum

Bonne journée a vous,

Cordialement.

samedi 27 juillet 2013

Lucas Messages : 830

Salut ! Hihiiihihihihii, alors comme je suis d'humeur fourbe et enjouée aujourd'hui, je vais pas te dire tout de suite la réponse, mais te proposer une série de recommandations. Donc.

Au final, dans les 2 cas tu comptes exécuter une requête SQL, parcourir le résultat et afficher tout propre. Donc quelque soit les éléments passés en paramètres, on passe par les mêmes étapes :

1. Je prépare ma requête avec les éléments que je veux.

2. J'éxécute la requête, en passant encore plus de params parce que hé, jsuis un peu un fifou.

3. J'affiche le classement.

Et quel est le seul truc qui change entre les deux cas ? (Allez, un petit effort, c'est en bleu)

Éhoui, il s'agit de la requête même la préparation est identique ! et même, ya juste une seule et cruciale différence, un ajout dans le deuxième cas.

Donc la solution :

// On créé une chaîne de texte qui contient le début de la requête commun aux deux cas de figure

$sql = 'SELECT f.id f_id, f.username f_username, c.id_designer c_id_designer, f.moyenne f_moyenne';

// Si on fournit les paramètres en plus, alors on veut sélectionner la catégorie toussa
if(){
  $sql .= ', c.cat_'.$_GET['type'].' c_cat_'.$_GET['type'];
}

// Et après on termine la requête avec le bordel habituel

$sql .= " FROM table WHERE blblabla LIMIT monnombre";

Pouf, tu enclenches ta requêtes, et tout roule mon chou !

Bon, du coup j'ai donné plus que de simples petits éclaircissements, mais au moins tu saisis en gros le cheminement de la pensée ! Réfléchit comme ça, tu regardes ton problème, tu analyse, cherche les trucs communs, voilà

samedi 27 juillet 2013

Furiol Messages : 50

Bonsoir, déjà merci beaucoup pour ton aide.

je savais pas qu'on pouvais séparer dans une requête le SELECT et le FROM toujours sympa de l'apprendre, cependant j'ai essayer ce que tu m'a expliquer, en théorie je comprend seulement en pratique j'ai essayer mais je me retrouve avec une erreur qui m'indique :

 Fatal error: Call to a member function bindValue() on a non-object in C:\wamp\www\classement.php on line 63

cette fois ci j'ai vraiment essayer tous simplement sans clause WHERE de séparer mon SELECT et mon FROM dans 2 requête différentes

$requete_classement = "
SELECT f.id f_id,
f.username f_username,
c.id_designer c_id_designer,
f.moyenne f_moyenne";
$requete_classement .= "FROM forum_users f LEFT JOIN user_detail c ON f.id = c.id_designer ORDER BY f.moyenne DESC LIMIT :nombre_un, :nombre_deux";

$requete_classement->bindValue('nombre_un', ($_GET['page'] - 1) * $NombreDeMembresParPage, PDO::PARAM_INT);
$requete_classement->bindValue('nombre_deux', $NombreDeMembresParPage, PDO::PARAM_INT);
$requete_classement->execute();

Je pense qu'il y a un truc que j'ai pas tous a fait compris

samedi 27 juillet 2013

Lucas Messages : 830

Ah non non, au final, la requête est complète à la fin, c'était peut-être juste pas clair…

En gros, ce qu'on stocke au début, c'est juste du texte. Nous, on sait que c'est une requête SQL, mais PHP il en sait rien. Donc on peut la construire en plusieurs parties, il s'en fout, pour lui c'est du texte.

Donc :

$sql = 'SELECT mesvaleurs';
$sql .= ' FROM matable';
$sql .= ' WHERE id = 34';

Au final ça revient exactement au même que stocker directement la requête complète :

$sql = "SELECT mesvaleurs FROM matable WHERE id = 34";

SAUF que en plus entre les différentes parties de la requête on peut mettre des conditions, et autant de code PHP qu'on veut !

Démonstration : Si un attribut en GET est passé, alors on ajoute un bout de texte

$sql = 'SELECT * FROM matable';
if(is_num($_GET['limit'])){
  $sql .= ' LIMIT 0,' . $_GET['limit'];
}

Et là :

Si ya aucun param, $sql contient :

"SELECT * FROM matable"

Si on passe genre 5 comme param, $sql contient :

"SELECT * FROM matable LIMIT 0,5"

Et c'est juste du texte. Donc tu construis ta chaîne de texte (qui contient ta requête) progressivement, en faisant des conditions quand il faut, et une fois, UNE FOIS que ta requête est complète, et dans TOUS LES CAS (cad qu'il faut SELECT, et FROM, et WHERE), alors là tu fais le basique :

$bdd->prepare($sql);
// Le reste de ton code PHP

Voilà, j'espère que c'est un peu plus précis !

samedi 27 juillet 2013

Furiol Messages : 50

Franchement, merci beaucoup pour l'aide ( et surtout pour la patience) donc tu fait preuve

j'ai vraiment bien compris ton explications, j'ai donc réaliser la requete suivante :

$sql = 'SELECT f.id f_id, f.username f_username, c.id_designer c_id_designer, f.moyenne f_moyenne';
$sql .= ' FROM forum_users f LEFT JOIN user_detail c ON f.id = c.id_designer';
$sql .= ' WHERE f.confirmer > 0';
$sql .= ' ORDER BY f.moyenne DESC ';
$sql .= ' LIMIT :nombre_un, :nombre_deux';
$requete_classement = $bdd->query($sql);
$requete_classement->bindValue('nombre_un', ($_GET['page'] - 1) * $NombreDeMembresParPage, PDO::PARAM_INT);
$requete_classement->bindValue('nombre_deux', $NombreDeMembresParPage, PDO::PARAM_INT);
$requete_classement->execute();

La requête fonctionne très bien sauf quand je rajoute



$sql .= ' LIMIT :nombre_un, :nombre_deux';

...

$requete_classement->bindValue('nombre_un', ($_GET['page'] - 1) * $NombreDeMembresParPage, PDO::PARAM_INT);
$requete_classement->bindValue('nombre_deux', $NombreDeMembresParPage, PDO::PARAM_INT);

Je tombe sur une erreur :

Fatal error: Call to a member function bindValue() on a non-object in C:\wamp\www\classement.php on line 183

La ou je comprend pas c'est quand temps normal cette requête devrait marcher juste avec


$requete_classement = $bdd->prepare("
SELECT f.id f_id,
f.username f_username,
c.id_designer c_id_designer,
f.moyenne f_moyenne
FROM forum_users f
LEFT JOIN user_detail c
ON f.id = c.id_designer
WHERE f.confirmer > '0'
ORDER BY f.moyenne DESC
LIMIT :nombre_un, :nombre_deux");
$requete_classement->bindValue('nombre_un', ($_GET['page'] - 1) * $NombreDeMembresParPage, PDO::PARAM_INT);
$requete_classement->bindValue('nombre_deux', $NombreDeMembresParPage, PDO::PARAM_INT);
$requete_classement->execute();

et le nouveau code que j'utilise reviens exactement au même sauf qu'une erreur apparaît.

samedi 27 juillet 2013

Lucas Messages : 830

Oh tu sais, je suis payé pour çMAIS NON, JE DEVRAIS POURTANT

Content que ça t'ait aidé, pour ton erreur je pense que c'est juste parce que dans ton nouveau code tu fais "query()" au lieu de "prepare()".

Sois attentif, enfin, et bonne chance pour la suite!

ps : Ah mais en fait, même si tu PEUX séparer la requête en plein de morceaux, c'est pas nécessaire de le faire systématiquement. Par exemple tu sépares juste le SELECT du reste de la requête, et entre les 2 tu inserres une condition, qui fait que si tel param existe, alors on selectionne aussi telle valeur. C'est vraiment juste quand on a besoin d'ajouter des valeurs en milieu de chaîne qu'on la coupe en parties !

samedi 27 juillet 2013

Furiol Messages : 50

ah oui sa marche

Demande à te faire payer !

en tous cas merci beaucoup, bonne soirée.

samedi 27 juillet 2013

Répondre Pour répondre, tu dois d'abord t'inscrire rapidement sur Kommunauty. Rejoins-nous vite !