Mon code est-il bien codé ?

Eléphant du PHP | 386 Messages

30 sept. 2014, 00:22

Bonjour,

J'ai tout une série de fonctions qui permet de faire fonctionner mon site : Inscription, connexion, mot de passe oublié, affichage d'actualités, d'avatars d'infos des membres, suppressions d'actualités etc...
Toutes mes connexions à mysql se font avec PDO.

Tous mes codes fonctionnent =D>
Ça peut aider d'autres personnes qui cherchent comment faire (Si mes codes sont bien faits :roll: )
Le problème c'est que je ne sais pas si c'est codé proprement :(

J'utilise à 100% htmlspecialchars
Je fais des requêtes préparées etc...

Y'a t-il une personne qui veut se dévouer pour regarder rapidement mon code et me dire ses impressions ?

- Fonctions d'affichages des avatars :
<?php
// Affichage de l'avatar du membre connecté
function avatar($id){
	$req = Bdd::connect() -> prepare('SELECT id, sexe FROM users u INNER JOIN users_infos ui ON u.id = ui.userid WHERE u.id = :id');
	$req -> execute(array('id' => $id));
	$donnees = $req -> fetch();
	$avatar = $_SERVER['DOCUMENT_ROOT'].'/users/upload/avatars/'.$donnees['id'].'-mini.jpg';
	$defaut = $donnees['sexe'] == 'homme' ? 'homme.jpg' : 'femme.jpg';
	if(file_exists($avatar)){
		echo $donnees['id'].'-mini.jpg';
	} else {
		echo $defaut;
	}
	$req -> closeCursor();
}
// Affichage des avatars du fil d'actualités
function avatarFeed($id){
	$req = Bdd::connect() -> prepare('SELECT id, sexe FROM users u INNER JOIN users_infos ui ON u.id = ui.userid INNER JOIN users_feed uf ON u.id = uf.feed_userid WHERE uf.feed_userid = :id');
	$req -> execute(array('id' => $id));
	$donnees = $req -> fetch();
	$avatar = $_SERVER['DOCUMENT_ROOT'].'/users/upload/avatars/'.$donnees['id'].'-mini.jpg';
	$defaut = $donnees['sexe'] == 'homme' ? 'homme.jpg' : 'femme.jpg';
	if(file_exists($avatar)){
		echo $donnees['id'].'-mini.jpg';
	} else {
		echo $defaut;
	}
	$req -> closeCursor();
}
?>
- Fonctions de créations, d'affichages et de suppressions d'actualités :
<?php
// Création d'un statut
function createFeed($feed_userid,$feed_text,$feed_acces){
	$feed_text = $_POST['feed_text'];
	if(isset($feed_text) && !empty($feed_text)){
		$req = Bdd::connect() -> prepare('INSERT INTO users_feed (feed_userid, feed_text, feed_acces, feed_date) VALUES (:feed_userid, :feed_text, :feed_acces, NOW())');
		$req -> execute(array('feed_userid' => $feed_userid,'feed_text' => trim(htmlspecialchars($feed_text, ENT_QUOTES, 'UTF-8')),'feed_acces' => $feed_acces));
		$req -> closeCursor();
		$req = Bdd::connect() -> prepare('SELECT * FROM users_feed uf LEFT JOIN users u ON uf.feed_userid = u.id ORDER BY feed_date DESC');
		$req -> execute();
		$donnees = $req -> fetch(); ?> 
		<div class="clearfix feedPost">
			<div class="post">
				<a href="<?php echo $donnees['pseudo']; ?>" class="postAvatar"><img src="users/upload/avatars/<?php echo avatarFeed($donnees['feed_userid']); ?>" alt="" height="56" width="56" /><i class="avatarCover"></i></a>
				<a href="<?php echo $donnees['pseudo']; ?>" class="postName"><?php echo maj($donnees['prenom']).' '.maj($donnees['nom']); ?></a>
				<div class="postOpt"></div>
				<div class="postContent"><?php echo nl2br(smiley($donnees['feed_text'])); ?></div>
				<div class="postDate"><?php echo getRelativeTime($donnees['feed_date']); ?></div>
				<form method="post" action="#" class="comForm" onsubmit="return false;">

				</form>
			</div>
		</div>
		<?php $req -> closeCursor();
	} else {
		return false;
	}
}
// Affichage de tous les statuts selon les paramètres de confidentialité
function displayFeed(){
	$req = Bdd::connect() -> prepare('SELECT * FROM users_feed uf LEFT JOIN users u ON uf.feed_userid = u.id ORDER BY feed_date DESC');
	$req -> execute();
	if($req -> rowCount() >= 1){
		while($donnees = $req -> fetch()){ ?> 
					<div class="clearfix feedPost">
						<div class="post">
							<a href="<?php echo $donnees['pseudo']; ?>" class="postAvatar"><img src="users/upload/avatars/<?php echo avatarFeed($donnees['feed_userid']); ?>" alt="" height="56" width="56" /><i class="avatarCover"></i></a>
							<a href="<?php echo $donnees['pseudo']; ?>" class="postName"><?php echo maj($donnees['prenom']).' '.maj($donnees['nom']); ?></a>
							<div class="postOpt"></div>
							<div class="postContent"><?php echo nl2br(smiley($donnees['feed_text'])); ?></div>
							<div class="postDate"><?php echo getRelativeTime($donnees['feed_date']); ?></div>
							<form method="post" action="#" class="comForm" onsubmit="return false;">

							</form>
						</div>
					</div>
		<?php }
	} else { echo '<div id="nofeed">Publiez quelque chose, partager des articles, photos ou vidéos...</div>'; }
	$req -> closeCursor();
}
// Suppression d'un statut
function deleteFeed($feed_id){
	$feed_id = $_GET['feed_id'];
	if(isset($_GET['feed_id'])){
		$req = Bdd::connect() ->prepare('DELETE FROM users_feed WHERE feed_id = :feed_id AND feed_userid = :id');
		$req -> bindParam(':feed_id', $feed_id, PDO::PARAM_INT, 11);
		$req -> bindParam(':id', $_SESSION['id'], PDO::PARAM_INT, 11);
		$req -> execute();
	} else {
		return false;
	}
}
?>
- Fonctions de connexion, de mot de passe oublié à l'espace membre
<?php
include_once('mail/class.phpmailer.php');

// Connexion à la base de données
function login($email,$mdp){
	$email = htmlspecialchars($_POST['email']);
	$mdp = htmlspecialchars(sha1($_POST['mdp']));
	if(!empty($_POST['email']) && !empty($_POST['mdp'])){
		if(preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!",$email)){
			$req = Bdd::connect() -> prepare('SELECT id, pseudo, email, mdp FROM users WHERE email = :email AND mdp = :mdp');
			$req -> execute(array('email' => $email,'mdp' => $mdp));
			$donnees = $req -> fetch();
			if(!$donnees){
				echo '<span class="error">Vos identifiants sont incorrects</span>';
			} else {
				$_SESSION['id'] = $donnees['id'];
				$_SESSION['pseudo'] = $donnees['pseudo'];
				header('location: home');
			}
			$req -> closeCursor();
		} else {
			echo '<span class="error">Veuillez entrer une adresse électronique valide</span>';
		}
	} else {
		echo '<span class="error">Veuillez remplir tous les champs</span>';
	}
}
// Envoi d'un email avec un nouveau mot de passe
function recover($recoverEmail){
	$email = $_POST['recoverEmail'];
	if(preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!",$email)){
		if(!empty($_POST['recoverEmail'])){
			$req = Bdd::connect() -> prepare('SELECT id, nom, prenom, email FROM users WHERE email = :email');
			$req -> execute(array('email' => $email));
			$donnees = $req -> fetch();
			if(!$donnees){
				echo '<span class="error">Aucun compte n\'est associé à cette email :<br />'.$email.'</span>';
			} else {
				$newPass = chaine(8);
				$cryptPass = sha1($newPass);
				$req1 = Bdd::connect()->prepare('UPDATE users SET mdp = :newPass WHERE email = :email');
				$req1 -> execute(array('newPass' => $cryptPass,'email' => $email));
				$req1 -> closeCursor();
				if(preg_match('#@(hotmail|live|msn).[a-z]{2,4}$#', $email)){
					$br = "\n";
				} else {
					$br = "\r\n";
				}
				$from = 'Web Astronomie';
				$sujet = 'Modification du mot de passe de votre compte Web Astronomie';
				$message = '
					<br />
					<div style="width:600px;">
						<div style="background-color:#003d57;border-bottom:4px solid #0887bd;border-radius:5px 5px 0 0;height:80px;">
							<a href="http://www.web-astronomie.fr" target="_blank" style="padding:20px;display:inline-block;">
								<img src="http://www.web-astronomie.fr/img/mail/logo.png" height="39" width="140" alt="" />
							</a>
						</div>
						<div style="background-color:#e9eaed;border:1px solid #ccc;border-radius:0 0 5px 5px;border-top:none;padding:10px 15px;min-height:100px;">
							<h1 style="font-size:15px;font-weight:bold;font-family:arial;color:#333;padding-bottom:15px;">'.$sujet.'</h1>
							<span>Bonjour '.ucfirst($donnees['prenom']).' !</span><br />
							<span>Le mot de passe de votre compte a bien été modifié.</span><br />
							<span>Voici votre nouveau mot de passe : <strong>'.$newPass.'</strong></span><br /><br />
							<a href="http://www.web-astronomie.fr/login" target="_blank" style="text-decoration:none;background-color:#308eb6;border-color:#308eb6;border:4px solid #308eb6;color:#fff;border-radius:5px;padding:2px 5px;display:inline-block;">Connectez-vous</a><br /><br />
							<span>Une fois connecté à votre compte, nous vous conseillons de le modifier à nouveau.</span><br /><br />
							<span>Cordialement,<br />L\'équipe de Web Astronomie.</span>
						</div>
					</div>
					<br />
				';
				$mail = new PHPmailer();
				$mail->IsMail();
				$mail->SMTPAuth = false;
		        $mail->IsHTML(true);
		        $mail->CharSet = 'UTF-8';
				$mail->SetFrom($from, '<[email protected]>');
		        $mail->From = '[email protected]';
		        $mail->FromName = 'Web Astronomie';
		        $mail->AddAddress($email);
		        $mail->Subject = $sujet;
		        $mail->Body = $message;
		        $mail->AltBody = 'Vous ne pouvez pas ouvrir cet email : Contactez l\'administrateur du sitesupport';
		       	if(!$mail->Send()){
		       		echo '<span class="error">Erreur lors de l\'envoie de votre mot de passe</span>';
		       	} else {
					echo '<span class="success">Un nouveau mot de passe viens de vous être envoyé<br /><span style="font-size:11px;font-weight:bold;">Certains comptes impliquent la vérification de vos SPAMS</span></span>';
		       	}
		       	$mail->SmtpClose();
		       	unset($mail);
			}
			$req -> closeCursor();
		} else {
			echo '<span class="error">Veuillez remplir au moins un champ</span>';
		}
	} else {
		echo '<span class="error">Veuillez entrer une adresse électronique valide</span>';
	}
}
?>
- Fonction d'inscription à l'espace membre :
<?php
// Inscription d'un membre
function register($pseudo,$email,$mdp,$verifmdp,$nom,$prenom,$sexe,$jour,$mois,$annee){
	$pseudo = htmlspecialchars($_POST['pseudo']);
	$email = htmlspecialchars($_POST['email']);
	$mdp = sha1(htmlspecialchars($_POST['mdp']));
	$verifmdp = sha1(htmlspecialchars($_POST['verifmdp']));
	$nom = htmlspecialchars($_POST['nom']);
	$prenom = htmlspecialchars($_POST['prenom']);
	$sexe = htmlspecialchars($_POST['sexe']);
	$jour = (int) $_POST['jour'];
	$mois = htmlspecialchars($_POST['mois']);
	$annee = (int) $_POST['annee'];

	if(!empty($pseudo) && !empty($email) && !empty($mdp) && !empty($verifmdp) && !empty($nom) && !empty($prenom) && !empty($sexe) && !empty($jour) && !empty($mois) && !empty($annee)){
		if(preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $email)){
			$req = Bdd::connect() -> prepare('SELECT id FROM users WHERE email = :email');
			$req -> execute(array('email' => $email));
			$donnees = $req -> fetch();
			if($donnees){
				echo '<span class="error">L\'adresse email est déjà utilisée</span>';
			} else {
				$req -> closeCursor();
				$req = Bdd::connect() -> prepare('SELECT id FROM users WHERE pseudo = :pseudo');
				$req -> execute(array('pseudo' => $pseudo));
				$donnees = $req -> fetch();
				if($donnees){
					echo '<span class="error">Le nom d\'utilisateur est déjà utilisé</span>';
				} elseif($mdp != $verifmdp){
					echo '<span class="error">Les mots de passe ne sont pas identiques</span>';
				} else {
					$req = Bdd::connect() -> prepare('INSERT INTO users (pseudo, email, mdp, statut, nom, prenom, signupdate) VALUES(:pseudo, :email, :mdp, :statut, :nom, :prenom, NOW())');
					$req -> execute(array('pseudo' => $pseudo,'email' => $email,'mdp' => $mdp,'statut' => 'membre','nom' => $nom,'prenom' => $prenom));
					$req -> closeCursor();

					$req1 = Bdd::connect() -> prepare('SELECT * FROM users WHERE email = :email');
					$req1 -> execute(array('email' => $email));
					$donnees = $req1 -> fetch();

					$req2 = Bdd::connect() -> prepare('INSERT INTO users_infos (userid, sexe, jour, mois, annee, profilcomplete, confidentiel, credits) VALUES(:userid, :sexe, :jour, :mois, :annee, :profilcomplete, :confidentiel, :credits)');
					$req2 -> execute(array('userid' => $donnees['id'],'sexe' => $sexe,'jour' => $jour,'mois' => $mois,'annee' => $annee,'profilcomplete' => 70,'confidentiel' => 'public','credits' => 500));
					$req2 -> closeCursor();

					$_SESSION['id'] = $donnees['id'];
					$_SESSION['pseudo'] = $donnees['pseudo'];
					header('location: ../home');

					$req1 ->closeCursor();
				}
				$req -> closeCursor();
			}
		} else {
			echo '<span class="error">Veuillez entrer une adresse électronique valide</span>';
		}
	} else {
		echo '<span class="error">Veuillez remplir tous les champs</span>';
	}
}
?>
- Fonction de récupération d'infos sur le membre connecté :
<?php
// Récupération d'infos du membre connecté
function infoMember($id, $info){
	$id = $_SESSION['id'];
	$req = Bdd::connect() -> prepare('SELECT * FROM users u INNER JOIN users_infos ui ON u.id = ui.userid WHERE u.id = :id');
	$req -> execute(array('id' => $id));
	$donnees = $req -> fetch();
	return $donnees[$info];
	$req -> closeCursor();
}
?>
Ça fait beaucoup de fonctions à regarder :?
Merci beaucoup pour votre aide

