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 :

gestion des pages avec requêtes MySql [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut gestion des pages avec requêtes MySql
    Bonjour,
    je développe sous Debian, c'est beaucoup plus stable !

    j'ai une erreur qui apparais dans mon log, ou j'essaie de construire un tableau suite a une requête SELECT.
    voici l'extrait de mon code avec l'erreur indiqué par le log a la ligne 15 :
    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
    while ($data = $stmt->fetch())
    {
     echo '<table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
     
                    <tr>
                        <td><strong> Date : '.(htmlspecialchars($data['date_message_fr']).'</strong></td>
                    </tr>
                    <tr>
                         <td><strong> Ecrit par : '.(htmlspecialchars($data['pseudo'])).'</strong></td>
                    </tr>
                    <tr>   
                       <td><strong> Message :  '.(htmlspecialchars($data['message'])).'</strong></p></dt>
                    </tr>   
            </table><br /><br />'
    };  // erreur est ici
     
     echo '<p align="center">Page : ';
    extrait de mon log :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error:  syntax error, unexpected '}' in /var/www/html/cours/mini-chat/minichat.php on line 104, referer: http://127.0.0.1/cours/mini-chat/

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Le point virgule n'est pas au bon endroit
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut
    et bien j'ai essayé avant et après l' accolade j'ai toujours une erreur !

    Voici un extrait plus long :

    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
    $conn -> setAttribute ( PDO :: ATTR_EMULATE_PREPARES , false ); 
    $stmt = $pdo->prepare('SELECT pseudo, message, DATE_FORMAT(date_message, \'%d/%m/%Y à %Hh%imin\') AS date_message_fr FROM minichat ORDER BY ID DESC LIMIT ?,?');
    $stmt -> execute ([ $premiereEntree ,$retour_total  ]); 
    $data = $stmt->fetchAll();
    while ($data = $stmt->fetch())
    {
     echo '<table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
     
                    <tr>
                        <td><strong> Date : '.(htmlspecialchars($data['date_message_fr']).'</strong></td>
                    </tr>
                    <tr>
                         <td><strong> Ecrit par : '.(htmlspecialchars($data['pseudo'])).'</strong></td>
                    </tr>
                    <tr>   
                       <td><strong> Message :  '.(htmlspecialchars($data['message'])).'</strong></p></dt>
                    </tr>   
            </table><br /><br />'
    }
     
     echo '<p align="center">Page : '; //Pour l'affichage, on centre la liste des pages
    for($i=1; $i<=$nombreDePages; $i++) //On fait notre boucle
    {
         //On va faire notre condition
         if($i==$pageActuelle) //Si il s'agit de la page actuelle...
         {
             echo ' [ '.$i.' ] '; 
         }	
         else //Sinon...
         {
              echo ' <a href="minichat.php?page='.$i.'">'.$i.'</a> ';
         }
    }
    echo '</p>';
    $reponse->closeCursor();
    ?>
    erreur du log ligne 19

  4. #4
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Oui, il faut effectivement que tu termines toutes tes instructions pas un ";"
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  5. #5
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut
    avec ce code la :
    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
    $data = $stmt->fetchAll();
    while ($data = $stmt->fetch())
    {
     echo '<table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
     
                    <tr>
                        <td><strong> Date : '.(htmlspecialchars($data['date_message_fr']).'</strong></td>
                    </tr>
                    <tr>
                         <td><strong> Ecrit par : '.(htmlspecialchars($data['pseudo'])).'</strong></td>
                    </tr>
                    <tr>   
                       <td><strong> Message :  '.(htmlspecialchars($data['message'])).'</strong></p></dt>
                    </tr>   
            </table><br /><br />'
    };
     
     echo '<p align="center">Page : ';

    Dans mon log d'erreur je trouve ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error:  syntax error, unexpected '}' in /var/www/html/cours/mini-chat/minichat.php on line 104, referer: http://127.0.0.1/cours/mini-chat
    la ligne 16 avec "}" ne va pas, pourtant il bien que je ferme mon instruction while !

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

    Tu ne vois pas qu'il manque le point-virgule à la ligne précédente ?


  7. #7
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut
    toujours en erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                       <td><strong> Ecrit par : '.(htmlspecialchars($data['pseudo'])).'</strong></td>
                    </tr>
                    <tr>   
                       <td><strong> Message :  '.(htmlspecialchars($data['message'])).'</strong></p></dt>
                    </tr>   
            </table><br /><br />';
    };
     
     echo '<p align="center">Page : ';
    error: syntax error, unexpected ';' in /var/www/html/cours/mini-chat/minichat.php

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    PHP permet d'écrire du code très proprement, il faut encore se donner la peine d'utiliser toutes les syntaxes existantes : NOWDOC, HEREDOC...

    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
    $conn -> setAttribute ( PDO :: ATTR_EMULATE_PREPARES , false );
    $stmt = $pdo->prepare('SELECT pseudo, message, DATE_FORMAT(date_message, \'%d/%m/%Y à %Hh%imin\') AS date_message_fr FROM minichat ORDER BY ID DESC LIMIT ?,?');
    $stmt -> execute ([ $premiereEntree ,$retour_total  ]);
    $data = $stmt->fetchAll();
     
    $hsc = function($p) { return htmlspecialchars($p); };
     
    while ($data = $stmt->fetch())
    {
        echo <<<html
    <table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
        <tr><td><strong> Date : {$hsc($data['date_message_fr'])}</strong></td></tr>
        <tr><td><strong> Ecrit par : {$hsc($data['pseudo'])}</strong></td></tr>
        <tr><td><strong> Message : {$hsc($data['message'])}</strong></p></td></tr>
    </table><br /><br />
    html;
    }
     
    $pages = array_map(function($v) { return ' <a href="minichat.php?page='.$v.'">'.$v.'</a> ';}, range(1, $nombreDePages));
    $pages[$pageActuelle - 1] = "[{$pageActuelle}]";   
    echo '<p align="center">Page : ', implode('', $pages), '</p>';
    Au fait dans ton code tu avais écrit ceci : <td>...</dt>, toujours laisser reposer et se relire après

  9. #9
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      <td><strong> Date : '.(htmlspecialchars($data['date_message_fr']).'</strong></td>
    Il manque aussi une parenthèse (ou une en trop )

    Il faut ouvrir les yeux...

  10. #10
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut
    Je vous ai écouté et pratiqué les changement qui s"imposés !
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    <?php
    // Connexion à la base de données
    $messagesParPage=10;
    //$premiereEntree=0;
    //$total=0;
    $mindonnee=0;
    try
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'toto');
    }
    catch(Exception $e)
    {
            die('Erreur : '.$e->getMessage());
    }
     
     
    $conn -> setAttribute ( PDO :: ATTR_EMULATE_PREPARES , false );
    $retour_total = $pdo->prepare('SELECT COUNT(*) AS total FROM minichat') ;
    $retour_total-> execute ([$min_donnee, $donnees_total]);
    $total = $retour_total -> fetchAll (); 
     
     
    $nombreDePages=ceil($total/$messagesParPage);
     
     
     
    if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
    {
         $pageActuelle=intval($_GET['page']);
     
         if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
         {
              $pageActuelle=$nombreDePages;
         }
    }
    else // Sinon
    {
         $pageActuelle=1; // La page actuelle est la n°1    
    }
     
    $premiereEntree=($pageActuelle-1)*$messagesParPage;
     
     
    //$retour_messages=mysql_query('SELECT pseudo, message, DATE_FORMAT(date_message, \'%d/%m/%Y à %Hh%imin\') AS date_message_fr FROM minichat ORDER BY ID DESC LIMIT '.$premiereEntree.', '.$messagesParPage.'');
    $conn -> setAttribute ( PDO :: ATTR_EMULATE_PREPARES , false );
    $stmt = $pdo->prepare('SELECT pseudo, message, DATE_FORMAT(date_message, \'%d/%m/%Y à %Hh%imin\') AS date_message_fr FROM minichat ORDER BY ID DESC LIMIT ?,?');
    $stmt -> execute ([ $premiereEntree ,$retour_total  ]);
    $data = $stmt->fetchAll();
     
    $hsc = function($p) { return htmlspecialchars($p); };
     
    while ($data = $stmt->fetch())
    {
        echo <<<html
    <table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
        <tr><td><strong> Date : {$hsc($data['date_message_fr'])}</strong></td></tr>
        <tr><td><strong> Ecrit par : {$hsc($data['pseudo'])}</strong></td></tr>
        <tr><td><strong> Message : {$hsc($data['message'])}</strong></p></td></tr>
    </table><br /><br />
    html;
    }
     
    $pages = array_map(function($v) { return ' <a href="minichat.php?page='.$v.'">'.$v.'</a> ';}, range(1, $nombreDePages));
    $pages[$pageActuelle - 1] = "[{$pageActuelle}]";   
    echo '<p align="center">Page : ', implode('', $pages), '</p>';
    $reponse->closeCursor();
    ?>
     
    header('Location: minichat_post.php');

    mais j'ai une erreur de ma part a la ligne 47
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $retour_total-> execute ([$min_donnee, $donnees_total]);
    ou $min_donnee et surtout $donnee_total je ne sais pas comment définir cette variable d'encadrement $donnee_total car
    c'est le résultat que j'attens c'est a dire le nombre maximum d'enregistrements de ma table.

    pour touts savoir voici le code intégrale sans la page php qui est le retour de ma méthode DoPost.

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    <?php
    session_start();
    ?>
     
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8" />
            <title>Mini-chat</title>
        </head>
        <style>
        form
        {
            text-align:center;
        }
        </style>
        <body>
     
        <form action="minichat_post.php" method="post">
     
            <label for="pseudo">Pseudo</label> :  <input type="text" name="pseudo" placeholder= "pseudo" value="<?php if ($_SESSION['pseudo']){ echo  $_SESSION['pseudo'];} ?>"  /><br />
            <label for="message">Message</label> :  <input type="text" name="message" id="message" /><br />
     
            <input type="submit" value="Envoyer" />
    	</p>
        </form>
     
     
        </body>
    </html>
    <?php
    if ( $_SESSION["trouve"] != true) {
     
        echo "Tu es nouveau sur ce mini tchat, je vais faire ton inscription";
     
    } else
    {
        echo 'Tu es connus sur mini chat ', htmlspecialchars($_SESSION['pseudo']);
     
    }?>
    <?php
    // Connexion à la base de données
    $messagesParPage=10;
    //$premiereEntree=0;
    //$total=0;
    $mindonnee=0;
    try
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'toto');
    }
    catch(Exception $e)
    {
            die('Erreur : '.$e->getMessage());
    }
     
     
    $conn -> setAttribute ( PDO :: ATTR_EMULATE_PREPARES , false );
    $retour_total = $pdo->prepare('SELECT COUNT(*) AS total FROM minichat') ;
    $retour_total-> execute ([$min_donnee, $donnees_total]);
    $total = $retour_total -> fetchAll (); 
     
     
    $nombreDePages=ceil($total/$messagesParPage);
     
     
     
    if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
    {
         $pageActuelle=intval($_GET['page']);
     
         if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
         {
              $pageActuelle=$nombreDePages;
         }
    }
    else // Sinon
    {
         $pageActuelle=1; // La page actuelle est la n°1    
    }
     
    $premiereEntree=($pageActuelle-1)*$messagesParPage;
     
     
    //$retour_messages=mysql_query('SELECT pseudo, message, DATE_FORMAT(date_message, \'%d/%m/%Y à %Hh%imin\') AS date_message_fr FROM minichat ORDER BY ID DESC LIMIT '.$premiereEntree.', '.$messagesParPage.'');
    $conn -> setAttribute ( PDO :: ATTR_EMULATE_PREPARES , false );
    $stmt = $pdo->prepare('SELECT pseudo, message, DATE_FORMAT(date_message, \'%d/%m/%Y à %Hh%imin\') AS date_message_fr FROM minichat ORDER BY ID DESC LIMIT ?,?');
    $stmt -> execute ([ $premiereEntree ,$retour_total  ]);
    $data = $stmt->fetchAll();
     
    $hsc = function($p) { return htmlspecialchars($p); };
     
    while ($data = $stmt->fetch())
    {
        echo <<<html
    <table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
        <tr><td><strong> Date : {$hsc($data['date_message_fr'])}</strong></td></tr>
        <tr><td><strong> Ecrit par : {$hsc($data['pseudo'])}</strong></td></tr>
        <tr><td><strong> Message : {$hsc($data['message'])}</strong></p></td></tr>
    </table><br /><br />
    html;
    }
     
    $pages = array_map(function($v) { return ' <a href="minichat.php?page='.$v.'">'.$v.'</a> ';}, range(1, $nombreDePages));
    $pages[$pageActuelle - 1] = "[{$pageActuelle}]";   
    echo '<p align="center">Page : ', implode('', $pages), '</p>';
    $reponse->closeCursor();
    ?>
     
    header('Location: minichat_post.php');

    comment définir le nombre maximum d'enregistrements en utilisant le framework PDO, voici ce que j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $conn -> setAttribute ( PDO :: ATTR_EMULATE_PREPARES , false );
    $retour_total = $pdo->prepare('SELECT COUNT(*) AS total FROM minichat') ;
    $retour_total-> execute ([$min_donnee, $donnees_total]);
    $total = $retour_total -> fetchAll ();
    1/ou est mon erreur pour définir le total d'enregistrements ?
    2/ comment puis je avoir un log de la valeur de mes variables?

    Salutations
    Philippe

  11. #11
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu comprends ce que tu fais ?
    En ligne 30 tu clôtures le html et ensuite tu fais echo ?!!??
    La ressource base de données s'ouvre avec $bdd puis tu l'utilises sous $conn et enfin $pdo, non mais WTF ??
    Et que vient faire ici la redirection à la toute dernière ligne (en dehors des tags PHP en plus) ?

    Tu sais la programmation, c'est pas de la magie...
    Rigueur, précision, logique et mémoire sont les qualités essentielles pour coder.
    Le seul conseil que je peux te donner, c'est prends un tuto pas à pas ou un bon bouquin et reprend intégralement ton code au lieu de faire du copier coller.

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

    Citation Envoyé par rawsrc Voir le message
    La ressource base de données s'ouvre avec $bdd puis tu l'utilises sous $conn et enfin $pdo, non mais WTF ??
    Il est trop fort !

    Je vais quand même tenter une correction :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'toto');
    	$pdo->setAttribute ( PDO::ATTR_EMULATE_PREPARES , false );
     
    $retour_total = $pdo->prepare('SELECT COUNT(*) AS total FROM minichat') ;
    $retour_total->execute(); // RIEN ICI !
    $row = $retour_total->fetch(); // on récupère UNE SEULE ligne
    $total = $row['total'];
    Dans le cas présent, comme on n'a pas de paramètres à transmettre à la requête, on n'est pas obligé de la préparer :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $retour_total = $pdo->query('SELECT COUNT(*) AS total FROM minichat') ;
     
    $row = $retour_total->fetch(); // on récupère UNE SEULE ligne
    $total = $row['total'];


    N.B. et attention à ne PAS mettre des espaces là où il n'en faut pas !

  13. #13
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut
    Merci jreaux62 pour tes explications !

    Citation Envoyé par rawsrc Voir le message
    Salut,

    tu comprends ce que tu fais ?

    Et que vient faire ici la redirection à la toute dernière ligne (en dehors des tags PHP en plus) ?.
    la redirection en commentaire dernière ligne est pour traiter la page PHP avec un INSERT (elle ne sera pas visible), que je vais appliquer quand mon code sera parfaitement programmé, car je gère des cookies et des sessions mais cela marchent bien ! !

    Citation Envoyé par rawsrc Voir le message
    Tu sais la programmation, c'est pas de la magie...
    Rigueur, précision, logique et mémoire sont les qualités essentielles pour coder.
    Le seul conseil que je peux te donner, c'est prends un tuto pas à pas ou un bon bouquin et reprend intégralement ton code au lieu de faire du copier coller.
    Hélas tu as tords de me dire cela, car je suis un ancien, un ingé, je fait du JEE et du QT/C++, mais c'est vrai que toutes ces années passées j'ai fait l'impasse sur le langage PHP.
    Cela peut te paraitre contradictoire mais j'ai commencer la programmation en 1989 en fortran sur VAX en école d'ingé.
    Actuellement, je suis un cours en ligne ou je paye pour apprendre le langage PHP et approfondir mes connaissance en base de donnée.
    Je me suis aperçu comme un grand que les temps d'encodage d'un WEB en PHP était beaucoup plus court que en JEE...
    Deplus je ne travail pas sur Windows mais sur Linux et BSD (FreeBSD, NetBSD, OpenBSD)...

    Toute fois c'est vrai j'arrive sur ce langage PHP avec mes sabots et je ne fait pas de copier/coller sans réfléchir !
    J'essaie d'aquérir des bases en PHP qui est devenu un langage objets depuis sa version 5. Mon intérêt a pratiquer ce dernier car je n'est pas de problème de classes objets.
    Prochainement avant ma certification JEE je vais prendre un tuto simple mais obligatoire CSS3/HTML5 pour actualiser mes connaissances car la technologie avance...
    voila pour les explications !

    revenons a mes moutons,
    A la ligne 28 je comprends le "return" de la fonction elle n'est pas du type "void" elle retourne une valeur, mais le codage PHP est si différents que JAVA,
    C'est beaucoup plus optimisé !
    Par exemple un tableau dans une variable $mavariable, en faite $mavariable est du type "string" = ca faut faut le comprendre !



    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
    $total = $row['total'];
    //echo 'calcul total maxi enreg : ', $total;
     
    $nombreDePages=ceil($total/$messagesParPage);
     
     
    if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
    {
         $pageActuelle=intval($_GET['page']);
     
         if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
         {
              $pageActuelle=$nombreDePages;
         }
    }
    else // Sinon
    {
         $pageActuelle=1; // La page actuelle est la n°1    
    }
     
    $premiereEntree=($pageActuelle-1)*$messagesParPage;
     
     
    $stmt = $pdo->prepare('SELECT pseudo, message, DATE_FORMAT(date_message, \'%d/%m/%Y à %Hh%imin\') AS date_message_fr FROM minichat ORDER BY ID DESC LIMIT ?,?');
    $stmt -> execute ([ $premiereEntree ,$retour_total  ]);
    $data = $stmt->fetchAll();
     
    $hsc = function($p) { return htmlspecialchars($p); };
     
    while ($data = $stmt->fetch())
    {
        echo <<<html
    <table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
        <tr><td><strong> Date : {$hsc($data['date_message_fr'])}</strong></td></tr>
        <tr><td><strong> Ecrit par : {$hsc($data['pseudo'])}</strong></td></tr>
        <tr><td><strong> Message : {$hsc($data['message'])}</strong></p></td></tr>
    </table><br /><br />
    html;
    }
     
    $pages = array_map(function($v) { return ' <a href="minichat.php?page='.$v.'">'.$v.'</a> ';}, range(1, $nombreDePages));
    $pages[$pageActuelle - 1] = "[{$pageActuelle}]";   
    echo '<p align="center">Page : ', implode('', $pages), '</p>';
    $reponse->closeCursor();
    ?>
    Des lignes 24 à 26, j'ai deux paramètres : [ $premiereEntree ,$retour_total ] j'ai du mal à saisir le sens : est ce des tableaux ou des variables ?
    Cela doit être deux variable d'encadrement de la sortie des enregistrements du SELECT, franchement on a calculés les deux variable auparavant mais hélas je n'est pas le tableaux en HTML qui s'affiche, ni d'erreurs dans mes log sur Apache2.2 sous DEBIAN 8.8.
    Au finale j'obtiens le FORM (HTML) avec les boites de saisies et le bouton qui marche bien, je suis routé par la méthode POST a la page 2 ou je fait l'INSERT,
    j'ai vérifier sous MySql Workbench l' ajout du message horodaté, puis comme j'ai déactiver mes redirections automatique en manuel pour voir ce qu'il se passe.
    En faite la solution est proche !
    Il manque juste l"affichage du tableau HTML avec les pseudo, message et horodatage, je ne connais pas PDO, j'ai lu un tuto dédié PDO...
    Cela veux dire quoi WTF ?

    Salutations
    Philippe

  14. #14
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Comme tu n'es pas un newbie en programmation, tu devrais quand même éviter certains écueils. Perdre le nommage de variables en cours de route, c'est bon quand tu démarres, pas après 30 ans de programmation...

    Pour les valeurs numériques de la clause LIMIT, je t'invite à lire la doc par ici où tu verras que la première valeur correspond à l'offset (décalage) et la seconde à la longueur du jeu d'enregistrements que tu souhaites récupérer.

    Je t'invite à essayer toujours de placer tout le traitement PHP au début du fichier et à renvoyer le html à la fin.
    Utilise les multiples syntaxes en PHP pour rendre ton code lisible et propre.

    Ton code remanié intégralement :
    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
    61
    62
    63
    64
    65
    66
    67
    <?php
     
    try {
        $cnx = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'toto');
        $cnx->setAttribute(PDO::ATTR_EMULATE_PREPARES , false);
    } catch(Exception $e) {
        die('Erreur : '.$e->getMessage());
    }
     
    session_start();
     
    $hsc = function($p) { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); };    // closure qui permet de sécuriser les données HTML dangereuses
     
    $stmt                 = $cnx->query('SELECT COUNT(*) AS total FROM minichat');
    $nb_total_messages    = $stmt->fetchAll()[0]['total'];    // déréférencement de tableau à la volée
    $nb_messages_par_page = 10;
    $nb_pages             = ceil($nb_total_messages / $nb_messages_par_page) ?: 1;   // ?: opérateur ternaire court
     
    $page_courante = ((int)($_GET['page'] ?? 1)) ?: 1;      // synatxe PHP7   ?? remplace isset(...) ? true : false et ?: opérateur ternaire
    $page_courante = min($page_courante, $nb_pages);
     
    $start = ($page_courante - 1) * $nb_messages_par_page;
    $sql   = "SELECT pseudo, message, DATE_FORMAT(date_message, '%d/%m/%Y à %Hh%imin') AS date_message_fr FROM minichat ORDER BY ID DESC LIMIT {$start}, {$nb_messages_par_page}";
    $stmt  = $cnx->query($sql);
     
    $html_messages = '';
    while ($data = $stmt->fetch()) {
        $html_messages .= <<<html
    <table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
        <tr><td><strong> Date : {$hsc($data['date_message_fr'])}</strong></td></tr>
        <tr><td><strong> Ecrit par : {$hsc($data['pseudo'])}</strong></td></tr>
        <tr><td><strong> Message : {$hsc($data['message'])}</strong></p></td></tr>
    </table><br /><br />
    html;
    }
     
    $pages = array_map(function($v) { return ' <a href="minichat.php?page='.$v.'">'.$v.'</a> ';}, range(1, $nb_pages));
    $pages[$page_courante - 1] = "[{$page_courante}]";
    $html_pages = '<p align="center">Page : '.implode('', $pages).'</p>';
     
    $pseudo     = isset($_SESSION['pseudo']) ? $hsc($_SESSION['pseudo']) : '';
     
    $connected  = (($_SESSION['trouve'] ?? false) == true)  // attention : syntaxe PHP7 avec opérateur ternaire
                      ? "Tu es connu sur mini chat {$pseudo}"
                      : "Tu es nouveau sur ce mini chat, je vais faire ton inscription";
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <title>Mini-chat</title>
    </head>
    <style>
    form {
        text-align:center;
    }
    </style>
    <body>
    <p><?= $connected ?></p>
    <form action="minichat_post.php" method="post">
        <label for="pseudo">Pseudo</label> :  <input type="text" name="pseudo" placeholder= "pseudo" value="<?= $pseudo ?>"  /><br />
        <label for="message">Message</label> :  <input type="text" name="message" id="message" /><br />
        <input type="submit" value="Envoyer" />
    </form>
    <?= $html_messages, $html_pages ?>
    </body>
    </html>
    Ne gère pas la libération des ressources, le moteur PHP le fait pour toi et bien plus efficacement (closeCursor())

  15. #15
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut
    MERCI pour tes précieux conseil rawsrc
    Le code que tu m'as donné ne marche pas mais c'est pas très grave car tu n'as pas le schéma ou le modèle de mes tables en base de donnée !

    Je travail beaucoup avec Eclipse et QtCreator le code est formaté, deplus tu as la complétude des fonctions ou données !

    En PHP je passe par un éditeur de texte j'utilise "Kate" pour la coloration syntaxique, tu m'as donné la méthode pour encoder au plus propre.
    Donc j'ai fait de mon mieux pour éviter et surtout comprendre de faire un simple copier/coller.
    Toute la mécanique marche j'ai juste une erreur avec la requête SELECT, j'ai lu ton tuto d'Oracle sur la fonction LIMIT, j'ai bien compris.

    Je crois que ma requête SELECT ne sorte pas de valeurs sachant qu'il y a 151 enregistrements dans ma table.

    Voici mon code optimisé je ferais le tableau plus tard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $stmt = $pdo->prepare('SELECT pseudo, message, DATE_FORMAT(date_message, \'%d/%m/%Y à %Hh%imin\') AS date_message_fr FROM minichat ORDER BY ID DESC LIMIT ?,?');
    $stmt -> execute ([ $premiereEntree ,$messagesParPage ]);
    $donnees = $stmt->fetchAll();
     
    while ($donnees = $stmt->fetch())
    {
       echo '<p><strong>'  . htmlspecialchars($donnees['date_message_fr']).' >>  Pseudo -> '. htmlspecialchars($donnees['pseudo']) . '</strong> : ' . htmlspecialchars($donnees['message']) . '</p>';
     
    }
    si tu t'aperçois de quelque chose qui ne va pas dans cet extrait dit le moi !

    Salutations
    Philippe

  16. #16
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql   = "SELECT pseudo, message, DATE_FORMAT(date_message, '%d/%m/%Y à %Hh%imin') AS date_message_fr FROM minichat ORDER BY ID DESC LIMIT {$start}, {$nb_messages_par_page}";
    echo $sql;
    exit;
    Copie le code sql de la requête ainsi affiché puis exécute le directement dans ton interface base de données. Vois si elle te ramène quelque chose : données, erreur...
    Et en fonction tu corriges.

    Sache une chose : comme beaucoup, mes codes sortent du four, aucun test, rien, nada. Donc il se peut que des fois ça plante lamentablement.

    Dans ton code il y a un souci : $donnees = $stmt->fetchAll();, ici $donnees est un tableau avec tous les enregistrements, donc pour le parcourir, c'est foreach.
    Ou tu supprimes cette ligne et tu laisses tout simplement while ($donnees = $stmt->fetch())

  17. #17
    Invité
    Invité(e)
    Par défaut
    Oui, ou juste supprimer la ligne 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $donnees = $stmt->fetchAll();
    philo71, c'est bien d'avoir des" acquis" et 30 ans d'ancienneté.
    Mais ça ne doit pas empêcher d'APPRENDRE, et de te renseigner sur le fonctionnement exact et correct, notamment des fonctions PHP / PDO !

    Et pour ça, ON LIT LA DOC, et les exemples qui vont avec !




    Ne pas confondre :
    "Avoir de la bouteille"
    et :
    "Sentir le bouchon"

  18. #18
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut
    Merci a toute la Team de developpez surtout aux modérateurs, de m'avoir soutenu et aidé dans mes débuts laborieux en PHP
    Post/threads Résolue

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

Discussions similaires

  1. Gestion des fichiers avec PHP et MYSQL
    Par Lemignon2013 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/01/2015, 17h04
  2. [MySQL] Gestion des images avec PHP et MySQL
    Par helio500 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/06/2013, 09h39
  3. [MySQL] Gestion des checkbox avec mysql en smarty
    Par GuilVIII dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/12/2011, 07h38
  4. gestion des erreurs avec mysql
    Par kate59 dans le forum Langage
    Réponses: 2
    Dernier message: 09/09/2010, 09h22
  5. Gestion des tables d'association Mysql avec talend
    Par aldouillette dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 04/08/2010, 09h01

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