Un conseil quand tu dois gérer des requêtes, vérifies qu'elles fonctionnent bien directement sur PhpMyAdmin ^^.
Comme ça tu n'as plus qu'à la mettre en place sur php, tu sais qu'elle est fonctionnelle.
Concernant ton problème, tu prépares une requête sans marqueurs, et dans ton execute, tu indiques un array qui n'a visiblement rien à faire là. C'est sûrement ça qui coince.
un exemple de préparation de requête
$requete = $bdd->prepare('SELECT * from table where id = :id');
$requete->execute(['id' => 123]);
// revient à faire (en sécurisé)
'SELECT * FROM table where id = 123;'
En gros si tu as des marqueurs dans ta requête, tu mets dans ton execute à quoi chaque marqueur correspond.
Si tu n'as pas de valeur particulière à passer, tu 'nas pas besoin de préparer ta requête ^^.
Sinon pour ta jointure tu y es presque,
FROM commentairespve INNER JOIN membres ON commentairespve.id_membre = membres.id
La requête fonctionne sur PHPMyAdmin, mais dès que je la copie/colle dans sublime text elle ressemble à ça:
Sur PHPMyAdmin:
SELECT photoprofil, pseudo, id_membre, commentaire, DATE_FORMAT(date_commentaire, '%d/%m/%Y à %Hh%imin%ss') AS date_commentaire FROM commentairespve INNER JOIN membres ON commentairespve.id_membre = membres.id ORDER BY date_commentaire
Sur sublime text:
$reqvisucommentairespve=$bdd->prepare('SELECT photoprofil, pseudo, id_membre, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') AS date_commentaire FROM commentairespve INNER JOIN membres ON commentairespve.id_membre = membres.id ORDER BY date_commentaire');
while ($visucommentairespve=$reqvisucommentairespve->fetch())
Et rien ne s'affiche à l'écran.
J'ai échappé les ' pour la date car jusque la c'est toujours ce que j'ai eu besoin de faire pour que ça fonctionne et que PHP ne pense pas que la requête se finisse la. Mon souci est que dès que je met les points pour commentairespve.id_membre et membres.id, les mots deviennent violets, j'ai essayé d'échapper les points aussi mais rien ne s'affiche à l'écran et pas d'erreur signalé par PHP.
Là c'est normal. Tu ne fais que préparer ta requête, elle n'est pas exécutée.
En gros, on utilise une requête préparée quand on doit entrer des données extérieures comme a dit christouphe (des données récupérées d'un formulaire par exemple). La requête préparée protège des injections SQL.
Là, comme tu n'as pas de données extérieures, tu peux utiliser Query.
$reqvisucommentairespve=$bdd->query('SELECT photoprofil, pseudo, id_membre, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') AS date_commentaire FROM commentairespve INNER JOIN membres ON commentairespve.id_membre = membres.id ORDER BY date_commentaire');
- Edité par Ryukotsei 16 septembre 2019 à 14:07:33
Dans un sens ce sont des données extérieurs puisque ce sont les commentaires des membres du site., ils viennent bien d'un formulaire pour poster des commentaires, c'est pour cela que j'utilise la requête préparée.
Mais du coup la, je ne sais plus ce que je dois faire
Voulez-vous que je mette le code de la page entière?
- Edité par StellaSky 16 septembre 2019 à 14:10:20
Là on part du principe que tu affiches des commentaires que tu as déjà en base de données.
Si effectivement tes commentaires viennent d'un formulaire, c'est lors de leur insertion en effet que tu dois faire une requête préparée. Une fois qu'ils sont enregistrés c'est bon ^^.
Sauf si tu recherches un commentaire avec un id particulier où là tu dois effectivement faire une requête préparée. Mais là tu n'en as visiblement pas besoin pour cette requête. Chaque requête est différente. Ce n'est pas parce qu'une a été préparée que toutes doivent l'être.
-> suppression d'un commentaire (le marqueur peut être l'identifiant du commentaire)
$requete = $bdd->prepare("DELETE FROM commentaire WHERE id = :id_commentaire;");
$requete->execute(['id_commentaire' => $id_commentaire']);
-> édition d'un commentaire (les marqueurs seraient par exemple l'identifiant et le contenu)
$requete = $bdd->prepare("UPDATE commentaire SET contenu = :contenu WHERE id = :id_commentaire;");
$requete->execute(['contenu' = $contenu, 'id_commentaire' => $id_commentaire]);
-> affichage d'un commentaire répondant à certains critères ( affichage par utilisateur, article ..., les cas où tu aurais une clause WHERE dans la requête en gros)
$requete = $bdd->prepare("SELECT * FROM commentaire WHERE id_membre = :id_membre;");
$requête->execute(['id_membre' => $id_membre]);
Cas où tu n'en as pas besoin
-> affichage de tous tes commentaires (sans clause where donc).
$requete = $bdd->query('SELECT * FROM commentaire;');
- Edité par Ryukotsei 16 septembre 2019 à 14:54:06
$reqvisucommentairespve=$bdd->query('SELECT photoprofil, pseudo, id_membre, commentaire, DATE_FORMAT(date_commentaire, \'%d/%m/%Y à %Hh%imin%ss\') AS date_commentairepve FROM commentairespve INNER JOIN membres ON commentairespve.id_membre = membres.id ORDER BY date_commentaire');
while ($visucommentaires = $reqvisucommentairespve->fetch())
{
?>
<p class=flottecom><img class="photoprofil" src="photos_profils/<?php echo $visucommentaires["photoprofil"]?>" alt="photoprofil" width="50px"></p><p class="pseudocommentaires"><?php echo (htmlspecialchars($visucommentaires['pseudo'])); ?> le <?php echo $visucommentaires['date_commentairepve']; ?></p><br >
<p><?php echo nl2br(htmlspecialchars($visucommentaires['commentaire'])); ?></p>
<?php
$reqvisucommentairespve->closeCursor();
}
Je m'inquiétais des mots en violets sur sublime text qui jusque la disais fin de la requête ou un truc du genre, mais ce n'est pas le cas ici visiblement.
Mon souci maintenant est que ça n'affiche qu'un seul commentaire
Ta phrase "[...]Je ne connais pas les méthodes ... [...]" n'est pas acceptable, si tu ne connais pas ce que je te donne, tu va lire les doc sur PHP.net (EN / FR)
EDIT: il n'affiche qu'UN SEUL commentaire car tu fais le closeCursor() dans la boucle WHILE, sort le de là, supprimes le d'ailleurs
- Edité par christouphe 16 septembre 2019 à 15:01:34
Je suis désolé, mais j'ai suivi les cours HTML, CSS et PHP et il ne me semble pas qu'il y est les méthodes dont tu parles, ou peut être qu'elles portent un autre nom, c'est pour cela que j'ai dis ça.
Effectivement en enlevant le closeCursor(), tous les commentaires s'affichent, du coup je n'ai pas du comprendre quand l'utiliser lui aussi. Je relirai le cours.
Merci à vous de votre aide.
Pour la suite, j'aimerai que les membres puissent répondre à un commentaire en particulier, et non que ce commentaire soit au dessus des autres s'il s'agit d'une réponse.
J'aimerai aussi pouvoir installer des notifications en cas de réponse et que les membres puissent se mentionner (à la manière de Facebook ou Twitter avec le @ par exemple).
Et aussi créer un espace administration (Pour avoir des administrateurs et modérateur pour gérer commentaires et autres peut être plus tard).
Savez-vous ou je peux me renseigner pour apprendre à faire tous ça?
- Edité par StellaSky 16 septembre 2019 à 15:11:44
Je suis aller plusieurs fois sur la doc php.net, et j'avoue que même en relisant 15 fois, il y a beaucoup de choses que je ne comprend pas, même si certaines fois ça m'a aidée quand même, je persiste mais c'est pas simple pour une débutante et j’airerai avoir finie le plus gros de mon site avant le 01/10 car j'aurai une occupation en plus à cette date qui fera que j'aurai moins de temps pour le faire.
Je retourne régulièrement dessus pour essayer de comprendre, mais j'ai vraiment du mal.
- Edité par StellaSky 16 septembre 2019 à 15:32:54
Oui je comprend, dans ce cas je donne un exemple de ce que je comprend dans la doc et ce que je ne comprend pas.
Par exemple pour setcookie, bon je sais l'utiliser car il est dans le cours que j'ai vu, mais admettons que je ne l'avais pas vu dans le cours, à partir de la doc, je ne suis pas sur que j'aurai réussie.
Je comprend une partie de la description mais pas ça:
Le souci c'est que ce genre de description est quasiment dans toutes les docs que j'ai vu sur PHP et ça me perd totalement
- Edité par StellaSky 17 septembre 2019 à 14:11:14
La » RFC 6265 est la référence pour l'interprétation des paramètres passés à setcookie().
name
Le nom du cookie.
value
La valeur du cookie. Cette valeur est stockée sur l'ordinateur du client ; ne stockez pas d'informations importantes. Si le paramètre name vaut 'cookiename', cette valeur est récupéré avec <var class="varname"><var class="varname">$_COOKIE['cookiename']</var></var>.
expires
Le temps après lequel le cookie expire. C'est un timestamp Unix, donc, ce sera un nombre de secondes depuis l'époque Unix (1 Janvier 1970). En d'autres termes, vous devriez fixer cette valeur à l'aide de la fonction time() en y ajoutant le nombre de secondes après lequel on veut que le cookie expire. Vous pouvez utiliser aussi mktime(). time()+60*60*24*30 fera expirer le cookie dans 30 jours. Si vous ne spécifiez pas ce paramètre ou s'il vaut 0, le cookie expirera à la fin de la session (lorsque le navigateur sera fermé).
Note:
Vous pourrez noter que le paramètre expires prend un timestamp unique, et non pas la date au format Jour, JJ-Mois-AAAA HH:MM:SS GMT, car PHP fait la conversion en interne.
path
Le chemin sur le serveur sur lequel le cookie sera disponible. Si la valeur est '/', le cookie sera disponible sur l'ensemble du domaine domain. Si la valeur est '/foo/', le cookie sera uniquement disponible dans le répertoire /foo/ ainsi que tous ses sous-répertoires comme /foo/bar/ dans le domaine domain. La valeur par défaut est le répertoire courant où le cookie a été défini.
domain
Le (sous-)domaine pour lequel le cookie est disponible. Définir ceci à un sous-domaine (tel que 'www.example.com') rendra le cookie disponible pour ce sous-domaine ainsi que tous ses sous-domaines (par exemple: w2.www.example.com). Pour rendre le cookie disponible sur tout le domaine (ainsi que tous ses sous-domaines), définissez simplement la valeur avec le nom de domaine ('example.com', avec cet exemple).
Les anciens navigateurs continuant d'implémenter la » RFC 2109 (obsolète) peuvent nécessiter un . pour rendre disponible tous les sous-domaines.
secure
Indique si le cookie doit uniquement être transmis à travers une connexion sécurisée HTTPS depuis le client. Lorsque ce paramètre vaut TRUE, le cookie ne sera envoyé que si la connexion est sécurisée. Côté serveur, c'est au développeur d'envoyer ce genre de cookie uniquement sur les connexions sécurisées (par exemple, en utilisant la variable <var class="varname"><var class="varname">$_SERVER["HTTPS"]</var></var>).
httponly
Lorsque ce paramètre vaut TRUE, le cookie ne sera accessible que par le protocole HTTP. Cela signifie que le cookie ne sera pas accessible via des langages de scripts, comme Javascript. Il a été suggéré que cette configuration permet de limiter les attaques via XSS (bien qu'elle ne soit pas supportée par tous les navigateurs), néanmoins ce fait est souvent contesté. Ajouté en PHP 5.2.0. TRUE ou FALSE
options
Un tableau associatif qui peut avoir comme clés expires, path, domain, secure, httponly et samesite. Les valeurs ont la même signification que celles décrits pour les paramètres avec le même nom. La valeur de l'élément samesite doit soit être Lax soit Strict. Si une options autorisé n'est pas donnée alors sa valeur par défaut sera identique à la valeur par défaut des paramètres explicite. Si l'élément samesite est omit, alors l'attribut SameSite du cookie ne sera pas définie.
Non non aucun souci de scroll down chez moi, j'ai bien vu la liste des paramètres, j'ai même regardé les exemples en dessous, mais ça ne m'aide pas plus à comprendre, je comprend la liste des paramètres, mais même si je vois ou les mettre du coup dans le code du haut, je ne comprend pas le $string par exemple.
En gros pour faire un cookie, j'aurai été capable de faire ça:
J'ai vu aussi les exemples en dessous, mais j'ai aussi du mal à les comprendre.
Bref tout ça pour dire, que à mon niveau, je ne trouve pas que ce soit très clair pour certaines pages, pour les débutants, limite il me faudrait un cours sur la doc PHP
Je met le sujet en résolu et vous remercie beaucoup de votre aide.
Jointure entre tables et affichage commentaires
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
"Etre vrai, peu le peuvent."
Friedrich Nietzsche
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales