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 :

PHP7- Où est l'erreur?


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Femme Profil pro
    Reconversion professionnelle en web développeur
    Inscrit en
    Avril 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Reconversion professionnelle en web développeur

    Informations forums :
    Inscription : Avril 2020
    Messages : 17
    Points : 11
    Points
    11
    Par défaut 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 ;)  !!!</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>
    Images attachées Images attachées  

  2. #2
    Invité
    Invité(e)
    Par défaut
    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
    Femme Profil pro
    Reconversion professionnelle en web développeur
    Inscrit en
    Avril 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Reconversion professionnelle en web développeur

    Informations forums :
    Inscription : Avril 2020
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    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 = ?'


    n'affiche rien
    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)
    Par défaut
    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
    Femme Profil pro
    Reconversion professionnelle en web développeur
    Inscrit en
    Avril 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Reconversion professionnelle en web développeur

    Informations forums :
    Inscription : Avril 2020
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    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)
    Par défaut
    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
    Femme Profil pro
    Reconversion professionnelle en web développeur
    Inscrit en
    Avril 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Reconversion professionnelle en web développeur

    Informations forums :
    Inscription : Avril 2020
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    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 :)</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)
    Par défaut
    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
    Femme Profil pro
    Reconversion professionnelle en web développeur
    Inscrit en
    Avril 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Reconversion professionnelle en web développeur

    Informations forums :
    Inscription : Avril 2020
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    ] 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)
    Par défaut
    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 :

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 30/01/2006, 14h21
  2. Où est l'erreur?
    Par Paulinho dans le forum C++
    Réponses: 3
    Dernier message: 26/10/2005, 09h48
  3. [VB.NET] Pagination DataGrid (où est l'erreur?)
    Par franculo_caoulene dans le forum ASP.NET
    Réponses: 2
    Dernier message: 25/10/2004, 11h46
  4. Ou est l'erreur ?
    Par Antoine NSG dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/09/2004, 10h56
  5. [Erreur] Quel est cette erreur?
    Par netah25 dans le forum C++Builder
    Réponses: 3
    Dernier message: 11/08/2004, 10h16

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