[RESOLU] Préparer une requête

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Préparer une requête

Re: Préparer une requête

par jeicko » 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:

Re: Préparer une requête

par Ryle » 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 ;)

Re: Préparer une requête

par jeicko » 07 avr. 2021, 00:13

Merci pour toutes tes explications. Du coup je te montre ce que j'ai fait en suivant (j'espère correctement) tes explications. Mon code fonctionne bien comme ça. Pourrais tu me dire si ça te semble juste stp ?


Code : Tout sélectionner

<?php //fetch_comment.php $connect = new PDO('***'); $query = " SELECT * FROM tbl_comment WHERE parent_comment_id = '0' ORDER BY comment_id DESC "; $statement = $connect->prepare($query); $statement->execute(); $result = $statement->fetchAll(); $output = ''; 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"> <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="repondre"><button type="button" class="button1 reply" id="'.$row["comment_id"].'">Répondre</button></div> </div> '; $output .= get_reply_comment($connect, $row["comment_id"]); } echo $output; function get_reply_comment($connect, $parentId = 0, $marginleft = 0) { $query = " SELECT * FROM tbl_comment WHERE parent_comment_id = :parentId "; $output = ''; $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; } ?>

Re: Préparer une requête

par Ryle » 06 avr. 2021, 17:05

Ah non mais moi aussi je risque de tout te saccager, alors je préfère te donner les bases du php ;)

La première, c'est d'aérer ton code en sautant des lignes entre les instructions qui ne sont pas liées, et d'utiliser des tabulations afin d'indenter ton code ce qui va le rendre plus lisible et plus facile à maintenir / comprendre. La seconde, c'est de mettre des commentaires pour expliquer ce que tu fais et pourquoi, surtout quand c'est complexe. Ça peut sembler ridicule, mais c'est super important le jour où quelqu'un va lire ton code pour comprendre à quoi il sert (ce quelqu'un pouvant parfaitement être toi dans 6 mois ;))
<?php
//fetch_comment.php
$connect = new PDO('***');

$output = '';

$query = " SELECT * FROM tbl_comment
	WHERE parent_comment_id = '0'
	ORDER BY comment_id DESC ";
$statement = $connect->prepare($query);
$statement->execute();
$result = $statement->fetchAll();

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">
			<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="repondre"><button type="button" class="button1 reply" id="'.$row["comment_id"].'">Répondre</button></div>
		</div>
	';
	$output .= get_reply_comment($connect, $row["comment_id"]);
}
echo $output;

