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 :

new PDO vs le bon vieux mysql_connect


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2018
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2018
    Messages : 48
    Points : 36
    Points
    36
    Par défaut new PDO vs le bon vieux mysql_connect
    Bonjour tout le monde,

    Me revoilà après un certain temps à m'occuper d'autres priorités. Disposant d'un peu plus de temps, je me suis dit que ce serait une bonne idée de remettre à jour mon vieux site codé en php MySQL avec un savant mélange de copier/coller de bout de codes trouvé ici et là.

    Le site fonctionnait jusqu'à ce que new PDO vienne remplacer le bon vieux mysql_connect que j'utilisais à tour de bras dans mes pages. Je demande donc votre aide pour me montrer comment récrire le code ci-dessous en exemple pour que je puisse ensuite faire comme les chinois c'est à dire, copier ce qui marche pour en faire un truc qui fonctionne plus ou moins mal.

    J'ai essayé de lire quelques articles et livres sur comment programmer avec les normes plus récentes mais je sais pas, je dois avoir le cerveau déficient parce que je n'arrive à rien.

    Si l'un de vous à pitié de moi pour me réécrire le bout de code suivant, je lui en serais reconnaissant.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
    							<!-- CONNEXION ET REQUETE POUR LES HEBERGEMENTS -->
    <?php
             // on enregistre Matricule en plus de l'id du membre dans une variable de session 
     
     
    $base = mysql_connect ("localhost", "utilisateur", "mot2pass");
    mysql_select_db("laBD", $base); 
    mysql_query("SET NAMES 'utf8'");
    // Récupération du contenu des champs de la table mob_T_HebergementLOG
     
    $sql = 'SELECT HebergementLOG_id, User_id, mob_T_HebergementLOG.Hebergement_id, Nom, Adresse, Code_postal, Ville, Date_arrivee, Date_depart, Commentaires FROM mob_T_HebergementLOG, T_Hebergements WHERE User_id = \''.$_SESSION['User_id'].'\' AND mob_T_HebergementLOG.Hebergement_id=T_Hebergements.Hebergement_id ORDER BY Date_Arrivee' ;
     
    // lancement de la requete SQL  
     
    $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
    $nb = mysql_num_rows($req);  
     
    if ($nb == 0) {  
     
       echo '<mark>Vous n\'avez aucun hébergement enregistré.</mark><br /><br />';  
    }
    if ($nb == 1) {  
     
       echo 'Vous avez un hébergement enregistré.<br /><br />';  
    }  
    else
       echo '<mark>Attention, vous avez <B>'.$nb.'</B> hébergements enregistrés.</mark><br /><br />';  
    	  { 
       // si on a des enregistrements, on affiche les dates ainsi que les renseignements
       while ($data = mysql_fetch_array($req)) { 
     
    	  echo 'Du   <B>', $data['Date_arrivee'] , ' </B>';
    	  echo 'Au  <B>', $data['Date_depart'], ' </B><br />';
    	  echo 'Lieu d\'hébergement : <B>', $data['Nom'], ' </B><br />';
    	  echo 'Adresse: ', $data['Adresse'],", ", $data['Ville'],", ", $data['Code_postal'], ' <br />';
    	  echo 'Commentaires: <I>', $data['Commentaires'], ' </I><br /><br />';
     
     
     
       }  
     
    } 
    mysql_free_result($req);  
    mysql_close();  
    ?>

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

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

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Points : 1 280
    Points
    1 280

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Cela pourrait donner ceci :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <?php
     
    $db_host = 'localhost';
    $db_name = 'laDB';
    $db_user = 'utilisateur';
    $db_password = 'mot2pass';
    $db_dsn = "mysql:host={$db_host};dbname={$db_name};charset=utf8";
     
    $pdo = new PDO($db_dsn, $db_user, $db_password);
     
    $sql = <<<SQL
        SELECT ALL HebergementLOG_id, User_id, mob_T_HebergementLOG.Hebergement_id, Nom, Adresse, Code_postal, Ville, Date_arrivee, Date_depart, Commentaires 
        FROM mob_T_HebergementLOG
        INNER JOIN T_Hebergements ON mob_T_HebergementLOG.Hebergement_id = T_Hebergements.Hebergement_id 
        WHERE User_id = {$pdo->quote($_SESSION['User_id'])}
        ORDER BY Date_Arrivee ASC
        SQL;
     
    $statement = $pdo->query($sql);
     
    if ($statement !== false) {
        $data = $statement->fetchAll();
        $data_count = count($data);
    }
     
    ?>
     
    <?php if ($statement === false): ?>
     
        Erreur SQL !<br>
        <pre><?= $sql ?></pre>
        <pre><?= print_r($pdo->errorInfo(), true) ?></pre>
     
    <?php elseif ($data_count === 0): ?>
     
        <mark>Vous n'avez aucun hébergement enregistré.</mark><br>
        <br>
     
    <?php elseif ($data_count === 1): ?>
     
        <mark>Vous avez un hébergement enregistré.</mark><br>
        <br>
     
    <?php else: // $data_count >= 2 ?>
     
        <mark>Attention, vous avez <b><?= $data_count ?></b> hébergements enregistrés.</mark><br>
        <br>
     
        <?php foreach ($data as $tuple): ?>
     
            Du <b><?= $tuple['Date_arrivee'] ?></b><br>
            Au <b><?= $tuple['Date_depart'] ?></b><br>
            Lieu d'hébergement : <b><?= $tuple['Nom'] ?></b><br>
            Adresse : <?= $tuple['Adresse'] ?>, <?= $tuple['Ville'] ?>, <?= $tuple['Code_postal'] ?><br>
            Commentaires : <i><?= $tuple['Commentaires'] ?></i><br>
            <br>
     
        <?php endforeach ?>
     
    <?php endif ?>
    Garanti sans tests
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2018
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2018
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Merci à vous, je vais tester cela et je vous reviens

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2018
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2018
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Ça fonctionne à 95% :-) merci, il me reste à régler le problème de récupération du User_id pour le filtre sur l'utilisateur en cours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE User_id = {$pdo->quote($_SESSION['User_id'])}
    Actuellement si j’inscris manuellement le User_id à la place de $_SESSION['User_id'], tout fonctionne
    Le code ne fonctionne pas pour le moment car SESSION['User_id'] correspond au champ Matricule saisie à la page de login et non au champ User_id de la table employees

    Il faut que je trouve un moyen de récupérer le User_id de l'utilisateur loggé directement dans la requête
    Ça semble simple mais quand j'essaie, la requête plante complétement (page blanche)

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

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

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Points : 1 280
    Points
    1 280
    Par défaut
    Une variante (si tu as lu le tuto) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $sql = <<<SQL
        SELECT ALL HebergementLOG_id, User_id, mob_T_HebergementLOG.Hebergement_id, Nom, Adresse, Code_postal, Ville, Date_arrivee, Date_depart, Commentaires 
        FROM mob_T_HebergementLOG
        INNER JOIN T_Hebergements ON mob_T_HebergementLOG.Hebergement_id = T_Hebergements.Hebergement_id 
        WHERE User_id = :User_id
        ORDER BY Date_Arrivee ASC
        SQL;
    // preparation
    $statement = $pdo->prepare($sql);
     
    // execution
    $statement = $pdo->execute( array(':User_id' => $_SESSION['User_id']) );
    AVANTAGES de la préparation PDO :
    • la préparation permet de SÉCURISER la requête contre les injections SQL
    • on ne prépare la requête qu'une fois
    • on peut l'exécuter plusieurs fois (avec des paramètres différents, dans une boucle while, par exemple)


    D'autre part, (si tu as lu le tuto) il est plus judicieux de mettre tout le script de connexion dans un fichier db_mysql.php.
    Ça évite de copier partout les paramètres !

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Actuellement si j’inscris manuellement le User_id à la place de $_SESSION['User_id'], tout fonctionne
    Le code ne fonctionne pas pour le moment car SESSION['User_id'] correspond au champ Matricule saisie à la page de login et non au champ User_id de la table employees
    Et comment ça fonctionne avec le script initial ? La logique n'a pas changé !

    Pourquoi mettre un matricule et pas l'User_id en session, qui plus est dans un champ "User_id" ? Cela se joue au moment de l'authentification et de la valorisation de $_SESSION.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2018
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2018
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Et comment ça fonctionne avec le script initial ? La logique n'a pas changé !

    Pourquoi mettre un matricule et pas l'User_id en session, qui plus est dans un champ "User_id" ? Cela se joue au moment de l'authentification et de la valorisation de $_SESSION.
    En fait ça marchait pas non plus sans que je ne le sache vraiment. La page des Hébergements est l'une des dernières que j'avais montée et comme je n'avais testé que le cas d'une seul user, je ne mettais pas aperçu que la requête me retournait en fait toute la table sans filtrer sur l'utilisateur loggé. (pas fort je sais :-))

    Je vais m'essayer avec vos indications et je vous tiens au courant . Encore merci !

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

Discussions similaires

  1. List(Of T) ou bon vieux tableaux ?
    Par Norris dans le forum VB.NET
    Réponses: 4
    Dernier message: 13/06/2010, 23h01
  2. [PDO] Erreur HY000 lors d'un New PDO pour une connexion sur Mysql
    Par siciliano21 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 22/07/2009, 15h19
  3. les bons vieux recordsets
    Par stdebordeau dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/05/2009, 19h27
  4. Réponses: 6
    Dernier message: 22/04/2009, 01h45
  5. Ce bon vieux "If"
    Par Kstark dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/02/2007, 09h03

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