Nestecha
Invité n'ayant pas de compte PHPfrance

30 sept. 2014, 05:19

Moi je trouve ca bien oui, pour cet usage.

Après pour être un peu plus pro y'a toujours moyen de pinailler et de faire mieux. Là en l'occurrence, on aurait pu aimer utiliser la programmation objet pour gérer les utilisateurs, ça rend l'utilisation d'architecture MVC possible et donc même un pur intégrateur pourra modifier aisément les vues (parce qu'entre lire $oUser->getID() et lire tes fonctions pour savoir comment faire, y'a un monde).
Et au delà de ca, ta fonction d'affichage d'avatar est complexe par rapport à ce qu'elle pourrait etre en POO (un simple geter suffirait).

On peut aussi rajouter le fait que les tests unitaires seront ensuite accessibles, et donc verrouilleront de façon sûre tes formulaires. Exemple dans la fonction d'inscription, tu regardes si le champ nom n'est pas vide. Tu enlèves les balises HTML, tu les remplaces seulement, mais on peut quand même s'inscrire avec. Des tests unitaires forceraient l'utilisateur à n'inscrire que des lettres, etc etc. Cherche PHPUnit pour plus d'infos si tu ne connais pas :)

ViPHP
xTG
ViPHP | 7331 Messages

30 sept. 2014, 08:21

