Page 1 sur 1

[Résolu] Cherche conseil sur un script de news

Posté : 04 déc. 2011, 11:58
par Rathorian
Bonjour à tous,

Je viens aujourd'hui vers vous car je recherche des réponses à mes questions, étant débutant en PHP je suis pas sûr de faire les choses correctement.
Voici le script que j'ai réalisé :

index.php : :
<?php 
// On inclue la page de connexion à MySQL.
include_once('connexion.inc.php');

$req = $pdo->query('SELECT * FROM minichat ORDER BY id_chat DESC LIMIT 0, 10');

while ($donnees = $req->fetch())
{
	echo '<p><strong>' .htmlspecialchars($donnees['pseudo_chat'], ENT_QUOTES, 'UTF-8'). '</strong> : ' .htmlspecialchars($donnees['message_chat'], ENT_QUOTES, 'UTF-8').'</p>'."\n\n";
}

$req->closeCursor();
?>
minichat_post.php :
<?php 
// On inclue la page de connexion à MySQL.
include_once('connexion.inc.php');

if (isset($_POST['pseudonyme']) AND isset($_POST['message']))
{
	// On supprime les espaces inutiles en début et fin de chaîne.
	$pseudonyme = trim($_POST['pseudonyme']);
	$message = trim($_POST['message']);
	
	if (!empty($pseudonyme) AND !empty($message))
	{
		/* On convertit les caractères spéciaux en entités HTML,
		les guillemets doubles et les guillemets simples,
		Jeu de caractères utilisé UTF-8 lors de la conversion. */
		$pseudonyme_secu = htmlspecialchars($pseudonyme, ENT_QUOTES, 'UTF-8');
		$message_secu = htmlspecialchars($message, ENT_QUOTES, 'UTF-8');
		
		// On prépare la requête.
		$req = $pdo->prepare('INSERT INTO minichat(pseudo_chat, message_chat) VALUES(:pseudonyme_secu, :message_secu)');
		
		// Puis on insère les données dans la BDD.
		$req->execute(array(
			':pseudonyme_secu' => $pseudonyme,
			':message_secu' => $message
			));
		
		// On termine le traitement de la requête.
		$req->closeCursor();
			
		// Enfin, on redirige sur la page du formulaire.
		header('Location: index.php');
	}
	else
	{
		header('Location: index.php');
	}
}
else
{
	header('Location: index.php');
}
?>
(1) : Sur "index.php", est-ce qu'il est possible de récupérer les données avec prepare() ? Si oui, comment ? Et est-ce une utilité pour récupérer des données déjà sécurisées avant l'insertion dans la bdd ?

(2) : Sur "minichat_post.php" je suis pas sûr d'avoir compris réellement le moment ou l'on doit utiliser htmlspecialchars(), doit-on l'utiliser avant de rentrer les données dans la BDD comme sur la page "minichat_post.php" ou virer c'est 2 lignes et utiliser ça seulement sur "index.php" pour afficher les données ? Est-ce que dans tout les cas c'est pareil ?

(3) : Pour le reste est-ce que ce script vous semble correcte ?

Voilà pour mes questions.
Je vous remercie bien d'avance pour l'aide.

Amicalement
Rathorian

Re: Cherche conseil sur un script de news

Posté : 04 déc. 2011, 12:19
par xTG
1/ aucun intérêt d'une requête préparée.
2/ htmlspecialschars() sert surtout pour l'affichage afin de ne pas voir des scripts impropres s'exécuter. Il n'y a relativement aucun intérêt à l'utiliser avant l'insertion des données.
3/
- closeCursor() ne sert à rien pour une requête de type INSERT, c'est pour fermer un jeu de résultat => SELECT
- isSet(), trim(), empty() peut tout à fait se résumer à la seule utilisation de empty()

Re: Cherche conseil sur un script de news

Posté : 04 déc. 2011, 12:37
par Rathorian
(1) Tu pourrais m'expliquer pourquoi il n'y a aucun intérêt à utiliser une requête préparé ? Pour que je puisse comprendre un peu...

(2) Bien compris pour htmlspecialchars()

(3) D'accord pour closeCursor().
Pour empty() par contre je comprend pas trop car les fonctions n'ont pas les même effet...

Merci pour ton aide

Re: Cherche conseil sur un script de news

Posté : 04 déc. 2011, 12:54
par Ryle
Quelques remarques complémentaires :
- concernant le htmlentities / htmlspecialchars : l'objectif est de "désactiver" l'interprétation du html contenu dans la chaîne. Il est donc fortement recommandé (après tout dépend du fonctionnement de ton site) de l'utiliser sur les données transmises par un utilisateur avant de les afficher, pour des questions de sécurité. Il peut cependant être intéressant au niveau de la base de données, l'information telle qu'elle a été saisie (plus facile à éditer, et permet de faire un affichage non html (excel, pdf, ...)

- en php, utilises plutôt l'opérateur " && " au lieu de " AND ", à moins de savoir précisément pourquoi tu utilises ce dernier. Dans le cas présent ça ne change rien, mais cela t'évitera peut être d'éventuelles erreurs d'exécution car ils n'ont pas la même priorité d'exécution (en SQL en revanche, faut garder le AND ;))

- si dans tous les cas tu rediriges l'utilisateur vers la page index.php, il n'est pas nécessaire de mettre le header 3 fois, il suffit de n'en mettre qu'un seul après l'exécution de ton code. Ce sera plus optimisé, et surtout plus facile à modifier le jour il faudra rediriger vers une autre page (une seule modification au lieu de 3) :)


Concernant les requêtes préparées, celles-ci n'ont d'intérêt que si tu exécutes plusieurs fois de suite une même requêtes avec des paramètres différents. Cela permet d'optimiser les exécutions suivantes. Pour une exécution unique, il est inutile, voire même plus lourd (bon ok, ça se calcul en pouillème de secondes), de préparer avant de l'exécuter. Le seul intérêt reste dans la protection des données pour les insert/update si tu ne le fait pas toi même :)

Re: Cherche conseil sur un script de news

Posté : 04 déc. 2011, 15:05
par Rathorian
Bonjour Ryle,

Donc il est plus intéressant pour htmlspecialchars() et ou htmlentities() de ne pas contrôler la variable avant l'envoi dans la base de donnée mais principalement à l'affichage ?

J'apprends le PHP via le site du zéro, il conseil d'utiliser le " AND " à la place du " && " donc je sais pas trop. Je pense que je vais suivre ton conseil...

En faisant comme tu me le conseil avec le header, si le visiteur remplie pas les conditions il reste sur la page de traitement et rien ne s'affiche pour lui vu que cette page traite juste les informations. Je pense qu'il aurait été intéressant de faire comme ça seulement si c'était sur une seule page ( affichage et traitement des données ).

D'accord je comprend mieux l'utilisation des requêtes préparés.

Merci beaucoup.
A bientôt :)