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

Langage PHP Discussion :

mettre du code PHP à l'intérieur d'une chaîne de caractères syntaxe HEREDOC


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut mettre du code PHP à l'intérieur d'une chaîne de caractères syntaxe HEREDOC
    Bonjour,

    je voudrais savoir comment faire ce qui est dit dans le titre.

    Cas concret :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql_insert = <<<sql
    INSERT INTO li_license
    ( LI_activate_date )
    VALUES (
         UtilFct::convertDateSQL( '31/07/2021' )
    )
    sql;
    La méthode convertDateSQL de la classe UtilFct est une méthode statique mettant les dates au format SQL (YYYY-MM-DD). Si je laisse comme cela, la ligne 5 n'est pas interprétée, donc je retrouve du code PHP dans la variable $sql_insert . Comment faire pour qu'elle soit interprétée ?

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    L'astuce est de passer par un wrapper, ici une fonction fléchée $convert, ainsi le {$ sera bien reconnu et exécuté au sein de la chaîne $sql.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $convert = fn($date) => $pdo->quote(UtilFct::convertDateSQL($date));
     
    $sql = <<<SQL
        INSERT INTO li_license
        SET LI_activate_date = {$convert('31/07/2021')}
        SQL;
    Vu que de toute façon il faut faire un quote() ça peut revenir à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = <<<SQL
        INSERT INTO li_license
        SET LI_activate_date = {$pdo->quote(UtilFct::convertDateSQL('31/07/2021'))}
        SQL;
    Ceci dit pour ton cas je resterais plutôt sur du SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = <<<SQL
        INSERT INTO li_license
        SET LI_activate_date = STR_TO_DATE({$pdo->quote('31/07/2021')}, '%d/%m/%Y')
        SQL;
    https://dev.mysql.com/doc/refman/8.0...on_str-to-date

  3. #3
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Bonjour,

    Pour CE "Cas concret", même pas en rêve.

    1- déjà, on ne voit pas l'intérêt de la syntaxe heredoc ici

    2- quoi qu'il arrive,
    • on effectue une requête préparée,
    • et on passe les données PHP en paramètres à l'exécution.


    @Seb.
    Tu n'aurais pas mixé les syntaxes de INSERT et UPDATE ?

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    1- déjà, on ne voit pas l'intérêt de la syntaxe heredoc ici
    Avoir une belle chaîne et du code lisible, àmha c'est suffisant pour justifier le HEREDOC dès qu'on a un retour à la ligne à présenter.

    2- quoi qu'il arrive,
    • on effectue une requête préparée,
    • et on passe les données PHP en paramètres à l'exécution.
    Je ne serais pas aussi affirmatif. Une requête préparée n'est utile que si on la répète.

    @Seb.
    Tu n'aurais pas mixé les syntaxes de INSERT et UPDATE ?
    Si, et cette syntaxe est beaucoup plus lisible (et donc moins bugogène) que le traditionnel INSERT/VALUES où les paires disparaissent.

  5. #5
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql_insert = "
         INSERT INTO li_license
         ( 
              LI_activate_date 
         ) VALUES (
              :activate_date
         );";
    C'est tout aussi lisible.

    Question de choix personnel, et d'habitude, sans doute.

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    C'est tout aussi lisible.
    La lisibilité décroit avec l'augmentation du nombre de colonnes.

    De plus ici la moitié des caractères envoyés au serveur SQL sont des indentations inutiles à la requête. Tu créés du trafic pour rien. Un trafic que tu n'aurais pas avec du HEREDOC.

  7. #7
    Rédacteur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 608
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Je ne serais pas aussi affirmatif. Une requête préparée n'est utile que si on la répète.
    Une requête préparée est utile pour se protéger des injections sql. En plus, on voit dans l'autre fil de discussion que t'utilises les requêtes préparées avec PDO donc il faut t'en servir, tu n'auras plus à mettre de php dans la requête.

  8. #8
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Nightfall Voir le message
    En plus, on voit dans l'autre fil de discussion que t'utilises les requêtes préparées avec PDO donc il faut t'en servir, tu n'auras plus à mettre de php dans la requête.
    Avec la classe géniale de Rawsrc (PDOPlusPlus) les requêtes sont systématiquement préparées...La conversion de date au format SQL, il faudra que je la fasse sur une ligne préalable, avant l'exécution de la requête.

  9. #9
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Nightfall Voir le message
    Une requête préparée est utile pour se protéger des injections sql.
    Pas seulement. Le but d'une requête préparée est :
    -- D'établir le schéma d'exécution SQL 1 fois pour X requêtes ~identiques
    -- De protéger des injections

    Sachant qu'un $pdo->quote() offre le même niveau de protection contre les injections qu'une requête préparée, il n'y a donc aucun intérêt à préparer une requête pour un simple SELECT/INSERT/UPDATE isolé.

    Citation Envoyé par laurentSc
    Avec la classe géniale de Rawsrc (PDOPlusPlus) les requêtes sont systématiquement préparées...
    À moins que tes requêtes ne soient dans des boucles, ça ne sert à rien de les préparer systématiquement si leurs arguments sont passés en dur.

    La conversion de date au format SQL, il faudra que je la fasse sur une ligne préalable, avant l'exécution de la requête.
    Il y a une fonction SLQ STR_TO_DATE() pour cela, exemple plus haut.

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/12/2018, 08h56
  2. Variable à l'intérieur d'une chaîne de caractères
    Par rikoko dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/05/2013, 19h38
  3. Comment mettre du code php dans une condition javascript ?
    Par Alexandrebox dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/04/2010, 12h55
  4. Mettre du code php dans une variable
    Par JohnBrown011 dans le forum Langage
    Réponses: 2
    Dernier message: 19/05/2008, 13h33
  5. Mettre un code php dans une variable...
    Par kedare dans le forum Langage
    Réponses: 6
    Dernier message: 19/09/2005, 12h55

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