[RESOLU] Préparer une requête

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 avr. 2021, 09:56

Ça manque toujours un petit peu d'air et d'indentation pour être lisible facilement, mais techniquement c'est bien cela :)

A noter que dans la première partie de ton code, tu fais une requête qui va chercher tous les éléments dont le parent a pour id 0 (parent_comment_id = '0').
Pour chacun d'eux tu fais ensuite appel à get_reply_comment() en indiquant l'id de l'enregistrement concerné pour qu'elle aille chercher tous les éléments dont le parent est cet id.

En somme, la boucle que tu fais dans la première partie de ton code pourrait aussi être géré par ta fonction en lui passant en paramètre l'id parent "0" (ou sans lui passer ce paramètre d'ailleurs, puisqu'il s'agit de la valeur par défaut de la fonction).

Ton code deviendrait alors :
<?php
//fetch_comment.php
$connect = new PDO('***');
$output = get_reply_comment($connect, 0); // appel la fonction récursive à partir du niveau 0
echo $output;

function get_reply_comment($connect, $parentId = 0, $marginleft = 0)
{
$output = '';
$query = " SELECT * FROM tbl_comment WHERE parent_comment_id = :parentId ORDER BY comment_id DESC "; // j'ai ajouté le order by ici 
$statement = $connect->prepare($query);
$statement->execute(
array(
':parentId' => $parentId
)
);
$result = $statement->fetchAll();
if($parentId == 0)
{
$marginleft = 0;
}
else
{
$marginleft = $marginleft + 50;
}
if($result)
{
foreach ($result as $row) {
$date = new \DateTime($row["date"]);
$formatedDate = (new IntlDateFormatter( 'fr_FR', IntlDateFormatter::LONG, IntlDateFormatter::SHORT));
$output .= '
<div class="separator"</div>
<div class="box-light" style="margin-left:'.$marginleft.'px">
<div class="chapeau">@ <b>'.$row["comment_sender_name"].'</b></div><div class="white"><i>'.$formatedDate->format($date).'</i></div>
<div class="texte-com">'.nl2br($row["comment"]).'</div>
<div class="reponse"><button type="button" class="button1 reply" id="'.$row["comment_id"].'">Répondre</button></div>
</div>
';
$output .= get_reply_comment($connect, $row["comment_id"], $marginleft);
}
}
return $output;
}
?>
Tu devrais obtenir le même résultat en nettement moins de lignes de code ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 37 Messages

07 avr. 2021, 11:16

Effectivement j'obtiens le même résultat. Je te remercie !

Tu expliques bien les choses, j'ai beaucoup appris grace à toi, du coup j'aimerai te poser une question hors sujet (dis moi si je dois refaire un sujet et mettre celui ci en résolu, je referais le message)

Actuellement, quand j'envoie un commentaire, j'ai un message de validation qui apparait ("Ton message a bien été envoyé").
Si je veux envoyer un 2nd message dans la foulée, je suis obligé d'actualiser la page, ce qui efface le message de validation et re soumet le formulaire.

Est-ce que tu saurais me dire s'il est possible avec mon code de faire en sorte que plusieurs messages soient envoyés d'affilés sans actualiser la page ? un peu comme un chat.

Si tu t'y connais sur ce point et que tu peux m'expliquer la chose ce serait super :D

Mon code se présente en 3 parties essentielles (sans compter le html)
add_comment. php
fetch_comment.php (que tu vois sur ce sujet)
et le JS

Je te montre les 2 autres parties :


add_comment. php :

Code : Tout sélectionner

