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 :

Connexion et fermeture de la base de donnée.


Sujet :

PHP & Base de données

  1. #1
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut Connexion et fermeture de la base de donnée.
    Bonjour à toutes et tous,

    En terme de performance et de sécurité, est-il préférable "d'ouvrir" et fermer sa base de donnée à chaque requête SQL et à chaque "sous-requête"?
    Un peu comme illustré ci-dessous:

    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
     
    <?php
    if (isset($_SESSION['Abcd']))
    {
    $MyBase=new mysqli(Host,User,Pass,Name);
    // Requète SQL... Array... etc...
    $MyBase->close();
     
      if (isset($_POST['Efgh']))
      {
      $MyBase=new mysqli(Host,User,Pass,Name);
      // Requète SQL... Array... etc...
      $MyBase->close();
      } 
    }
    ?>

    Ou, au contraire, "ouvrir" un fois la base au début d'une session par exemple, y faire différentes requêtes et "sous-requêtes" et fermer la base avant la fin de la session.
    Un peu comme illustré ci-dessous:

    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
     
    <?php
    if (isset($_SESSION['Abcd']))
    {
    $MyBase=new mysqli(Host,User,Pass,Name);
    // Requète SQL... Array... etc...
     
      if (isset($_POST['Efgh']))
      {
      // Requète SQL... Array... etc...
      }
    $MyBase->close();  
    }
    ?>

    Laquelle de ces 2 versions de code php est plus performante et plus sûre?

  2. #2
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Une connexion par page ça suffit.
    Si la première dans une page n’est pas « sure » pourquoi la seconde le serait plus ?
    Ce sont surtout les requêtes SQL qu’il faut sécuriser. Ou plus généralement toutes les données en entrée dans tes pages.

  3. #3
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut
    Bonjour badaze

    Ah oui... Veux-tu dire une ouverture et une fermeture comme ilustré ci-dessous:
    Mais si j'ai une redirection, $MyBase ne sera pas proprement fermée. Serait-ce un problème?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    $MyBase=new mysqli(Host,User,Pass,Name);
     
    if (isset($_GET['Xyz'])) {header('location:OtherPage.php';} 
     
    if (isset($_SESSION['Abcd']))
    {
    // Requète SQL... Array... etc...
    }
    $MyBase->close();  
    ?>

    Je suppose que toute éventuelle redirection devrait alors être positionnée avant l'ouverture de la base comme ilustré ci-dessous:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    if (isset($_GET['Xyz'])) {header('location:OtherPage.php';} 
     
    $MyBase=new mysqli(Host,User,Pass,Name);
     
    if (isset($_SESSION['Abcd']))
    {
    // Requète SQL... Array... etc...
    }
    $MyBase->close();  
    ?>

    Pour sécuriser les données et les requêtes SQL, je fais comme ci-dessous. Est-ce Ok?

    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
     
    <?php
    $MyBase=new mysqli(Host,User,Pass,Name);
     
    $Mail=filter_var(trim($_POST['mail']),FILTER_VALIDATE_EMAIL);
    $Var=filter_var(trim($_GET['Var']),FILTER_SANITIZE_STRING);
     
    $Statement=$MyBase->prepare('UPDATE abcd SET Mail=? WHERE Var=?');
    $Statement->bind_param('ss', $Mail, $Var); $Ok1=$Statement->execute();
     
    // et/ou aussi comme suit
     
    $Statement=$Base->prepare('INSERT INTO abcd (Mail, Var) VALUES (?,?)');
    $Statement->bind_param('ss', $Mail, $Var); $Ok2=$Statement->execute(); 
     
    $MyBase->close();  
    ?>

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Citation Envoyé par olivierdauxais Voir le message
    Bonjour badaze

    Ah oui... Veux-tu dire une ouverture et une fermeture comme ilustré ci-dessous:
    Mais si j'ai une redirection, $MyBase ne sera pas proprement fermée. Serait-ce un problème?
    Aucun problème, PHP fait ça très bien tout seul :
    Les connexions et les jeux de résultats ouverts de façon non persistente sont automatiquement détruits lorsqu'un script PHP termine son exécution.
    mysqli::close

    Fermer les connexions manuellement se fait en général dans 2 cas :
    Si tu utilises des connexions persistantes. Comme leur nom l'indique, les connexions persistantes persistent après la fin du script et doivent être fermées manuellement lorsqu'elles ne sont plus nécessaires.
    Si tu veux libérer des ressources. Par exemple, tu fais des accès bases en début de script, et ensuite tu fais plein de traitements sans interaction avec la base. Dans ce cas, il peut être intéressant de fermer la connexion dès que tu n'en as plus besoin pour libérer de la mémoire et une connexion à la base pour un autre script (si tu as un nombre de max de connexions possibles par exemple)
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut
    Merci Celira pour ta réponse.

    A vrai dire, je ne sais nullement si j'utilise des connexions de type persistante.

    Est-ce que le code que j'ai cité dans mon précédent post correspond à une connexion persistante?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,


  7. #7
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut
    Merci jreaux62 pour ton lien.
    Mais la doc officielle de php n'est vraiment pas ma tasse de thé.
    C'est un manuel de technicien pour des techniciens. Très bien sur ce point là...

    Mais lorsqu'on n'est pas un technicien, on est vite perdu.
    Ils sont vraiment très nuls en terme de pédagogie et de transmission de leur savoir.

  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Les connexions persistantes sont à réserver à des cas particuliers. Donc il y a assez peu de chances que tu en ais besoin. Donc à moins que tu n'aies copié un code qui ouvrait une connexion persistante, il n'y a pas de raison que tu en utilises.

    Pour revenir au code pur, pour ouvrir une connexion persistante, il faut préfixer le nom d'hôte par "p:" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pMysqli = new mysqli('p:'.DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  9. #9
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut
    Merci beaucoup Celira pour cette explication très bien illustrée.
    En effet, je n'utilise pas de connexion persistante.

Discussions similaires

  1. Réponses: 9
    Dernier message: 27/05/2008, 10h48
  2. Comment créer une connexion entre Delphi et une base de données ?
    Par pttangediabolik dans le forum Débuter
    Réponses: 2
    Dernier message: 29/04/2008, 14h59
  3. Délai de connexion trop court de la base de données!
    Par benoit_az01-er02 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/03/2008, 18h11
  4. connexion de JSP avec une base de données insertion
    Par sousou_ dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 28/12/2006, 13h59
  5. Connexion de Delphi avec une base de données Oracle 9i
    Par Price dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/12/2005, 12h38

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