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 :

PDO et fonction


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué Avatar de randoo88
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Août 2018
    Messages : 8
    Par défaut PDO et fonction
    Bonjour à tous.

    Ça fait longtemps que je n'avais pas programmé et je suis en train de m'y remettre et j'avoue que pour certains trucs, je suis un peu perdu. Si je vous écris aujourd'hui, c'est parce que j'ai un bug que je comprends, mais que je ne sais pas comment résoudre.

    Alors, j'ai un premier fichier qui contient ma connexion à la base Mysql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    try
    {
    	$db = new PDO('mysql:host=########;dbname=##########;charset=utf8', '########', '###########');
    }
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
    ?>
    Et dans un autre fichier, je veux utiliser une fonction qui fait une requête Mysql.
    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
    function nature_nom($id)
    {
    $sql_nature_nom = "SELECT * FROM geline_compta_nature WHERE nature_id =:id";
    $r_nature_nom = $db->prepare($sql_nature_nom);
    $r_nature_nom->execute([
    	'id' => $id,
    	]);
    $resultats_nature_nom = $r_nature_nom->fetchAll();
     
    // On affiche chaque recette une à une
    foreach ($resultats_nature_nom as $resultat_nature_nom) {
     
    	return $resultat_nature_nom['nature_nom'];
    }
    }
    Vous aurez peut-être compris, dans ce fichier, je fais un affichage d'un résultat, et il y a des catégories, et cette fonction permet d'afficher le nom de la catégorie, qui est dans une autre table, en partant de l'id de la catégorie qui est enregistré dans la table principale.

    En gros, la requête de base affiche un truc du genre

    Nom : Capture d’écran de 2022-01-11 11-04-32.png
Affichages : 270
Taille : 16,7 Ko

    Et je veux créer une fonction pour afficher les noms de Nature, Activité, ...

    Alors, mon bug, c'est que ca m'affiche une erreur et je comprend bien que c'est parce qu'il n'arrive pas à récupérer la connexion PDO contenu dans $db.
    Fatal error: Uncaught Error: Call to a member function prepare() on null in index.php:11 Stack trace: #0 /index.php(53): nature_nom('1') #1 {main} thrown in index.php on line 11

    Suis-je assez clair ? Avez vous besoin d'autres renseignements pour m'aider ?

    En tout cas, merci d'avance pour votre aide et ce tout ce qui pourra me faire avancer.

    Cordialement
    Randoo

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 368
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function nature_nom($id)
    {
    $sql_nature_nom = "SELECT * FROM geline_compta_nature WHERE nature_id =:id";
    $r_nature_nom = $db->prepare($sql_nature_nom);
    $db ne vaut rien dans ta fonction.

    Il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function nature_nom(PDO $db, $id)
    {
        $sql_nature_nom = "SELECT * FROM geline_compta_nature WHERE nature_id =:id";
        $r_nature_nom = $db->prepare($sql_nature_nom);
        ...
    }
    Et lors de l'appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nature = nature_nom($db, $id);
    Attention, tu fais un return dons ton foreach(), la boucle ne sera donc pas parcourue entièrement, seul le 1er résultat sera retourné.

  3. #3
    Membre habitué Avatar de randoo88
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Août 2018
    Messages : 8
    Par défaut
    Bonjour Seb,

    Merci pour ta réponse. Par curiosité, je ne peux pas faire pour que la variable $db puisse être valable dans la fonction sans devoir la "réintroduire" dans la déclaration de la fonction ?
    Sinon, je ferais comme tu me l'as indiqué.

    Pour le return, je vois très bien ce que tu veux dire, mais ce n'est pas grave, parce qu'il doit y avoir qu'une réponse possible à chaque fois, donc ce n'est pas grave.

  4. #4
    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,

    cf messages ci-après...

  5. #5
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut Éviter le mot global
    Bonjour

    Le mot global est à fuir, à l'opposé des bonnes pratiques. On ne sait jamais où est déclarée la variable, quel est son cycle de vie, etc.

    Il faut passer la variable comme paramètre à la fonction, ce qui d'ailleurs a été suggéré plus haut.

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 710
    Par défaut
    Citation Envoyé par cavo789 Voir le message
    Le mot global est à fuir, à l'opposé des bonnes pratiques.
    "à fuir" est un peu exagéré, cela peut être utile si on maitrise bien la structure de son application.
    une autre façon d'avoir accès à une ressource sans avoir besoin de la passer par chaque contexte est d'utiliser un singleton ce qui revient à peu près au même que d'utiliser une variable globale.

    vous pouvez trouver un exemple de classe de ce genre sur cette page :
    https://phpenthusiast.com/blog/the-s...pattern-in-php

  7. #7
    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
    Citation Envoyé par mathieu Voir le message
    "à fuir" est un peu exagéré, cela peut être utile si on maitrise bien la structure de son application.
    +1. Merci.

    1- De plus, je ne vois pas ce que ça apporte en terme de sécurité de la passer en paramètre de la fonction.

    Par définition, un paramètre est modifiable. Ce qui n'est pas ce qu'on veut ici !

    Entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function ma_fonction($db, ......)
    {
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $db = 'machin';
    ma_fonction($db, ......);
     
    $db = 'truc';
    ma_fonction($db, ......);
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function ma_fonction(......)
    {
       global $db;
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $db = 'machin';
    ma_fonction(......);
     
    $db = 'truc';
    ma_fonction(......);
    je ne vois pas bien le gain de "sécurisation"...

    MAIS je peux me tromper ! -> MERCI d'expliquer.... SANS moinsser svp...

    2- Une solution, qui me semble meilleure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function ma_fonction()
    {
       $db = connect_db();
    ...

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 368
    Billets dans le blog
    17
    Par défaut
    utiliser un singleton ce qui revient à peu près au même que d'utiliser une variable globale
    Le singleton "protège" l'instance, alors que $db en global pourrait être écrasée
    C'est quand même une grosse différence
    Après à l'utilisation, oui, c'est 1 ligne en début de fonction dans les deux cas

  9. #9
    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
    QUESTION * : et en écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $db = connect_db(); // en début de fichier
     
    function ma_fonction()
    {
       global $db;
    ...
    }
    function ma_fonction_2()
    {
       global $db;
    ...
    }
    Quels sont les risques (écrasement,...) ?

    * (c'est une vraie question)

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 368
    Billets dans le blog
    17
    Par défaut
    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
    <?php
    $db = connect_db(); // en début de fichier
     
    function ma_fonction()
    {
       global $db;
       ...
       Loooongue fonction
       ...
       $db = '(snip)'; // Tellement longue qu'on a oublié le global $db :mouarf:
       ...
    }
     
    function ma_fonction_2()
    {
       global $db;
       echo $db;
    }
     
    ma_fonction();
    ma_fonction_2(); // "(snip)"

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

Discussions similaires

  1. [PDO] erreur PDO dans fonction et ok hors fonction
    Par elcoyotos dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/11/2016, 13h17
  2. [PostgreSQL] PDO et fonction postgresql avec curseur
    Par thecanea dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 07/10/2011, 14h48
  3. [PDO] PDO : 'deprecates' fonctions pour connecter au BD
    Par 3logy dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 05/05/2010, 13h07
  4. [SQL] [php] PDO - fonction BindParam
    Par fadeninev dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 23/06/2006, 16h36

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