Requete prepare dynamique

Par creataddict, il y a 15 ans


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, il y a 15 ans

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() )

creataddict, il y a 15 ans

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

palmer08, il y a 15 ans

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. :)

creataddict, il y a 15 ans

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

palmer08, il y a 15 ans

J'ai trouvé

$sql = $DB->prepare('SELECT * FROM ma_table ORDER BY id ' . $_GET'order'] . ' ');
$sql->execute(array($_GET'order']));
creataddict, il y a 15 ans

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.

palmer08, il y a 15 ans

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
creataddict, il y a 15 ans

le mieux serais

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

Mais j'ai un doute.

palmer08, il y a 15 ans

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

PhiSyX, il y a 15 ans

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 ^^

creataddict, il y a 15 ans

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