Bonjour,

Je me pose la question sur comment on peux réaliser des requêtes PDO dynamique pour le tri, exemple :

Requête de base

$sql = $DB->prepare(SELECT * ma_table ORDER BY id ASC);
$sql->execute();
....

Requête de tri sur le nom croissant

$sql = $DB->prepare(SELECT * ma_table ORDER BY nom ASC);
$sql->execute();

Requête de tri sur le nom décroissant

$sql = $DB->prepare(SELECT * ma_table ORDER BY nom DESC);
$sql->execute();

Etc pour le prenom, ville, ...

Pour simplifier et rendre le code biens plus léger, quelle méthode utiliser/existe t-il ?

Merci d'avance pour vos lumières.

11 réponses


PhiSyX
Réponse acceptée

Salut,

Oui je vais aller leur dire :D (ou pas)
Au pire essaye comme ça :

if (isset($_GET'sortKey'], $_GET'order'])) {
    $sortKey = $_GET'sortKey'];
    switch ($_GET'order']) {
        case "ASC":
            $sql = $bdd->prepare("SELECT * FROM news ORDER BY $sortKey ASC");
            break;
        case "DESC":
            $sql = $bdd->prepare("SELECT * FROM news ORDER BY $sortKey DESC");
            break;
    }
    if ($sql->execute()) {
        while ($data = $sql->fetch(PDO::FETCH_OBJ)) {
            echo 'Trié par ordre ', $_GET'order'], ' : ', $data->id, '<br />'; // Test
        }
    } else {
        echo 'Erreur...';
    }
}

L'URL doit donner : http://www.monsite.com/page.php?sortKey=champ&order=ASC (ou DESC)
Même si y'a sûrement d'autre moyen d'le faire ^^

Pour le prénom, ville, ...

Tu peux faire comme ça:

$sql = $DB->prepare(SELECT * FROM ma_table WHERE prenom=?);
$sql->execute(array($_GET'prenom']));

Et dans ton url tu écrira: index.php?prenom=Jean-Claude

Après pour le tri je ne sais pas, je suis encore novice et je n'ai pas encore commencé la leçon "Ecrire des données" sur le siteduzéro.com. :)

oui, je savais pour cette partie, comme expliqué c'est pour la partie ORDER BY.... que je coince

J'ai trouvé

$sql = $DB->prepare('SELECT * FROM ma_table ORDER BY id ' . $_GET'order'] . ' ');
$sql->execute(array($_GET'order']));

justement, j'ai pensé à cette piste, mais je suis pas sur que coté sécu c'est valable, puis aussi id doit changer en nom ou prenom etc.

Bien sur la question de bas c'est aussi avec la parti sécu de la chose.

Beh logiquement tu m'es ça:

$sql->execute(array(isset($_GET'order'])));

Et tu as lien tu genre

http://www.monsite.com/page.php?order=asc

Vue que tu as toujours par défaut une valeur pour order. Après tu m'es un lien pour l'order décroissant:

http://www.monsite.com/page.php?order=desc

le mieux serais

$sql = $DB->prepare(SELECT * FROM ma_table WHERE ?=?);

Mais j'ai un doute.

Mauvaise idée de passer par l'URL pour faire une requete... :)
Suffit qu'un utilisateur malveillant connaisse le nom de ta bdd pour vous faire un sale coup...

http://www.monsite.com/page.php?order=desc;DROP DATABASE tabdd

Essais de faire ça avec la function php sort() ( ou array_multisort() )

je comprend pas le but avec le tri sort() !!

@PhiSyx Va dire ça sur le siteduzero.com.

PhiSyx, ta solution me semble bonne, on ma aussi proposé un truc du genre :

$nom = 'nom';
$tri = 'ASC';
$req = 'SELECT * ma_table ORDER BY '.$nom.' '.$tri;
$sql = $DB->prepare($sql);
$sql->execute();

Maintenant la plus sécu, il me semble que ta technique est plus sur.

Merci beaucoup