htmlspecialchars est mal utilisé.
Ce n'est pas une fonction d'anti-injection SQL, c'est une fonction anti-XSS pour l'affichage.
Le seul moment où tu auras à l'utiliser c'est pour ce type de code :
echo htmlspecialchars($variable);
:)

Eléphant du PHP | 386 Messages

30 sept. 2014, 12:57

Merci pour vos messages :

POO, j'ai essayé de suivre le cours sur openclassroom, et même en lisant le cours plusieurs fois et en pratiquant, j'ai toujours rien compris #-o
La méthode procédurale me va bien, même si je me prend la tête avec beaucoup de codes, je me comprend dans mon code :)

Pour le htmlspecialchars, si je mets pas cette fonction aux variables d'un enregistrement dans une base, des personnes pourrons stockés du code html dans ma base ?
Pour l'anti-injection SQL, j'utilise les requêtes préparées ;)

Mammouth du PHP | 2278 Messages

30 sept. 2014, 13:00

Absence de commentaires UTILES
Pas de description précise des fonctions
Pas d'explications sur les paramètres
ex
/ Affichage de l'avatar du membre connecté
//$id c'est quoi ?
//Bdd::connect caq sort d'où?

function avatar($id){
$req = Bdd::connect() -> prepare('SELECT id, sexe FROM users u INNER JOIN users_infos ui ON u.id = ui.userid WHERE u.id = :id');
$req -> execute(array('id' => $id));
$donnees = $req -> fetch();
//ce genre de concaténation me laisse perplexe
$avatar = $_SERVER['DOCUMENT_ROOT'].'/users/upload/avatars/'.$donnees['id'].'-mini.jpg';
//mal placé puisque ne servant que dans un cas
$defaut = $donnees['sexe'] == 'homme' ? 'homme.jpg' : 'femme.jpg';

if(file_exists($avatar)){
echo $donnees['id'].'-mini.jpg';
} else {
echo $defaut;
}
$req -> closeCursor(); //que fait cette fonction?
}
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 386 Messages