<?php //add_comment.php $connect = new PDO('***'); $error = ''; $comment_name = ''; $comment_content = ''; $email = ''; $date = new \DateTime($row["date"]); $formatedDate = (new IntlDateFormatter( 'fr_FR', IntlDateFormatter::LONG, IntlDateFormatter::SHORT)); // DEBUT RECAPTCHA // On vérifie si le champ "recaptcha-response" contient une valeur if(empty($_POST['recaptcha-response'])){ header('Location: index.html'); die(); }else{ // On prépare l'URL $url = "https://www.google.com/recaptcha/api/siteverify?secret=***&response={$_POST['recaptcha-response']}"; // On vérifie si curl est installé if(function_exists('curl_version')){ $curl = curl_init($url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($curl); }else{ // On utilisera file_get_contents $response = file_get_contents($url); } // On vérifie qu'on a une réponse if(empty($response) || is_null($response)){ header('Location: index.html'); die(); }else{ $data = json_decode($response); if ($data->score >= 0.5){ // je réalise mon action de formulaire. if(empty($_POST["comment_name"])) { $error .= '<p class="text-danger"></p>'; } else { $comment_name = $_POST["comment_name"]; } if(empty($_POST["comment_content"])) { $error .= '<p class="text-danger"></p>'; } else { $comment_content = $_POST["comment_content"]; } if(empty($_POST["email"])) { $error .= '<p class="text-danger"></p>'; } else { $email = $_POST["email"]; } if($error == '') { $query = " INSERT INTO tbl_comment (parent_comment_id, comment, comment_sender_name, email) VALUES (:parent_comment_id, :comment, :comment_sender_name, :email) "; $statement = $connect->prepare($query); $statement->execute( array( ':parent_comment_id' => $_POST["comment_id"], ':comment' => $comment_content, ':comment_sender_name' => $comment_name, ':email' => $_POST["email"] ) ); $error = '<label class="validation">Ton message a bien été envoyé !</label>'; } else{ header('Location: index.html'); die(); } } else{ $error = '<label class="validation">OOPS ! Ton message ne veut pas partir.. Réessaie !</label>';// tu es potentiellement un robot. } } } // FIN RECAPTCHA // DEBUT FREE MOBILE SMS $commentaireHTML = "<html> <head> <title>Nouveau Commentaire !</title> </head> <body> <p>Monsite.com</p> <p>Rubrique Bla-Bla :</p> <ul> <li><b>Le </b>".strip_tags($formatedDate->format($date))."</li> <li><b>Email : </b>".strip_tags($email)."</li> <li><b>Pseudo : </b>".strip_tags($comment_name)."</li> <li><b>Commentaire : </b>".nl2br(strip_tags($comment_content))."</li> </ul> </body> </html> "; // inclure ici le fichier de la classe require_once "FreeMobileSMS.php"; $sms = new FreeMobileSMS(); /** * configure l'ID utilisateur et la clé disponible dans * le compte Free Mobile après avoir activé l'option. */ $sms->setKey("***") ->setUser("***"); try { // envoi d'un message $sms->send(html_entity_decode(strip_tags("$commentaireHTML"))); } catch (Exception $e) { // il y aura peut-être des erreurs. $this->Session->setFlash("Erreur sur envoi de SMS: (".$e->getCode().") ".$e->getMessage(), 'danger'); } // FIN FREE MOBILE SMS $data = array( 'error' => $error ); echo json_encode($data); ?>

Le JS :

Code : Tout sélectionner

$(document).ready(function () { //quand le DOM est là, on sélectionne les éléments avec lesquels on va travailler //c'est mieux de le faire une fois au début, pour des questions de perf //mais surtout pour éviter d'avoir à faire un gros ctrl + r pour changer les sélecteurs. const $comment_form = $("#comment_form"); const $comment_message = $("#comment_message"); const $display_comment = $("#display_comment"); $comment_form.on("submit", function (event) { event.preventDefault(); const form_data = $comment_form.serialize(); $.ajax({ url: "add_comment.php", method: "POST", data: form_data, dataType: "JSON", success: function (data) { if (data.error !== "") { $comment_form[0].reset(); $comment_message.html(data.error); //un formulaire (élément) contient tous ses inputs //c'est rangé par nom $comment_form[0].comment_id.value = "0"; load_comment(); } }, }); }); reload(); ////////////////////////////////// function load_comment() { $.ajax({ url: "fetch_comment.php", //POST pour envoyer des données, et GET pour obtenir des données method: "POST", success: function (data) { $display_comment.html(data); $(".reply").on("click", function () { $comment_form[0].comment_id.value = $(this).attr("id"); $comment_form[0].comment_name.focus(); }); }, }); } function reload() { load_comment(); setTimeout(reload, 1000); } });
Voilà, si j'en demande trop, n'hésite pas à le dire aussi :oops: