[RESOLU] Préparer une requête

Eléphanteau du PHP | 37 Messages

05 avr. 2021, 10:59

Bonjour à tous,

Est-ce que quelqu’un pourrait m’expliquer pourquoi cette requête n’est pas correctement préparée ?

Merci !

Code : Tout sélectionner

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"], ':comment' => $comment_content, ':comment_sender_name' => $comment_name ) ); $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="reply" id="'.$row["comment_id"].'">Répondre</button></div> </div> '; $output .= get_reply_comment($connect, $row["comment_id"], $marginleft); } } return $output; } ?>

Mammouth du PHP | 2703 Messages

05 avr. 2021, 14:57

SELECT * FROM tbl_comment WHERE parent_comment_id = '".$parent_id."'
soit une requête avec 0 paramètre.
$statement->execute(
array(
':parent_comment_id' => $_POST["comment_id"],
':comment' => $comment_content,
':comment_sender_name' => $comment_name
)
);
requête à laquelle on passe 3 paramètres ...

Eléphanteau du PHP | 37 Messages

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 ) );

Mammouth du PHP | 2703 Messages

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.

Eléphanteau du PHP | 37 Messages

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'

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

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)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 37 Messages

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

Eléphanteau du PHP | 37 Messages

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"] ) );

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

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 ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 37 Messages

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 ?

Eléphanteau du PHP | 37 Messages

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; } ?>

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

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 ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 37 Messages

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 :/

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

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 :)
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, 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; } ?>