Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/11/2010, 15h31   #1
Invité de passage
 
brice laclare
Inscription : octobre 2010
Messages : 4
Détails du profil
Informations personnelles :
Nom : brice laclare

Informations forums :
Inscription : octobre 2010
Messages : 4
Points : 0
Points : 0
Par défaut PHP OO: Problème avec une classe

Bonjour,

Je débutes en objet et par la même occasion avec PDO en clair j'essaye de passer a un niveau supérieur.

Je suis donc sur un système de news et j'ai
- Une classe news.
- Et 3 fonctions dans cette classe déclarées en public bien sur.

Code de ma classe

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 
<?php
class news {	
/*---------------------------------------------INSERTION---------------------------------------------------------*/
	public function InsertNews($titreNews, $contenueNews, $auteurNews, $dateNews, $imageNews){
		//Déclaration		
		$err_cpt = 0;
		$err_titre = FALSE;
		$err_contenue = FALSE;
		$err_auteur = FALSE;		
		$err_image = FALSE;
 
		//Gestion des erreur
		if(empty($titreNews))   $err_titre = TRUE;  $err_cpt++;
		if(empty($contenueNews))	$err_contenue = TRUE;	$err_cpt++;
		if(empty($auteurNews))	$err_auteur = TRUE;	 $err_cpt++;		
		if(empty($imageNews))	$err_image = TRUE; 	$err_cpt++;
 
		//Si err_cpt = 0 on Insère sinon on listes les erreurs
		if($err_cpt == 4){
			//Requête					
          $bdd = new PDO('mysql:host=localhost;port=3306;dbname=blog', 'root', ''); //Connection			
			$requete =  $bdd -> prepare ('INSERT INTO news (titre, contenue, auteur, date, image) 
										  VALUES(:titre, :contenue, :auteur, :date, :image)');	
 
			$req = exec(array(
						'titre' => $titreNews,
						'contenue' => $contenueNews,
						'auteur' => $auteurNews,
						'date' => $dateNews,
						'image' => $imageNews 					
						));
 
			echo ("News insérée corectement.");
		}
		else{
			//Erreur
			echo "Insertion impossible ".$err_cpt;
			if($err_titre == TRUE)	echo("Vous n'avez pas précisé de tître.");
			if($err_contenue == TRUE)	echo("Votre news n'a pas de contenue.");
			if($err_auteur == TRUE)	echo("Vous n'avez sélectionné aucun auteur.");			
			if($err_image == TRUE)	echo("Votre news n'a pas d'image.");
		}
	}
 
/*---------------------------------------------MODIFICATION---------------------------------------------------------*/
	public function updateNews($choixNews){
 
	}
/*---------------------------------------------SUPPRESSION---------------------------------------------------------*/	
	public function deleteNews($choixNews){
 
	}
}
 
 
?>

Code de mon formulaire:
Code :
1
2
3
4
5
6
7
<form method="post" action="news-insertion-valid.php">
	Tître: <input type="text" name="titre" /><br />
    Contenue:<br /> <textarea name="contenue">a</textarea><br />
    Auteur: <input type="text"  name="auteur" /><br />
    Images: <input type="text" name="image" /><br />
    <input type="submit" value="Poster la news" />
</form>

Code de l'appel de ma classe (en clair la validation de mon formulaire)

Code :
1
2
3
4
5
<?php   
require("../../class/news.class.php");
$news = new news();
$news -> InsertNews($_POST['titre'], $_POST['contenue'], $_POST['auteur'], "00/00/0000", $_POST['image']);
?>

Voilà maintenant, mon soucis.
Donc en clair j'initialise un compteur $err_cpt a 0 ainsi que mes variable
err_tire, contenu etc a FALSE.

Ensuite je teste que les champs sont bien renseignés donc si $titreNews est vide (champ titre de mon formulaire vu que j'envois le contenu de $_POST['titre'] a ma fonction) n'est pas renseigné je la met a TRUE et j'incrémente mon compteur.

Ensuite si mon compteur $err_cpt == 0 alors tous les champs sont renseigné, on est content et on insère dans la base sinon on affiche une erreur et le nombre d'erreur.

Maintenant passons au problème ma structure de test if considère que err_cpt est TOUJOURS égal à 4 sans qu'aucun J'ai donc toujours mon message insertion impossible 4

De plus ce passage

Code :
1
2
3
4
5
6
7
<?php
if($err_titre == TRUE)	echo(Vous n'avez pas précisé de tître.);
			if($err_contenue == TRUE)	echo(Votre news n'a pas de contenue.);
			if($err_auteur == TRUE)	echo(Vous n'avez sélectionné aucun auteur.);			
			if($err_image == TRUE)	echo(Votre news n'a pas d'image.);
 
?>
N'est absolument pas interprété.A
lors pour le premier problème $err_cpt toujours égal a 4 je vois une énorme erreur de logique (passage du procédural à l'objet surement) en revanche pour le fait qu'une portion du code n'est pas interprété la je vois pas du tout.

En espérant tomber sur un virtuose de la programmation objet et php, je vous remercie.
mandra123 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 15h50   #2
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 656
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeuse PHP/Java

Informations forums :
Inscription : avril 2007
Messages : 3 656
Points : 5 359
Points : 5 359
M'est avis que l'objet n'a rien à voir dans le problème : Un if sans accolade ne concerne que la 1ere instruction qui le suit
Donc ceci :
Code :
1
2
3
4
5
6
$err_cpt = 0;
 
if(empty($titreNews))   $err_titre = TRUE;  $err_cpt++;
if(empty($contenueNews))	$err_contenue = TRUE;	$err_cpt++;
if(empty($auteurNews))	$err_auteur = TRUE;	 $err_cpt++;		
if(empty($imageNews))	$err_image = TRUE; 	$err_cpt++;
équivaut à ceci :
Code :
1
2
3
4
5
6
7
8
9
10
$err_cpt = 0;
 
if(empty($titreNews))  { $err_titre = TRUE;  }
$err_cpt++;
if(empty($contenueNews)) { $err_contenue = TRUE; }
$err_cpt++;
if(empty($auteurNews))	 {$err_auteur = TRUE;	}
 $err_cpt++;		
if(empty($imageNews))	{ $err_image = TRUE; 	}
$err_cpt++;
Donc quelque soient les erreurs $err_cpt vaudra toujours 4

Et pour ton bout de code non interprété, vérifie les ouvertures/fermetures de chaines, et surtout que les balises php sont bien en <?php ?> et pas <? ?>
__________________
Modératrice PHP
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 16h02   #3
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 695
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 695
Points : 3 262
Points : 3 262
Salut

La syntaxe pour atteindre propriété dans un Objet c'est :
Code :
1
2
3
4
 
$this->err_cpt++
 
$this->err_titre = TRUE;
Fait bien la distinction entre les les paramètre qui sont des variables et les propriétés.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 16h16   #4
Invité de passage
 
brice laclare
Inscription : octobre 2010
Messages : 4
Détails du profil
Informations personnelles :
Nom : brice laclare

Informations forums :
Inscription : octobre 2010
Messages : 4
Points : 0
Points : 0
Celira => Merci je ne savais pas pour les if sans accolades je comprends bien mieux le problème.

RunCodePhp => Ok mais la je tente de joindre des variables locale à la fonction et non des paramètres. D'ailleurs je n'ai défini aucun paramètres pour cette classe.

Faudrait til que les variables

Code :
1
2
3
4
5
$err_cpt = 0;
$err_titre = FALSE;
$err_contenue = FALSE;
$err_auteur = FALSE;		
$err_image = FALSE;
soient déclarées en paramètres de ma classe et en privé plutôt qu'au sein de ma fonction alors qu'elles ne seront utilisé que par cette fonction et non par le reste de la classe ?
mandra123 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 19h17   #5
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 695
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 695
Points : 3 262
Points : 3 262
Citation:
Envoyé par mandra123
D'ailleurs je n'ai défini aucun paramètres pour cette classe.
Effectivement, j'ai regardé ton code un peu trop en diagonal.

Ceci dit, une variable contenant un booléen pourrait très bien faire l'affaire aussi, car au fond, le tout est de savoir s'il y a erreur ou pas (vrai ou faux), non ?
Ou dit autrement, est-ce si utile que ça de connaitre le nombre d'erreurs ?


Aussi, voit si c'est vraiment à cette classe, de cette méthode insertNews() de gérer les erreurs et les afficher (des echo), et même du echo après insertion.

Si on prend une certaine généralité, la vérifications des données (GET/POST), gérer les erreurs, inserer en Bdd ... sont souvent 3 choses différentes.

Bon, je comprend bien que tu débute, donc que c'est pas simple à concevoir, mais pour ce qui est de l'affichage (les echo), essai au moins de séparer ça, car ça va vraiment causer problème.
A titre d'exemple, mettre ça dans un tableau (une propriété), et créer une méthode hasError() pour savoir s'il a eu erreur, puis une méthode getError() pour les afficher t'offriras déjà plus de possibilités.


Une fois insertion par exemple, on est souvent amener à faire une redirection (un header) car si on ne le fait pas et qu'on actualise la page, une nouvelle insertion peu se faire, ce qui est plutôt embêtant.
Fais des essai en tout cas.


Autre petite parenthèse.
http://fr2.php.net/manual/fr/pdo.exec.php
PDO::exec() retourne un entier (un int), le nombre de ligne affectées, exploiter cette info peut être utile.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h49.


 
 
 
 
Partenaires

Hébergement Web