function get_reply_comment($connect, $parent_id = 0, $marginleft = 0)
{
	$output = '';
	$query = " SELECT * FROM tbl_comment WHERE parent_comment_id = '".$parent_id."' ";
	$statement = $connect->prepare($query);
	$statement->execute(
		array(
			':parent_comment_id' => $_POST["comment_id"]
		)
	);
	$result = $statement->fetchAll();
	if($parent_id == 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;
}
?>
Maintenant qu'on y voir plus clair, on constate que dans ton code tu fais appel à la fonction get_reply_comment() en lui passant 2 paramètres $connect et $row["comment_id"]. On voit aussi la déclaration de la fonction get_reply_comment(), c'est elle qui va nous intéresser.

Cette fonction accepte jusqu'à 3 paramètres :
- $connect (qui permet d'exécuter des requêtes sur la base de données - obligatoire),
- $parent_id (l'id de l'élément pour lequel tu veux récupérer les commentaires - facultatif, s'il n'est pas spécifié, il prend la valeur 0),
- $marginleft (qui permet d'afficher une marge pour indenter les réponses - facultatif, s'il n'est pas spécifié, il prend la valeur 0).

Lors du premier appel à la fonction ( get_reply_comment($connect, $row["comment_id"]); ), tu vas transmettre la variable de connexion à la base de données, et tu vas également transmettre la valeur de $row["comment_id"] en second paramètre. Celle-ci va ainsi être stockée dans la variable $parent_id et pourra ainsi être utilisée dans ta fonction.

Regardons maintenant de plus près ce que fait la fonction. Elle commence par une requête SQL qui utilise la valeur de $parent_id dans sa structure. Ça fonctionne, mais il est préférable de la sécuriser contre les injections SQL en sortant cette variable et en la remplaçant par un token :
$query = " SELECT * FROM tbl_comment WHERE parent_comment_id = :parentId ";
Pour autant, on veut quand même que la valeur contenue dans $parent_id soit utilisée au moment de l'exécution de la requête. Pour cela tu peux soit utiliser les fonctions bindParam ou bindValue, mais tu peux aussi continuer comme tu les fais déjà en passant cette valeur dans le execute().

Cette méthode attend en argument un tableau array(), qui va contenir les valeurs que tu veux spécifier pour chacun des tokens que tu as placé dans la structure de ta requête. Ici nous n'avons qu'un seul token dans la requête (:parentId), donc une seule entrée dans le tableau, sous la forme "clé => valeur". La clé est le nom du token (:parentId) et la valeur, c'est ta variable $parentId :)

Re: Préparer une requête

par jeicko » 06 avr. 2021, 14:24

Je suis dessus depuis tout à l'heure mais je fais mal les choses, ça ne fonctionne pas. Je suis dsl je n'ai pas appris les bases du php..
Est-ce que ça serait trop demandé que tu me montres la partie en question correctement codée ? J'ai peur de saccager le code même si ça vient à fonctionner :/

Re: Préparer une requête

par Ryle » 06 avr. 2021, 13:07

C'est parce que la valeur que tu veux passer dans la requête n'est pas dans la variable $_POST["comment_id"] comme dans le code que j'avais conservé, mais dans ta variable $parent_id qui est passée en paramètre à ta fonction. Il te suffit donc de modifier la valeur envoyée à la requête en spécifiant la bonne variable lors de l'exécution ;)

Re: Préparer une requête

par jeicko » 06 avr. 2021, 12:52

Je te montre la page de code entière (avec ma proposition de code qui n'est pas juste mais fait correctement fonctionner ma page)

Code : Tout sélectionner

<?php //fetch_comment.php $connect = new PDO('***'); $query = " SELECT * FROM tbl_comment WHERE parent_comment_id = '0' ORDER BY comment_id DESC "; $statement = $connect->prepare($query); $statement->execute(); $result = $statement->fetchAll(); $output = ''; 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"> <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="repondre"><button type="button" class="button1 reply" id="'.$row["comment_id"].'">Répondre</button></div> </div> '; $output .= get_reply_comment($connect, $row["comment_id"]); } echo $output; function get_reply_comment($connect, $parent_id = 0, $marginleft = 0) { $query = " SELECT * FROM tbl_comment WHERE parent_comment_id = '".$parent_id."' "; $output = ''; $statement = $connect->prepare($query); $statement->execute( array( ':parent_comment_id' => $_POST["comment_id"] ) ); $result = $statement->fetchAll(); if($parent_id == 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; } ?>

Re: Préparer une requête

par jeicko » 06 avr. 2021, 12:46

Ca me semble plus clair avec tes explications, par contre avec ta proposition de code, les messages en question ne s'affichent plus. Alors qu'avec ma proposition au dessus de ton commentaire les messages s'affichent mais du coup ce n'est pas juste ?

Re: Préparer une requête

par Ryle » 06 avr. 2021, 12:26

En fait, une injection SQL c'est le fait de profiter d'une absence de contrôle dans les variables utilisées par ta requête, pour y introduire du code SQL en lieu et place de ce que tu y attends en théorie.

Un exemple tout bête, dans la requête suivante :
$sql = " SELECT * FROM users WHERE identifiant = '$login' AND password = '$password'";
Si en guise de mot de passe je rentre la chaine " ' OR '1' = '1 ", si aucun contrôle n'est effectué, la requête exécutée devient
 SELECT * FROM users WHERE identifiant = '' AND password = '' OR '1' = '1' 
et comme cette dernière condition est vraie, je parviens à m'authentifier (et récupère potentiellement la liste de tous les utilisateurs au passage ;))

Il faudrait donc protéger les apostrophes, mais pas que... il faudrait idéalement contrôler que les chiffres sont des chiffres, les dates sont des dates, etc. et c'est l'un des avantages de la requête préparée (qui n'a pas du tout cette vocation au départ, mais qui propose ces contrôles lorsque l'on remplace les tokens par les valeurs au moment de son exécution)
// On remplace la ou les variables de la requête par des tokens :
$query = " SELECT * FROM tbl_comment WHERE parent_comment_id = :parentId ";
$statement = $connect->prepare($query);
$statement->execute( 
   array( // un seul token dans la requête = un seul paramètre à spécifier
    ':parentId' => $_POST["comment_id"] 
   )
);
A noter que lorsque tu passes les paramètres directement dans execute, ils sont tous considérés comme des chaines de caractères et que tu n'as pas le contrôle sur le type de chaine que tu aurais en passant chaque paramètre via bindParam ou bindValue. Ça peut cependant être tout à fait suffisant, tout dépend des éléments que tu contrôles, de la requête et de la sécurité que tu veux y apporter ;)

Re: Préparer une requête

par jeicko » 06 avr. 2021, 12:20

Est-ce que ça devrait ressembler à ça ?

Code : Tout sélectionner

$query = " SELECT * FROM tbl_comment WHERE parent_comment_id = '".$parent_id."' "; $output = ''; $statement = $connect->prepare($query); $statement->execute( array( ':parent_comment_id' => $_POST["comment_id"] ) );

Re: Préparer une requête

par jeicko » 06 avr. 2021, 11:58

D'accord, bon c'est pas trop de mon niveau je crois.. en bref, que dois-je faire pour éviter les injections SQL ? Si j'ai bien compris, là j'utilise que "parent_comment_id" ? je suis un peu perdu

Re: Préparer une requête

par Ryle » 06 avr. 2021, 11:29

Hello !

Ça ce n'est pas une erreur, c'est la liste des requêtes SQL que ton code à généré et que l'instruction echo te permet d'afficher à l'écran. Si tu es dans une boucle, il les affiches toutes. Mais tu peux ainsi voir quel requête SQL va être envoyée à MySQL et vérifier si celle-ci te convient ou est erronée.

Quant au principe des requêtes préparées, il s'agit de définir une structure de requête SQL dans laquelle les variables sont remplacés par des tokens. Lors de l'exécution de la requête, il faut préciser la valeur devant être utilisée pour chacun de ces tokens. 1 token = 1 valeur attendue et donc une seule valeur à spécifier lors de l'exécution :)

Si ta requête ne contient pas de token parce que tu mets toi même la valeur à utiliser directement dans la structure, alors il ne faut pas spécifier de valeur lors de l'exécution (mais on perds un peu l'intérêt de la requête préparée qui est optimisée pour s'exécuter plusieurs fois avec des valeurs différentes au profit d'une requête simple)

Re: Préparer une requête

par jeicko » 06 avr. 2021, 10:35

hum j'ai cette erreur :

Code : Tout sélectionner

SELECT * FROM tbl_comment WHERE parent_comment_id = '240' SELECT * FROM tbl_comment WHERE parent_comment_id = '241' SELECT * FROM tbl_comment WHERE parent_comment_id = '242' SELECT * FROM tbl_comment WHERE parent_comment_id = '243' SELECT * FROM tbl_comment WHERE parent_comment_id = '244' SELECT * FROM tbl_comment WHERE parent_comment_id = '245' SELECT * FROM tbl_comment WHERE parent_comment_id = '246' SELECT * FROM tbl_comment WHERE parent_comment_id = '238' SELECT * FROM tbl_comment WHERE parent_comment_id = '239' SELECT * FROM tbl_comment WHERE parent_comment_id = '237' SELECT * FROM tbl_comment WHERE parent_comment_id = '236' SELECT * FROM tbl_comment WHERE parent_comment_id = '235' SELECT * FROM tbl_comment WHERE parent_comment_id = '234' SELECT * FROM tbl_comment WHERE parent_comment_id = '233' SELECT * FROM tbl_comment WHERE parent_comment_id = '232' SELECT * FROM tbl_comment WHERE parent_comment_id = '230' SELECT * FROM tbl_comment WHERE parent_comment_id = '231' SELECT * FROM tbl_comment WHERE parent_comment_id = '228' SELECT * FROM tbl_comment WHERE parent_comment_id = '227' SELECT * FROM tbl_comment WHERE parent_comment_id = '229' SELECT * FROM tbl_comment WHERE parent_comment_id = '226' SELECT * FROM tbl_comment WHERE parent_comment_id = '225' SELECT * FROM tbl_comment WHERE parent_comment_id = '224' SELECT * FROM tbl_comment WHERE parent_comment_id = '223' SELECT * FROM tbl_comment WHERE parent_comment_id = '222' SELECT * FROM tbl_comment WHERE parent_comment_id = '221' SELECT * FROM tbl_comment WHERE parent_comment_id = '220' SELECT * FROM tbl_comment WHERE parent_comment_id = '219' SELECT * FROM tbl_comment WHERE parent_comment_id = '218' SELECT * FROM tbl_comment WHERE parent_comment_id = '217' SELECT * FROM tbl_comment WHERE parent_comment_id = '216' SELECT * FROM tbl_comment WHERE parent_comment_id = '215' SELECT * FROM tbl_comment WHERE parent_comment_id = '214' SELECT * FROM tbl_comment WHERE parent_comment_id = '213' SELECT * FROM tbl_comment WHERE parent_comment_id = '211' SELECT * FROM tbl_comment WHERE parent_comment_id = '212' SELECT * FROM tbl_comment WHERE parent_comment_id = '208' SELECT * FROM tbl_comment WHERE parent_comment_id = '209' SELECT * FROM tbl_comment WHERE parent_comment_id = '210' SELECT * FROM tbl_comment WHERE parent_comment_id = '205' SELECT * FROM tbl_comment WHERE parent_comment_id = '206' SELECT * FROM tbl_comment WHERE parent_comment_id = '207' SELECT * FROM tbl_comment WHERE parent_comment_id = '202' SELECT * FROM tbl_comment WHERE parent_comment_id = '203' SELECT * FROM tbl_comment WHERE parent_comment_id = '204' SELECT * FROM tbl_comment WHERE parent_comment_id = '195' SELECT * FROM tbl_comment WHERE parent_comment_id = '196' SELECT * FROM tbl_comment WHERE parent_comment_id = '200' SELECT * FROM tbl_comment WHERE parent_comment_id = '201' SELECT * FROM tbl_comment WHERE parent_comment_id = '197' SELECT * FROM tbl_comment WHERE parent_comment_id = '198' SELECT * FROM tbl_comment WHERE parent_comment_id = '199' SELECT * FROM tbl_comment WHERE parent_comment_id = '193' SELECT * FROM tbl_comment WHERE parent_comment_id = '194' SELECT * FROM tbl_comment WHERE parent_comment_id = '192' SELECT * FROM tbl_comment WHERE parent_comment_id = '191' SELECT * FROM tbl_comment WHERE parent_comment_id = '189' SELECT * FROM tbl_comment WHERE parent_comment_id = '190' SELECT * FROM tbl_comment WHERE parent_comment_id = '188' SELECT * FROM tbl_comment WHERE parent_comment_id = '186' SELECT * FROM tbl_comment WHERE parent_comment_id = '187' SELECT * FROM tbl_comment WHERE parent_comment_id = '184' SELECT * FROM tbl_comment WHERE parent_comment_id = '185' SELECT * FROM tbl_comment WHERE parent_comment_id = '183' SELECT * FROM tbl_comment WHERE parent_comment_id = '181' SELECT * FROM tbl_comment WHERE parent_comment_id = '182' SELECT * FROM tbl_comment WHERE parent_comment_id = '180' SELECT * FROM tbl_comment WHERE parent_comment_id = '179' SELECT * FROM tbl_comment WHERE parent_comment_id = '178' SELECT * FROM tbl_comment WHERE parent_comment_id = '177' SELECT * FROM tbl_comment WHERE parent_comment_id = '175' SELECT * FROM tbl_comment WHERE parent_comment_id = '176' SELECT * FROM tbl_comment WHERE parent_comment_id = '174' SELECT * FROM tbl_comment WHERE parent_comment_id = '173' SELECT * FROM tbl_comment WHERE parent_comment_id = '172' SELECT * FROM tbl_comment WHERE parent_comment_id = '171' SELECT * FROM tbl_comment WHERE parent_comment_id = '170' SELECT * FROM tbl_comment WHERE parent_comment_id = '169' SELECT * FROM tbl_comment WHERE parent_comment_id = '168' SELECT * FROM tbl_comment WHERE parent_comment_id = '167' SELECT * FROM tbl_comment WHERE parent_comment_id = '166' SELECT * FROM tbl_comment WHERE parent_comment_id = '165' SELECT * FROM tbl_comment WHERE parent_comment_id = '164' SELECT * FROM tbl_comment WHERE parent_comment_id = '163' SELECT * FROM tbl_comment WHERE parent_comment_id = '162' SELECT * FROM tbl_comment WHERE parent_comment_id = '161' SELECT * FROM tbl_comment WHERE parent_comment_id = '160' SELECT * FROM tbl_comment WHERE parent_comment_id = '159' SELECT * FROM tbl_comment WHERE parent_comment_id = '158' SELECT * FROM tbl_comment WHERE parent_comment_id = '157' SELECT * FROM tbl_comment WHERE parent_comment_id = '156' SELECT * FROM tbl_comment WHERE parent_comment_id = '155' SELECT * FROM tbl_comment WHERE parent_comment_id = '154' SELECT * FROM tbl_comment WHERE parent_comment_id = '153' SELECT * FROM tbl_comment WHERE parent_comment_id = '152' SELECT * FROM tbl_comment WHERE parent_comment_id = '150' SELECT * FROM tbl_comment WHERE parent_comment_id = '149' SELECT * FROM tbl_comment WHERE parent_comment_id = '148' SELECT * FROM tbl_comment WHERE parent_comment_id = '147' SELECT * FROM tbl_comment WHERE parent_comment_id = '146' SELECT * FROM tbl_comment WHERE parent_comment_id = '145' SELECT * FROM tbl_comment WHERE parent_comment_id = '144' SELECT * FROM tbl_comment WHERE parent_comment_id = '143' SELECT * FROM tbl_comment WHERE parent_comment_id = '142' SELECT * FROM tbl_comment WHERE parent_comment_id = '141' SELECT * FROM tbl_comment WHERE parent_comment_id = '140' SELECT * FROM tbl_comment WHERE parent_comment_id = '139' SELECT * FROM tbl_comment WHERE parent_comment_id = '138' SELECT * FROM tbl_comment WHERE parent_comment_id = '136' SELECT * FROM tbl_comment WHERE parent_comment_id = '137' SELECT * FROM tbl_comment WHERE parent_comment_id = '135' SELECT * FROM tbl_comment WHERE parent_comment_id = '151' SELECT * FROM tbl_comment WHERE parent_comment_id = '134' SELECT * FROM tbl_comment WHERE parent_comment_id = '133' SELECT * FROM tbl_comment WHERE parent_comment_id = '131' SELECT * FROM tbl_comment WHERE parent_comment_id = '132' SELECT * FROM tbl_comment WHERE parent_comment_id = '130' SELECT * FROM tbl_comment WHERE parent_comment_id = '128' SELECT * FROM tbl_comment WHERE parent_comment_id = '129' SELECT * FROM tbl_comment WHERE parent_comment_id = '127' SELECT * FROM tbl_comment WHERE parent_comment_id = '125' SELECT * FROM tbl_comment WHERE parent_comment_id = '126' SELECT * FROM tbl_comment WHERE parent_comment_id = '123' SELECT * FROM tbl_comment WHERE parent_comment_id = '124' SELECT * FROM tbl_comment WHERE parent_comment_id = '121' SELECT * FROM tbl_comment WHERE parent_comment_id = '122' SELECT * FROM tbl_comment WHERE parent_comment_id = '119' SELECT * FROM tbl_comment WHERE parent_comment_id = '120' SELECT * FROM tbl_comment WHERE parent_comment_id = '117' SELECT * FROM tbl_comment WHERE parent_comment_id = '118' SELECT * FROM tbl_comment WHERE parent_comment_id = '115' SELECT * FROM tbl_comment WHERE parent_comment_id = '116' SELECT * FROM tbl_comment WHERE parent_comment_id = '113' SELECT * FROM tbl_comment WHERE parent_comment_id = '114' SELECT * FROM tbl_comment WHERE parent_comment_id = '112' SELECT * FROM tbl_comment WHERE parent_comment_id = '111' SELECT * FROM tbl_comment WHERE parent_comment_id = '109' SELECT * FROM tbl_comment WHERE parent_comment_id = '110' SELECT * FROM tbl_comment WHERE parent_comment_id = '108' SELECT * FROM tbl_comment WHERE parent_comment_id = '107' SELECT * FROM tbl_comment WHERE parent_comment_id = '106'

Re: Préparer une requête

par or 1 » 05 avr. 2021, 19:40

$query = "
SELECT * FROM tbl_comment WHERE parent_comment_id = '".$parent_id."'
";
echo $query;
si la requête affichée s'exécute correctement dans phpmyadmin, il ne faut pas aller chercher plus loin.

Re: Préparer une requête

par jeicko » 05 avr. 2021, 19:21

Merci pour ta réponse, alors j’avais tenté plusieurs choses mais je n’avais plus l’affichage de mes commentaires.. dsl je ne suis pas à l’aise du tout avec le php.. ça va sans doute te paraître un peu pourri mais voici ce que j’avais tenté :

Code : Tout sélectionner

$query = " SELECT * FROM tbl_comment WHERE parent_comment_id = '".$parent_id."' VALUES (:parent_comment_id, :comment, :comment_sender_name) "; $output = ''; $statement = $connect->prepare($query); $statement->execute( array( ':parent_comment_id' => $_POST["comment_id"], ':comment' => $comment_content, ':comment_sender_name' => $comment_name ) );