30 sept. 2014, 13:26

Sirakawa, si tu connais un minimum le PDO, tu saurais que Bdd::connect, c'est la classe de connexion à la base de données.
Ensuite, je récupère l'id du membre connecté dans la fonction avatar, pour afficher l'avatar qui est renommé : $id.png

Pour l'absence de commentaires, je suis seul à travailler sur ce site, pour l'instant je n'ai pas besoin d'écrire de commentaires
(Si tu veux des détails, je peux t'en donner :wink: ).
Ayant crée mes fonctions, je connais les descriptions et les paramètres.

$req -> closeCursor(); Ferme le curseur, permettant à la requête d'être de nouveau exécutée (https://php.net/manual/fr/index.php)
Modifié en dernier par nico44530 le 30 sept. 2014, 13:30, modifié 2 fois.

Eléphant du PHP | 386 Messages

30 sept. 2014, 13:29

//ce genre de concaténation me laisse perplexe
$avatar = $_SERVER['DOCUMENT_ROOT'].'/users/upload/avatars/'.$donnees['id'].'-mini.jpg';
//mal placé puisque ne servant que dans un cas
$defaut = $donnees['sexe'] == 'homme' ? 'homme.jpg' : 'femme.jpg';
$avatar est utilisé pour tester si le fichier existe, sinon on affiche $defaut.
Ils sont placés dans la fonction, pour éviter de les réécrire à chaque fois dans un code.

Mammouth du PHP | 2278 Messages

30 sept. 2014, 14:17

Eh bien defaulkt devrait être défini dans le else qui est le seul endroit où il est utilisé.
Pour les commentaires, l'expérience montre que l'auteur lui-même a du mal à s'y retrouver sans commentaires; à plus forte raison, s'il prétend que soncode serve d'exemple à d'autres.
Je connais une filière informatique où l'absence de commentaires ou d'indentation entraîne une note au-dessous de la moyenne, même si le code fonctionne.
Enfin, il suffisait de commenter la fonction:
// requiert une connaissance de PDO, avecun mélange de OOO et de procédural...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 386 Messages

30 sept. 2014, 20:00

J'ai mis un commentaire à chaque début de fonctions pour indiquer ce quelle fait.
Et mettre un commentaire aux lignes importantes de la fonction n'est pas nécessaire (je suis pas à l'école)
Je sais ce que font chaque lignes de chaque fonctions

