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 :

passer aux fonction msqli


Sujet :

Langage PHP

  1. #1
    Membre actif
    Homme Profil pro
    électronicien
    Inscrit en
    Octobre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : électronicien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 225
    Points : 236
    Points
    236
    Par défaut passer aux fonction msqli
    Bonjour. J'espère être dans la bonne cat? Mon problème se situe au niveau des nouvelles function msqli
    Voila ce que j'ai fait: J'ai 2 functions:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    function sqliconnect() {
        debug("sqliconnect() ");
        $mysqli = mysqli_connect(SERVER,LOGIN,PASSWORD,DB);
        if (mysqli_connect_errno($mysqli)) {
            echo "Echec lors de la connexion a MySQL : " . mysqli_connect_error();
            return false;
        }
     
        global $mysqli;
        return $mysqli;
    }
     
    //-----------------------------------------------------------------------------------------------------------------------------
    function sqli_select($sql) {  
        debug("sqli_select()");
        if(!substr_count(strtolower($sql), 'select') ) {
           print"Expression mauvaise. sqli_select() est annulé.   ".$sql.'</br>';
           return FALSE;
        }
        if(isset($GLOBALS[mysqli])) {$mysqli= $GLOBALS[mysqli]; }
        else    { $mysqli= sqliconnect();}
     
        if(isset($GLOBALS[mysqli])) {$mysqli= $GLOBALS[mysqli]; }
        else    { $mysqli= sqliconnect();}
     
        $query = mysqli_query($mysqli, $sql );  
        $row_count= mysqli_num_rows($query);
        if(!$row_count){ 
            print"Aucun enregistrement trouvé".mysqli_error($query).'</BR> SQL= '.$sql.'</BR>';
            return FALSE;        
        }
    sqli_select($sql) est chargé de renvoyer la réponse à la requète $sql....
    Pour se faire la connexion doit être établie avec la table mysql.
    C'est le rôle de la 1ere function sqliconnect()
    Je n'ai aucune erreur dans la 1ere function, mais la 2e ne fonctionne pas. On dirait que la variable n'est pas transmise alors que l'on est dans la même page. $row_count=null

    Si quelqu'un veut bien se pencher sur mon cas, Ça me dépannerait bien. Ça fait 3 heures que je galère.
    (J'ai répété 2 fois l'appel à sqliconnect() pour être sur à travers les logs, que c'est bien $mysqli qui ne passe pas.)

    Je vous remercie.
    Débusqueur de bug et chercheur en améliorations

  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
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu fais un contresens : "global" se met dans la fonction qui utilise la variable, pas dans la fonction qui produit la variable.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre actif
    Homme Profil pro
    électronicien
    Inscrit en
    Octobre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : électronicien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 225
    Points : 236
    Points
    236
    Par défaut
    Merci de ton aide. J'ai bien supprimé
    Mais le problème reste inchangé.
    Le nom de ma variable est peut être un nom réservé .....
    Débusqueur de bug et chercheur en améliorations

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Normalement on passe l'identifiant de connexion comme argument dans la fonction.

    Si non on fait une classe de connexion statique, exemple ici. Adapté à ton cas cela pourrait donner ça :

    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
    22
    23
    24
    25
    26
    27
    class MySqliConnect {
     
        private static $instance;
     
    	private function __construct() {
    		self::$instance = @mysqli_connect(SERVER,LOGIN,PASSWORD,DB) or exit("Impossible de se connecter à la base de donnée");
     
                    // Si tu travaille en utf-8
                    mysqli_set_charset(self::$instance,'utf8');
    	}
     
            public static function getC() {
    		if(!isset(self::$instance) || self::$instance == null) {
    			new MySqliConnect();
    		}
    		return self::$instance; 
    	}
    }
     
     
    // Maintenant tu peux appeler une instance de ta connexion depuis n'importe qu'elle fonction ou classe avec "MySqliConnect::getC()".
    function sqli_select($sql) {  
     
        $mysqli = MySqliConnect::getC();
     
       //...
    }
    L'avantage c'est que ta connexion ne sera faite qu'une fois quelque soit le nombre d'appels à la fonction de connexion et c'est bien plus propre et sécurisé qu'une variable globale.

  5. #5
    Membre actif
    Homme Profil pro
    électronicien
    Inscrit en
    Octobre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : électronicien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 225
    Points : 236
    Points
    236
    Par défaut
    Merci de vous être penché sur ce cas. C'est sympa. J'ai résolu mon problème en déclarant ma variable de connexion global avant de la créer. J'y accède maintenant aisément. Je pense que pour la sécurité comme en parle ABCIWEB il y a des questions à se poser, mais pour l'instant je reconstruis un projet procédurale et non orienté objet.
    Je reste ouvert au sujet. Encore merci.
    Débusqueur de bug et chercheur en améliorations

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Tu fais du procédural mais rien ne t'empêche d'utiliser une classe de connexion dans ton code procédural, il n'y a aucun inconvénient, au contraire.

    L'avantage de ce type de classe statique est qu'elle ne sera instanciée qu'une fois et donc tu peux l'appeler autant de fois que tu veux sans refaire une nouvelle connexion en utilisant celle déjà ouverte.

    Ce n'est pas le cas avec ta fonction de connexion qui tente d'ouvrir une nouvelle connexion chaque fois qu'on l'appelle. Donc prends soin de ne l'utiliser qu'une seule fois car refaire de nouvelles connexions est pénalisant pour le serveur et pour la rapidité d'exécution du code.

    Concrètement tu ne dois pas faire cela dans tes fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function sqli_select($sql) {  
        ...
        else    { $mysqli= sqliconnect();}
    car si ce code est répété dans d'autres fonctions, ton code risque de tenter d'ouvrir de nombreuses connexions alors qu'il devrait se servir de celle déjà ouverte.

    Un autre avantage d'avoir une classe de connexion est que tu ne risque plus de conflits de variables comme avec des variables globales.

    Et puis de nombreuses fonctions php sont maintenant des classes donc même en procédural tu utilises des classes, ce n'est pas pour autant que ton code est orienté objet. "Orienté objet" c'est une philosophie de développement, ce n'est pas juste utiliser une ou plusieurs classes dans le code.
    Utiliser une classe de connexion ne t'oblige en rien à modifier ton code ou sa logique, c'est simplement un truc pratique pour appeler ta connexion depuis n'importe quel endroit de ton script sans te poser de question

  7. #7
    Membre actif
    Homme Profil pro
    électronicien
    Inscrit en
    Octobre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : électronicien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 225
    Points : 236
    Points
    236
    Par défaut
    Bonjour. En globalisant la variable, 1 seule connexion se fait par page PHP. Si j'ai de multiples demande MYSQL ma variable reste active. Par contre contre comme elle n'est pas transmise en POST ou en GET, elle se perd, et un nouvel appel est lancé. Je ne connais pas de solution pour garder cette variable en mode procédural
    Avec le langage Orienté Objet, je ne sais pas, non plus, comment cette variable devrait être conservée. Il manque quelque chose à ma culture....
    Merci de ton intérêt.
    Débusqueur de bug et chercheur en améliorations

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Quand tu change de page c'est assez normal de tout rafraichir, par contre quand tu fais une requête post pour traiter un formulaire par exemple rien ne t'empêche de faire exécuter le code dans la même page, soit directement, soit en appelant un fichier par include.

  9. #9
    Membre actif
    Homme Profil pro
    électronicien
    Inscrit en
    Octobre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : électronicien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 225
    Points : 236
    Points
    236
    Par défaut
    Merci de cette réponse pertinente. Je vais faire quelques essais....
    Débusqueur de bug et chercheur en améliorations

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

Discussions similaires

  1. Passer des fonctions aux objets ?
    Par thibaud74 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/02/2010, 21h20
  2. Réponses: 4
    Dernier message: 28/03/2005, 12h37
  3. [Conception] Passer une fonction en paramètre
    Par pejay dans le forum Langage
    Réponses: 9
    Dernier message: 09/12/2004, 13h58
  4. Réponses: 4
    Dernier message: 10/11/2004, 14h58
  5. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 13h41

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