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 :

Questions sur les requêtes préparées


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Par défaut Questions sur les requêtes préparées
    Bonjour,

    Jusqu'à présent, pour mon petit projet, j'utilisais des requêtes préparées sans le savoir des requêtes préparées mais en y mettant directement mes paramètres, c'était donc inutile. Je m'en suis rendu compte quand j'ai fais des recherches sur les injections SQL.
    Je reviens donc avec 3 questions!

    Numéro 1 : J'affiche mes données issues de ma BDD dans un tableau HTML. J'ai mis en place un système de pagination en PHP qui fait une requête avec une condition LIMIT. Cette requête étant effectués souvent j'essaie de la faire en préparée, elle fonctionne mais je ne sais pas si elle est "propre". Pouvez-vous me dire si elle est correct?

    (Je suis désolé je n'arrive pas à inserer le code. Quand je le fait la page ne se charge pas ... J'éditerais le post quand ça remarchera)

    Numéro 2 : Dans le tableau créé avec la requête précédente, je clic sur chaque ligne pour récupérer l'id de l'étudiant qui est envoyé dans un tableau de session par ajax. Je souhaite par la suite effectuer une requête sur ces id donc avec une condition IN mais d'&prés ce que j'ai vu le IN avec un nombre inconnu de paramètres est assez gênant à gérer avec les requêtes préparées et il est impossible de passer un tableau à une requête préparée... D'où ma question : les Id provenant directement de mon tableau HTML et étant par la suite stockés en session, je ne pense pas que l'utilisateur puisse y toucher. Serait-il alors possible de passer par une requête basique pour utiliser le IN ou il y a quand même de trop gros risques au niveau de la sécurité? Dans ce cas ce n'est pas génant de faire comme l'exemple 5 de la doc (http://www.php.net/manual/fr/pdostatement.execute.php), parceque de ce que j'ai compris l'interet des requetes preparées avant la securité c'est quand même le fait de les réutiliser.

    Numéro 3 : Pour insérer des champs dans ma BDD je passe par des formulaires générés automatiquement (l'appuie sur un bouton créé un formulaire), chaque champs est stocké dans un array (nom[], prénom[], ...). La comme il y a des inputs je suis sûr qu'il faut utiliser une requête préparée. mais il y a-t-il un autre moyen que de passer par une boucle où on exécute la requête avec des paramètres différents à chaque fois? Parce que ça prend quand même plus de temps que de faire une insertion en une seule fois.

    Numéro Bonus ^^: Une autre question, dans tous les exemples de requêtes préparées que j'ai vu, il y avait toujours des argument à "binder". Est-il possible de faire une requête préparée qui est toujours la même, sans argument pour gagner en temps d’exécution puisqu'elle aura déjà était compilée?

    Désolé pour ce post un peu long.

    Merci.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    1 - on attend le code

    2 - Les données provenant de l'utilisateur, les mettre en session ne les rend pas plus sûres.
    On peut facilement gérer des paramètres dynamiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $data = array(1, 6, 12, 154);
    $sql = 'SELECT * FROM table WHERE colonne IN (' . implode(',', array_fill(0, count($data), '?')) . ')';
    3 - Une requête préparée est concue pour être executée de multiples fois avec des valeurs différentes.

    Bonus - A quoi cela sert-il d'executer la même requête plusieurs fois dans un code ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Par défaut
    Bonjour et merci de votre réponse.

    Citation Envoyé par sabotage Voir le message
    2 - Les données provenant de l'utilisateur, les mettre en session ne les rend pas plus sûres.
    Ce que je voulais dire, c'est que l'utilisateurs n'a pas la main sur ces données(enfin je ne pense pas qu'il puisse l'avoir, puisque c'est lors d'un clic sur le tableau que la valeurs du tableau est stockée en session. Est-il possible pour un utilisateurs d'envoyer autre chose que la ligne sur laquelle il a cliqué dans le tableau?

    Citation Envoyé par sabotage Voir le message
    On peut facilement gérer des paramètres dynamiquement :
    D'accord. Ca soulève d'autres questions. Comme vous dites que les données ne sont pas sûr peut-être vaudrait-il mieux passer par une requête préparée? Dans ce cas malgré votre réponse à la question 3, est-il possible d'utiliser une requête préparée pour son aspect sécuritaire? Parce que le nombre d'argument dans le IN pouvant varier d'une requête à l'autre, il faudra la recompiler.

    En attendant j'essais de réaliser en suivant vos trace et comme dans la doc PHP (http://www.php.net/manual/fr/pdostatement.execute.php exemple 5) Mais est-ce considéré comme "correct"?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $place_holders = implode(',', array_fill(0, count($_SESSION['selection']), '?'));
    $i=1;
     
    $pdo = Database::connect();
    $requete = $pdo->prepare("SELECT * FROM Etudiants E INNER JOIN Classes C ON E.id_classe=C.id_classe WHERE  E.id_etudiant IN ($place_holders) ORDER BY E.id_etudiant "); 
    foreach($_SESSION['selection'] as $id_etud)
    {
    	$requete->bindValue($i, $id_etud, PDO::PARAM_STR);
    	$i++;
    }
    $requete->execute($_SESSION['selection']);
    Citation Envoyé par sabotage Voir le message
    Bonus - A quoi cela sert-il d'executer la même requête plusieurs fois dans un code ?
    Admettons qu'une page principale possède un tableau d'affichage sans filtres. Cette page étant l’accueil, les utilisateurs, à chaque fois qu'il vont revenir dessus vont recharger le tableau et donc exécuter la requête.

    Le code de ma 1ere question.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $perPage = 30;
    	$offset = ($cPage-1)*$perPage;
     
    	$pdo = Database::connect();
    	$reponse = $pdo->prepare("SELECT * FROM Etudiants E INNER JOIN Classes C ON E.id_etudiant=C.id_classe ORDER BY E.nom_etudiant LIMIT ?, ?"); 
    	$reponse->bindValue(1, $offset, PDO::PARAM_INT);
    	$reponse->bindValue(2, $perPage, PDO::PARAM_INT);
    	$reponse->execute();

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    - question 1 et bonus : Les requêtes préparées ne sont pas valables que lors d'une session de connexion. Quand tu rafraichis ta page, tu refais la connexion donc tout est oublié.

    - question 2 : tout ce qui vient du navigateur vient de l'utilisateur et peut donc avoir été alteré.

    - question 3 : tu n'as pas besoin de la boucle foreach pour faire le bind puisque tu passes les paramètres dans execute()
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Par défaut
    Merci pour vos explications.

    Citation Envoyé par sabotage Voir le message
    - question 1 et bonus : Les requêtes préparées ne sont pas valables que lors d'une session de connexion. Quand tu rafraichis ta page, tu refais la connexion donc tout est oublié.
    D'accord mais dans ce cas est-il convenable d'utiliser les requêtes préparées pour se protéger des injections SQL ou d'autre méthodes sont mieux?

    Citation Envoyé par sabotage Voir le message
    - question 3 : tu n'as pas besoin de la boucle foreach pour faire le bind puisque tu passes les paramètres dans execute()
    Ok mais quelle solution est la meilleurs passer directement l'array dans execute() ou faire une boucle foreach pour ajouter PDO:ARAM_STR et donc avoir plus de sécurité j'imagine.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Oui tu peux utiliser une requête préparée pour les valeurs de LIMIT.

    Pour les différentes méthodes, la sécurité est la même.
    Mais par exemple dans ton cas des LIMIT, si tu ne passais pas par bindValue en precisant le type PDO::PARAM_INT, le moteur ajouterait automatiquement des guillemets et cela ne fonctionnerait pas.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Par défaut
    Ok merci beaucoup pour les explications.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Question sur les requêtes SQL
    Par Genyuumaru dans le forum ASP.NET MVC
    Réponses: 4
    Dernier message: 08/10/2012, 08h43
  2. [MySQL] Question sur les Variables dans une requête php-Mysql
    Par rvtoulon dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/02/2012, 12h06
  3. question sur les vues et l'optimisation de requêtes
    Par zaboug dans le forum Requêtes
    Réponses: 8
    Dernier message: 25/03/2009, 16h28
  4. Question sur les requêtes hiérarchiques
    Par casawi dans le forum SQL
    Réponses: 3
    Dernier message: 05/08/2008, 14h54
  5. Question sur les requêtes paramétrées
    Par lutecefalco dans le forum VB.NET
    Réponses: 3
    Dernier message: 04/12/2007, 10h13

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