Merci pour la variable $defaut qui n'est pas à la bonne place ;)

ViPHP
xTG
ViPHP | 7331 Messages

30 sept. 2014, 20:39

Pour le htmlspecialchars, si je mets pas cette fonction aux variables d'un enregistrement dans une base, des personnes pourrons stockés du code html dans ma base ?
En effet. Sauf que du code HTML non exécuté ne sert à rien. Donc si c'est juste stocker... ;)
Ton but est-il d'interdire les balises HTML dans différents champs ?
Si tel est le cas utilises plutôt strip_tags pour les supprimer.

Eléphant du PHP | 386 Messages

01 oct. 2014, 11:05

Problème résolu
Pour les balises HTML, j'utilise htmlspecialchars qui était mal placé dans mon code.
Et pour éviter d'enregistrer des caractères spéciaux, je fais un preg_match pour chaque champs à l'inscription.
(Ça fait beaucoup d' if)
if(!preg_match("/^[a-z]+$/", $nom)){
	echo '<span class="error">Les caractères spéciaux ne sont pas autorisés</span>';
} elseif(!preg_match("/^[a-z]+$/", $prenom)){
	echo '<span class="error">Les caractères spéciaux ne sont pas autorisés</span>';
} elseif(!preg_match("/^[a-z]+$/", $pseudo)){
	echo '<span class="error">Les caractères spéciaux ne sont pas autorisés</span>';
} else {
// Ma requête
}
Pour les fonctions createFeed() et displayFeed() ainsi que les autres, j'ai bien modifié l'emplacement de htmlspecialchars à l'affichage et ça fonctionne, les balises s'enregistrent mais ne modifient pas mon code, elle s'affichent juste :wink:

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

01 oct. 2014, 23:40

salut,

Je vais te parler de bonne pratique autant en php que sql.

=> Tu n'as pas l'air d'utiliser de variable gloable dans les fonctions (or super globales) ce qui mais tu peux faire mieux : ne pas utiliser de globale du tous.

Exemple ta fonction login prend deux paramètres que tu écrase directement avec $_POST['email'] et $_POST['mdp']
tu vire ça et utilise la fonction directement ainsi login($_POST['email'], $_POST['mdp']);
le principe est le même pour session.

Pourquoi ?
Parce que tu va pouvoir obtenir ainsi des fonctions isolable que tu pourras ainsi tester (peux être pas avec phpunit mais tu pourras utiliser la fonction dans un cas passant ou pas et voir ce que ça donne).

Dans le même genre je ne sais pas comment est faite la classe Bdd mais je suppose qu'il y a une sorte de singleton pour ne pas instancier 50 fois pdo vu qu'il s'agit d'une méthode statique.
Ceci n'est pas une bonne pratique il est préférable de passer en paramètre l'objet pdo que tu va fournir aux fonctions dont tu a besoin.
Cela te permet de gérer la chose comme tu souhaite ou créer un wrapper perso que tu pourra changer avec autre chose (il suffit d'utiliser une interface) si tu souhaite (imagine que change ton sgbd par un système de fichier ;) ).

Pour ce qui est des requêtes SQL il y a moyen d'optimiser tes requetes (par exemple utiliser un select dans un insert ça fonctionne).

Dans une logique d'utiliser un motif de conception type MVC les fonctions "utilitaires" ne doivent pas faire d'affichage au pire retourner un message d'erreur ;)

Pour ce qui est de requête préparée pourquoi pas (certain langage ne propose pas d'alternative). Ceci dit sachant qu'elle est mise en cache que sur la connexion que par défaut elle est émulée et que tu utilise le passage de paramètre d’exécuté il n'y pas de réel intérêt hors mis celui de ne pas gérer la "protection" de données où tu va te faire couillonner (désolé) quand tu va vouloir utiliser ce type de requête pour un paramètre dans une limite (ou similaire) et la chose va coller une chaîne de caractères à la place d'un entier (he oui vu que php n'est pas typé mais sql oui, mais s'il y a pas mal d'auto boxing tous ce qui est est chaine de caractère et traité comme tel).
pour info en sql insérer une chaine de caractère dans un entier fonction ne pour peux la chaine contienne un entier la conversion étant réalisée, par contre cela en fonctionnera pas lorsqu'un entier est demandé (dans mon exemple select * from latable where machin='bidulle' limit :start,10 sera remplacé en select * from latable where machin='bidulle' limit '0',10 par exemple et la vautrage assuré).

=> closeCursor() : très bien peu de personne y pense c'est un très bon point ;)

Tu as du code redondant (validation d'email) tu peux créer une fonction pour cela ou utiliser la fonction php filter_var à la place;)

sinon, pour finir sur une bonne note, le code est clair et indenté (bon manque de commentaire ou moins de doc) c'est important est assez rare.

pour ce qui est des conventions de codage je t'invite à regarder ce site http://www.php-fig.org/ (pas mal des articles sont traduit en fr) même si tout (pour moi et pour ce qui est des psr-1 et 2) n'est pas parfait c'est une bonne base.

Au final comme le Nestecha, c'est surtout pinaille & co surtout si tu ne compte pas en faire ton métier ;)

si tu veux aller plus loin regarde du coté des motifs de conception (design pattern), la base étant le mcv (le singleton annoncé tout a l'heure en est un autre) et bien sur la poo pour une conception de plus au niveau.

Par contre n'utilise pas la poo a contre coeur ce n'est pas de la peine de le faire "pour faire de poo".
C'est incontournable pour un pro mais sinon ce n'est pas un problème ;)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 386 Messages

02 oct. 2014, 03:19

Salut moogli,

Je vais essayer de répondre à tous tes messages :
Exemple ta fonction login prend deux paramètres que tu écrase directement avec $_POST['email'] et $_POST['mdp']
tu vire ça et utilise la fonction directement ainsi login($_POST['email'], $_POST['mdp']);
le principe est le même pour session.
Tu veux dire que je peux faire ça dans la page du formulaire : login($email, $mdp); ?

Pour le problème de ma classe Bdd, la voici :
class Bdd {
	public static function connect()
	{
		try
		{
			$connection = new PDO(DNS, USER, PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
			$connection -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
		}
		catch (Exception $e)
		{
			die('Échec lors de la connexion : ' . $e->getMessage());
		}
		return $connection;
	}
}
J'ai pas trop compris ce que je dois faire pour une meilleure pratique de cette classe.

Ensuite, c'est vrai que j'utilise des fonctions pour presque tout :?
Mais ça fait quoi d'utiliser des fonctions qui servent à faire des requêtes et à afficher le contenu de la BDD ?
Pour ce qui est de requête préparée pourquoi pas (certain langage ne propose pas d'alternative). Ceci dit sachant qu'elle est mise en cache que sur la connexion que par défaut elle est émulée et que tu utilise le passage de paramètre d’exécuté il n'y pas de réel intérêt hors mis celui de ne pas gérer la "protection" de données où tu va te faire couillonner (désolé) quand tu va vouloir utiliser ce type de requête pour un paramètre dans une limite (ou similaire) et la chose va coller une chaîne de caractères à la place d'un entier (he oui vu que php n'est pas typé mais sql oui, mais s'il y a pas mal d'auto boxing tous ce qui est est chaine de caractère et traité comme tel).
pour info en sql insérer une chaine de caractère dans un entier fonction ne pour peux la chaine contienne un entier la conversion étant réalisée, par contre cela en fonctionnera pas lorsqu'un entier est demandé (dans mon exemple select * from latable where machin='bidulle' limit :start,10 sera remplacé en select * from latable where machin='bidulle' limit '0',10 par exemple et la vautrage assuré).
Là j'ai pas trop compris, tu pourrais citer un exemple ?
Si la variable que je passe en paramètre dans la fonction doit être un entier, je fais une condition avec int() pour pas me faire "couillonner" ?

Pour le code redondant, je pense à la répétition de preg_match pour vérifier certaines choses, je vais me pencher sur filter_var ;)
Ensuite les conventions de codages : Je modifierais mon code :
- Ajouter plus de commentaires sur du code important.
- Coder en anglais (noms de variables etc...).
Au final comme le Nestecha, c'est surtout pinaille & co surtout si tu ne compte pas en faire ton métier
J'ai pas trop compris non plus, tu pense que mon code est tout à refaire ? Que c'est le bordel là-dedans ? 8-|

Pour la POO, je vais quand même m'y remettre, me faire aider par des personnes réelles (pas virtuelles).

Je veux que mon code ressemble à quelque chose à un meilleur niveau que aujourd'hui pour de meilleurs performances d'exécutions.

Dans l'attente de ta réponse
Merci ;)

Mammouth du PHP | 2278 Messages

02 oct. 2014, 09:02

Juste sur les fonctions:
Ensuite, c'est vrai que j'utilise des fonctions pour presque tout
Il n'y a rien d'anormal, au contraire, à utiliser des fonctions: le code principal en est clarifié; du genre au lieu d'avoir trente lignes de code dans un case, y avoir juste un appel de fonctoin.
La remarque de mooli est que une fonction ne devrait que renvoyer un résultat (Sirakawa : sous forme de tableau si besoin, sérialisé peut-être) et ne rien afficher, une fois qu'elle est au point (des affichages de contrôle en cours de mise au point sont souvent nécessaires)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 386 Messages

02 oct. 2014, 12:59

Dans mon cas, quelles sont mes fonctions qui ne sont pas bien ?