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 :

PHP7- Où est l'erreur?


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    PHP7- Où est l'erreur?
    Bonjour,
    Je réalise un exercice qui consiste à avoir :
    - une page (accueil.php) qui affiche la liste des 5 derniers articles ajoutés en base de données;
    - une page (TestComments.php) qui affiche le contenu d'un -seul- article choisi et les commentaires qui y sont associés qui sont également en base de données.

    Mon problème, mes requêtes chargées d'afficher chaque article et ses commentaires ne semblent pas fonctionner. En fait, les informations ne sont pas récupérées. A l'affichage, je n'ai pas d'erreur, mais les variables titre, commentaire, auteur, date n'apparaissent pas. A mes yeux, le problème serait peut-être au niveau du SELECT ....WHERE id = ? j'ai tenté de mettre plutôt WHERE id = :id mais là j'ai une erreur 'sqlstate hy093 invalid parameter number parameter was not defined'. J'ai beau cherché je ne vois pas comment écrire cette requête convenablement. Merci de votre aide.

    P.S.: J'ai créé les entrées des articles et des commentaires manuellement sur PHPMyAdmin, je fais quelque chose de basique pour l'instant. Mais je suis bloquée...pour l'instant
    J'ai mis une capture d'écran de ma page TestComments.php pour illustrer mon problème.

    accueil.php
    Code html :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
     
    <!DOCTYPE html>
    <html lang="fr" dir="ltr">
    	<head>
    		<meta charset="utf-8">
    		<title>Mon Super Blog</title>
    		<link rel="stylesheet" href="blog_style.css">
    	</head>
    	<body>
    		<h1>Bienvenu(e) sur mon Super-Blog et le vôtre <img src="images/smilies/icon_wink.gif" border="0" alt="" title=";)" class="inlineimg" />  !!!</h1><br><br><br>
    		<p>Derniers articles postés :</p><br>
     
    			<?php
     
                                    try
                                    {
                                            $connexion = new PDO('mysql:host=localhost;dbname=test_db_classroom;charset=utf8', '', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
                                    //      echo "Sandrine, you are well connected to your database ! <br /><br />";
                                    }
                                    catch(Exception $e)
                                    {
                                            die("Erreur : " . $e->getMessage());
                                    }
    // Récupération des 5 derniers articles.
                                            $requete = $connexion->query('SELECT titre, contenu, DATE_FORMAT(date_creation, "%d/%m/%Y à %Hh%imin%ss") AS all_date_creation, auteur  FROM articles_blog ORDER BY date_creation DESC LIMIT 0, 5');
                                            while ($reponse = $requete->fetch())
                                            {
                            ?>
    			<div class="news">
    				<h3>
    					<?php   echo htmlspecialchars($reponse['titre']); ?>
    					<em><?php echo "publié le " . $reponse['all_date_creation'] . " par " . $reponse['auteur']; ?></em>
    				</h3>
     
    				<p>
    					<?php
                    // Affichage d'un seul article.
                                            echo htmlspecialchars($reponse['contenu']);
                                            ?>
    					<br>
    					<em><a href="TestComments.php?article=<?php echo $reponse['id']; ?>">Commentaires</a></em>
    					</p>
    			</div>
    					<?php
                                            } // Fin de la boucle 'while fetch'
                                            $requete->closeCursor();
                                            ?>
    	</body>
    </html>


    TestComments.php
    Code html :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
     
    <!DOCTYPE html>
    <html lang="fr" dir="ltr">
    	<head>
    		<meta charset="utf-8">
    		<title>Super-Blog / Voir l'article</title>
    		<link rel="stylesheet" href="blog_style.css">
    	</head>
    	<body>
    		<h1>Les réactions sur cet article.</h1><br><br><br>
    		<p><a href="accueil.php">Retour sur la liste des articles</a></p><br>
     
    		<?php
     
                            try
                            {
                                    $connexion = new PDO('mysql:host=localhost;dbname=test_db_classroom;charset=utf8', '', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
            //                      echo "Sandrine, you are well connected to your database ! <br /><br />";
                            }
                            catch(Exception $e)
                            {
                                    die("Erreur : " . $e->getMessage());
                            }
    // Affichage d'un article à la fois: titre + contenu.
                                    $requete = $connexion->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, "%d/%m/%Y à %Hh%imin%ss") AS all_date_creation, auteur  FROM articles_blog WHERE id = ?');
                                    $requete->execute(array($_GET['article']));
                                    $reponse = $requete->fetch();
                    ?>
    		<div class="news">
    			<h3>
    				<?php   echo htmlspecialchars($reponse['titre']); ?>
    				<em>publié le <?php echo $reponse['all_date_creation'] . " par " . htmlspecialchars($reponse['auteur']); ?></em>
    			</h3>
     
    			<p>
    				<?php
            // Affichage d'un seul article.
                                    echo htmlspecialchars($reponse['contenu']);
                                    ?>
    			</p>
    		</div>
     
    		<h2>Commentaires</h2><br>
    			<?php
                            $requete->closeCursor(); // on libère le curseur juste avant d'entamer la requete suivante.
     
                            $requete = $connexion->prepare('SELECT auteur, commentaire, DATE_FORMAt(date_commentaire, "%d/%m/%Y à %Hh%imin%ss") AS all_date_commentaire  FROM commentaires_blog WHERE id_articles = ? ORDER BY date_commentaire');
                            $requete->execute(array($_GET['article']));
                            while ($reponse = $requete->fetch())
                            {
                            ?>
    			<p><?php  echo "<strong>" . htmlspecialchars($reponse['auteur']) . "</strong>" . " le " . $reponse['all_date_commentaire'] . "<br />" . htmlspecialchars($reponse['commentaire']); ?></p>
    			<?php
                            }
                            $requete->closeCursor();
                            ?>
    	</body>
    </html>

  2. #2
    Invité
    Invité(e)
    Bonjour,

    1- 2 méthodes :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    $requete = $connexion->prepare('SELECT .... WHERE id = ?');
    $requete->execute(array($_GET['article']));
    $reponse = $requete->fetch();

    ou :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    $requete = $connexion->prepare('SELECT .... WHERE id = :id');
    $requete->execute(array(':id'=>$_GET['article']));
    $reponse = $requete->fetch();


    2- Quant à ta problématique :
    que donnent :

  3. #3
    Membre à l'essai
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    $requete = $connexion->prepare('SELECT .... WHERE id = :id');
    $requete->execute(array(':id'=>$_GET['article']));
    $reponse = $requete->fetch();
    Le résultat est identique a 'SELECT .... WHERE id = ?'


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    echo $_GET['article'];
    n'affiche rien
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    var_dump( $reponse );
    affiche 'bool (false)' donc le $reponse est vide, c'est bien ça ? si oui, comment/pourquoi alors que le var_dump($requete) a ' object(PDOStatement)#2 (1) { ["queryString"]=> string(142) "SELECT id, titre, contenu, DATE_FORMAT(date_creation, "%d/%m/%Y à %Hh%imin%ss") AS all_date_creation, auteur FROM articles_blog WHERE id = ?" } '
    ?

  4. #4
    Invité
    Invité(e)
    Citation Envoyé par PetitPanda9 Voir le message
    echo $_GET['article']; n'affiche rien
    Et ça ne te met pas la puce à l'oreille ?


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		<p>Derniers articles postés :</p><br>
    			<?php
    ...
                                            $requete = $connexion->query('SELECT titre, contenu, DATE_FORMAT(date_creation, "%d/%m/%Y à %Hh%imin%ss") AS all_date_creation, auteur  FROM articles_blog ORDER BY date_creation DESC LIMIT 0, 5');
    ...
    					<em><a href="TestComments.php?article=<?php echo $reponse['id']; ?>">Commentaires</a></em>


    'SELECT titre, ...... FROM' : il manque id !
    Du coup, <?php echo $reponse['id']; ?> ne renvoie RIEN * !
    *(même pas une erreur, ce qui est étonnant... )

  5. #5
    Membre à l'essai
    Maintenant que vous avez mis le doigt dessus, ça me saute aux yeux. En fait je pensais bêtement que les valeurs passées dans le SELECT ne servent que pour l'affichage par le 'while fetch'.

    Merci de m'avoir corrigée et débloquée !

  6. #6
    Invité
    Invité(e)
    Citation Envoyé par PetitPanda9 Voir le message
    ...je pensais bêtement que les valeurs passées dans le SELECT ne servent que pour l'affichage par le 'while fetch'. ...
    C'est bien le cas !

    C'est pour ça qu'il faut y déclarer la colonneid, pour pouvoir la récupérer, et l'afficher dans le lien :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    					<em><a href="TestComments.php?article=<?php echo $reponse['id']; ?>">Commentaires</a></em>

  7. #7
    Membre à l'essai
    Oui j'ai compris maintenant.

    J'ai d'autres problèmes... Je fais un petit formulaire pour ajouter un commentaire sur un article.

    Code html :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <form class="formAjoutCom" action="ajout_comments.php" method="post">
    				<h4>Tu veux commenter toi aussi, c'est par ici <img src="images/smilies/icon_smile.gif" border="0" alt="" title=":)" class="inlineimg" /></h4>
    				<input type="text" name="pseudonyme" placeholder="Ecris ton pseudo ici"><br><br>
    				<textarea name="comments" placeholder="Saisis ton commentaire" rows="8" cols="50"></textarea><br><br>
    				<input type="submit" name="validation" value="Je poste mon commentaire !">
    </form>


    Problème: J'ai mis une condition pour ne pas recevoir des formulaires vides. Et si tel est le cas, je fais une redirection vers l'accueil.php. Le problème c'est que même quand les champs pseudo et commentaire sont remplis avec des caractères, il y a redirection. Je ne vois pas pourquoi le programme considère que les champs sont vides alors qu'ils ne le sont pas.
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (empty(($_POST['pseudonyme'])) == "" || (empty($_POST['comments'])) == "")
    {
    	header('Location: accueil.php');
    }




    Problème: En créant ma table commentaires_blog sur phpMyAdmin, j'avais donné au champ date_commentaire le type DATETIME. Lors de ma $requete INSERT INTO, j'ai privilégié la formulation d'insertion d'une ligne en spécifiant seulement les colonnes souhaitées (confer https://sql.sh/cours/insert-into) afin de n'avoir pas à gérer le champ date_commentaire. Pourtant quand j'essaye d'exécuter ma requête, j'ai une erreur me disant que je n'ai pas spécifié le champ date_commentaire. J'ai essayé de mettre une valeur par défaut, CURRENT_TIMESTAMP, mais rien ne va, il faut quand même mettre le champ date_commentaire dans l'array du execute(). Je ne sais pas comment faire.

    Voici l'erreur :
    Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1364 Field 'date_commentaire' doesn't have a default value in /home/sandrine/website/php_openClassRoom/Fonctions SQL/exoBlog/ajout_comments.php:19 Stack trace: #0 /home/sandrine/website/php_openClassRoom/Fonctions SQL/exoBlog/ajout_comments.php(19): PDOStatement->execute(Array) #1 {main} thrown in /home/sandrine/website/php_openClassRoom/Fonctions SQL/exoBlog/ajout_comments.php on line 19
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    else (isset($_POST['validation']))
    {
    	$requete = $connexion->prepare('INSERT INTO commentaires_blog(id_articles, pseudo, commentaire) VALUES(:id_articles, :pseudo, :commentaire)');
    	$reponse = $requete->execute(array(
    		"id_articles" => htmlspecialchars($_GET['id_articles']),
    		"pseudo" => htmlspecialchars($_POST['pseudo']),
    		"commentaire" => htmlspecialchars($_POST['commentaire'])
    	));
            $requete->closeCursor();
    	header('Location: commentaires.php');
    }


    Les deux problèmes sont peut-être liés, je cherche en vain depuis environ deux heures. Votre aide est la bienvenue.

  8. #8
    Invité
    Invité(e)
    Bonjour,


    1-
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    if( empty($_POST['pseudonyme']) || empty($_POST['comments']) )


    2- Fonctions SQL utiles pour les dates et les heures

    C'est NOW().

    3-
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    	$reponse = $requete->execute(array(
    		"id_articles" => htmlspecialchars($_GET['id_articles']),
    		"pseudo" => htmlspecialchars($_POST['pseudo']),

    NON !
    il ne faut PAS utiliser htmlspecialchars() ICI !
    htmlspecialchars() doit être utilisé au moment de l'AFFICHAGE.

    D'autre part, pourquoi id_articles est-il en $_GET ? (on ne le voit pas non plus dans le formulaire...)

  9. #9
    Membre à l'essai
    ] Je me disais que l'utilisateur n'est pas censé savoir quel est l'id de l'article qu'il commente, donc mettre un input pour id_articles dans le formulaire ne me semblait pas pertinent. Donc je me suis dit que j'allais simplement récupérer le id_articles de l'article qui est déjà affiché, à partir de l'URL. Comment faire alors?

    De plus, pourquoi mon INSERT INTO génère des erreurs alors que je ne suis pas obligée de lui passer tous les champs de ma table? Comment comment contourner ça?

    Voici mon code, il n'y a pas grand chose de changé, mais c'est pour que vous voyiez mes lacunes.

    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
    18
    19
    20
     
    if ( empty($_POST['pseudonyme']) || empty($_POST['comments']) )
    	{
    		header('Location: accueil.php');
    	}
     
    	$datetime = NOW("%d/%m/%Y à %Hh%imin%ss"); // je voudrais insérer la date et l'heure sous le format day/month/year et Heure/Mininute/Seconde
     
    	if (isset($_POST['validation']))
    	{
    		$requete = $connexion->prepare('INSERT INTO commentaires_blog (id_articles, pseudo, commentaire, date_commentaire) VALUES(:id_articles, :pseudo, :commentaire, NOW())');
    		$reponse = $requete->execute(array(
    			"id_articles" => ?? 
    			"pseudo" => ($_POST['pseudo']),
    			"commentaire" => ($_POST['commentaire']),
    			"date_commentaire" => $datetime // qu'est-ce que je dois mettre ici?
    		));
    		$requete->closeCursor();
    		header('Location: commentaires.php');
    	}


    Merci de vos éclaircissements.

  10. #10
    Invité
    Invité(e)
    C'est de la programmation.
    Pas de la magie...

    1- Il faut transmettre l'id via <input type="hidden">.

    2- NOW(), c'est du SQL !
    Et le format SQL DATETIME est de la forme yyyy-mm-dd hh:mm:ss


    N.B. il faut que tu lises des tutos, et fasses des exercices, pour acquérir un minimum de bases.
    Et chercher la doc quand on ne sait pas :