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 :

Migration requête simple vers requête préparée par PHP mysqli


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut Migration requête simple vers requête préparée par PHP mysqli
    Bonjour,

    Passer d'une requête simple à une requête préparée sans être spécialiste n'est pas chose facile car les changements interviennent aussi sur le code en AVAL de la requête.

    Je prends l'exemple d'un petit SELECT.

    Requête simple en PHP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $connexion = mysqli_connect ("localhost", "mysql_user", "mysql_password");
     
    $requete = "SELECT champ_1 FROM base WHERE id='" . intval ($ref) . "'  LIMIT 1";
     
    $resultat = mysqli_query ($connexion, $requete);
     
    $nbr = mysqli_num_rows ($resultat);
     
    $retour = mysqli_fetch_assoc ($resultat);
    Je cherche le code équivalent mais avec requête préparée, cela devient beaucoup plus compliqué :


    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
    $requete = "SELECT champ_1 FROM base WHERE id=" . ? . "  LIMIT 1";
     
    $stmt = mysqli_prepare ($connexion, $requete);
     
    $id = intval ($id);
     
    mysqli_stmt_bind_param ($stmt, 'i', $id);
     
    mysqli_stmt_execute($stmt);
     
    mysqli_stmt_store_result($stmt);
     
    $nbr = mysqli_stmt_num_rows ($stmt);
     
    /* C'est bon, je récupère le bon nombre de lignes */
     
    $retour = mysqli_stmt_get_result ($stmt);
     
    $retour = mysqli_stmt_fetch_array ($retour, MYSQLI_ASSOC);
     
    /* Là c'est erreur fatale. */
    Pouvez-vous m'aider ?

    Merci d'avance.

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 942
    Par défaut
    Bonjour

    Peut-être que ce n'est pas le bon fil de discussion
    Voir ici ? https://www.developpez.net/forums/f2...-base-donnees/

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Citation Envoyé par Michel.Priori
    Peut-être que ce n'est pas le bon fil de discussion
    C'est une question qui porte sur PHP et plus précisément sur la classe mysqli.

    Le modérateur déplacera le sujet si nécessaire.

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 605
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 605
    Par défaut
    j'ai l'impression que la fonction "mysqli_stmt_fetch_array" n'existe pas et que c'est plutot "mysqli_stmt_fetch" :
    https://www.php.net/manual/fr/mysqli-stmt.fetch.php

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Citation Envoyé par mathieu Voir le message
    j'ai l'impression que la fonction "mysqli_stmt_fetch_array" n'existe pas et que c'est plutot "mysqli_stmt_fetch" :
    https://www.php.net/manual/fr/mysqli-stmt.fetch.php
    Je pense que tu as raison.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Bind result variables
    mysqli_stmt_bind_result($stmt, $retour);
     
    // Fetch value
    mysqli_stmt_fetch($stmt);
    Mon problème est de trouver les équivalents après requêtes préparées de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $nbr = mysqli_num_rows ($resultat);
     
    $retour = mysqli_fetch_assoc ($resultat);

  6. #6
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 605
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 605
    Par défaut
    regardez ce qu'il y a écrit là :
    https://www.php.net/manual/fr/mysqli-stmt.execute.php

    Si la requête produit un ensemble de résultats, il peut être récupéré à l'aide de la fonction mysqli_stmt_get_result() ou en le récupérant ligne par ligne directement à partir de l'instruction à l'aide de la fonction mysqli_stmt_fetch().

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour,

    Merci de tes précisions.

    Je fais un test dès que j'ai le temps.

    Je reviens vers vous.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour,

    Ce code fonctionne :

    Code PHP : 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
    $connexion = mysqli_connect ("localhost", "mysql_user", "mysql_password");
     
    $requete = "SELECT champ_1 FROM base WHERE id= ? ";
     
    $stmt = mysqli_prepare ($connexion, $requete);
     
    $id = intval ($reftlc);
     
    mysqli_stmt_bind_param ($stmt, 'i', $id);
     
    mysqli_stmt_execute ($stmt);
     
    $result = mysqli_stmt_get_result ($stmt);
     
    $retour = mysqli_fetch_all ($result, MYSQLI_ASSOC);
     
    $nbr = count ($retour);

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour,

    J'ajoute deux questions :

    1)
    S'agissant d'une recherche BOOLEAN MODE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = "SELECT * FROM base WHERE MATCH($champ) AGAINST($text IN BOOLEAN MODE)";
    Pour requête préparée cela fonctionne si je remplace $text par ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Fonctionne
    $requete = "SELECT * FROM base WHERE MATCH($champ) AGAINST(? IN BOOLEAN MODE)";
    $stmt = mysqli_prepare ($connexion, $requete);
    mysqli_stmt_bind_param ($stmt, 's', $text);
    Mais cela ne fonctionne plus si je remplace $champ par ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Ne fonctionne pas
    $requete = "SELECT * FROM base WHERE MATCH(?) AGAINST(? IN BOOLEAN MODE)";
    $stmt = mysqli_prepare ($connexion, $requete);
    mysqli_stmt_bind_param ($stmt, 'ss', $champ, $text);
    Avez-vous une idée ?

    2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $requete = "INSERT INTO base (un, deux, trois, quatre, cinq, six, sept, huit, neuf, dix, onze) VALUES (? ? ? ? ? ? ? ? ? ? ?)";
     
    $stmt = mysqli_prepare ($connexion, $requete);
    Voyez-vous une erreur de syntaxe ?

    Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"INSERT INTO...

    Je ne vois rien.

    Merci d'avance.

  10. #10
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 496
    Par défaut
    Bonjour,

    Citation Envoyé par boteha Voir le message
    Mais cela ne fonctionne plus si je remplace $champ par ?
    La documentation PHP dit :

    Note:
    Les marques sont autorisées uniquement dans certains endroits des requêtes SQL. Par exemple, elles le sont dans la liste VALUES() d'une requête INSERT (pour spécifier les valeurs des colonnes pour une ligne), ou dans une comparaison d'une clause WHERE pour spécifier une valeur de comparaison. Cependant, elles ne sont pas autorisées pour les identifiants (de tables ou de colonnes).

    Ceci dit qu'avec mysqli, il n'est pas possible d'utiliser des noms de colonnes/tables en tant que marqueurs, peut être avec PDO si vous utilisez le paramètre PDO::ATTR_EMULATE_PREPARES.

    Citation Envoyé par boteha Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = "INSERT INTO base (un, deux, trois, quatre, cinq, six, sept, huit, neuf, dix, onze) VALUES (? ? ? ? ? ? ? ? ? ? ?)";
    Voyez-vous une erreur de syntaxe ?
    Oui, ils manquent des virgules entre les points d'interrogation VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?).

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour Toufik83,

    Merci de tes réponses, c'est très clair.

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 588
    Billets dans le blog
    10
    Par défaut
    Deux remarques d'ordre sémantique :
    une requête porte sur une ou des tables ou vues et non pas sur une base, SELECT [...] from BASE est de ce point de vue une syntaxe inappropriée.
    une table comporte des colonnes et non pas des champs, ce faisant SELECT [. . .] WHERE MATCH($champ) est également hors de propos.

    Et une remarque concernant la stabilité du résultat et les performances de la requête :
    Il ne faut pas utiliser SELECT *, mais citer les colonnes utiles au traitement, voyez dans mon blog les explications à ce sujet.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour escartefigue,

    Merci pour les deux remarques sémantiques, c'est noté.

    SELECT * est à éviter, bien sûr.
    Je l'ai utilisé pour des exemples simples, la prochaine fois je donnerai des noms de colonnes.

Discussions similaires

  1. Réponses: 13
    Dernier message: 03/12/2010, 15h56
  2. importation fichier csv vers mysql par php
    Par frboyer dans le forum Langage
    Réponses: 4
    Dernier message: 26/05/2009, 09h21
  3. [PHP-JS] Extration mysql vers javascript par php.
    Par SirDarken dans le forum Langage
    Réponses: 1
    Dernier message: 26/05/2008, 14h18
  4. [MySQL] Exportation mysql vers format xml par php
    Par kamacho dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/12/2007, 22h40
  5. Réponses: 2
    Dernier message: 08/12/2005, 05h28

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