Partage

MOOC Programmez en orienté objet en PHP

14 février 2018 à 13:13:16

Bonjour encore une fois,

Je ne sais pas ce que vous pensez du Design Pattern Observer mais pour moi je crois qu'on pourra faire communiquer notre code et le séparer logiquement dans notre code sans voir besoin de mettre en place un système de notification entre les objets non ?

-
Edité par ELJAOUHARI Hamza 14 février 2018 à 13:14:39

Informtion is potential power; Action is everything !
14 février 2018 à 14:37:20

Mohamed3Camara, montrez votre code source il n'est pas évident de se prononcer, j'aimerai voir la logique de votre code car parfois l'erreur peut provenir d'autre part. Par exemple est ce que vous configurez le gestionnaire de base de la donnée avec setAttribute ou un PDO(....,[PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION], ...), par exemple si non je vous conseille de le faire.
Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
19 février 2018 à 13:06:56

Merci à toi @Stéphanete Anguilet j'ai résolu ce problème. ça provenait de ma variable $dateDeNaissance comme sa valeur provenait d'un formulaire j'ai oublié de le convertir en dateTime avant d'insérer. Mais j'ai un autre souci au niveau de la même requête avec le code d'erreur suivant: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE3\xA9' for column 'ville' at row 1' in C:\wamp64\www\Monsite\traitement\PDO\UtilisateurMan

19 février 2018 à 17:08:26

Bonjour tout le monde,

Je n'arrive pas toujours pas à cerner l'utilité du pattern Observer !

Je comprends bien le concept du design pattern Observer mais je ne vois pas son utilité parce que ma question c'est : A quoi bon t-il de passer par un système de notification pour faire des opérations sur un objet observateur qu'on peut bien faire sans avoir utilisé ce design pattern au premier coup ?

Merci pour vos explications ! J'ai besoin des exemples concrets !

Informtion is potential power; Action is everything !
23 février 2018 à 17:55:17

Salut à tous jusqu'à présent je bloque sur ma réquete d'insertion avec cette erreur : 'SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE3\xA9\xE3\xA9\xE3\xA9...' for column 'nom' at row 1' Après avoir mis presque tous en utf-8 cette erreur revient mais j'ai remarqué qu'elle n'arrive pas si je redémarre wamp toute fois elle revient pour la prochaine insertion. Du coup je suis obligé de toujours redémarrer à chaque fois que je veux inséré dans la base de données. Voici les démarches que j'ai suivi jusqu'ici. $db = new PDO('mysql:host=localhost;dbname=projet;charset=utf8','root','**'); <meta charset="utf-8" /> alter database projet default-character set utf-8 conversion manuelle de tous mes fichiers en utf-8 sans bom **alter table utilisateur ................................ Venez à mon secours car je ne sais plus quoi faire

24 février 2018 à 11:17:05

...

-
Edité par LEPaul 26 mars 2018 à 12:27:48

Fidèle résumé de mes capacités ! Bon à rien, mauvais à tout. Faire le moins, mais BIEN
24 février 2018 à 23:58:09

Merci LEPaul j'ai retrouvé le problème.

J'utilisais quelque part dans mon code certaines fonctions de traitement de chaines comme: htmlspecialchars, trim, ucfirst, stripcslashes et ##d'autres qui dénaturaient l'encodage.

Pour les étoiles dont tu parles là je les ai utilisé parce que je ne veux pas partager mon mot de pass.

Merci pour tout.

25 février 2018 à 11:34:45

...

-
Edité par LEPaul 26 mars 2018 à 12:27:38

Fidèle résumé de mes capacités ! Bon à rien, mauvais à tout. Faire le moins, mais BIEN
25 février 2018 à 19:01:06

Non LEPaul c'est plutôt les codes qui sont des billes.

26 février 2018 à 1:09:16

Bonjour

j'aimerais avoir vos lumières

je suis actuellemnt en spécialité systèmes d'information et de gestion

et j'ai un problème en php

<?php
$evenement=$_POST["type"];
$taille=$_POST["Package"];
$date=$_POST["date"];
$date_resa = date("d-m-Y");
$CONFERENCE=$_POST["conf"];
$LAN=$_POST["LAN"];
$ANNIVERSAIRE=$_POST["annif"]; 
$pers_5=$_POST["num1"];
$pers_20=$_POST["num2"];
$pers_30=$_POST["num3"];
$pers_40=$_POST["num4"];
$pers_50=$_POST["num5"];

?>
<center><table>
<H1 class="titre">HARDWARE SHOP</H1>
<img src="" />
<tr>
	<td><?php print($date_resa) ?></td>
</tr>
<tr>
<td><?php 
 if ($LAN==$pers_5) {
	echo "Package entre 5 et 10 personnes : 15000XPF </br> Comprends : </br> -5 PC 
 </br>-2 consoles (1 PS4 et 1 Xbox One)
</br>-3 jeux au choix
</br>Livraison : 2000XPF
 </br>TOTAL : ………………………………………20000 XPF";
}
elseif ($LAN==$pers_20) {
	echo "Package entre 10 et 20 personnes : 20000XPF </br> Comprends : </br> -7 PC 
 </br>-4 consoles (2 PS4 et 2 Xbox One)
</br>-6 jeux au choix
</br>Livraison : 4000XPF
 </br>TOTAL : ………………………………………26000 XPF" ;
}
elseif ($LAN==$pers_30) {
	echo "Package entre 20 et 30 personnes : 25000XPF </br> Comprends : </br> -9 PC 
 </br>-6 consoles (3 PS4 et 3 Xbox One)
</br>-9 jeux au choix
</br>Livraison : 6000XPF
 </br>TOTAL : ………………………………………34000 XPF" ;
}
elseif ($LAN==$pers_40) {
	echo "Package entre 30 et 40 personnes : 30000XPF </br> Comprends : </br> -11 PC 
 </br>-8 consoles (4 PS4 et 4 Xbox One)
</br>-12 jeux au choix
</br>Livraison : 8000XPF
 </br>TOTAL : ………………………………………42000 XPF" ;
}
elseif ($LAN==$pers_50) {
	echo "Package entre 40 et 50 personnes : 35000XPF </br> Comprends : </br> -14 PC 
 </br>-10 consoles (4 PS4 ,4 Xbox One et 2 Nintendo Switch)
</br>-15 jeux au choix
</br>Livraison : 11000XPF
 </br>TOTAL : ………………………………………52000 XPF" ;
}


sachant que j'ai un formulaire en html

<form action="reservation.php" name="booking" method="POST">
	<table class="normal">
	<tr>
		<td>
			Type d'évènement
		</td>
		<td>
			<select name="type">
			<option name="LAN">LAN collective</option>
            <option name="conf">Conférence/Réunion d'entreprise</option>
            <option name="annif">Anniversaire</option>
		    </select>
		</td>
	</tr>
	<tr>
		<td>
			Package
		</td>
        <td>
        	<select name="Package">
        		<option name="num1">5-10 personnes(15000 francs)</option>
                <option name="num2">10-20 personnes(20000 francs)</option>
                <option name="num3">20-30 personnes(25000 francs)</option> 
                <option name="num4">30-40 personnes(30000 francs)</option>
                <option name="num5">40-50 personnes(35000 francs)</option>
        	</select>

        </td>
	</tr>
	<tr>
		<td>Date de réservation</td>
		<td><input type="text" name="date" required size="45"
           placeholder="La date doit être sous forme jour/mois/année"
           minlength="10" maxlength="10"></td>
	</tr>
    </table>
    <br>
    <center><INPUT type="submit" value="Envoyer"></center>
</form>


je ne comprends pas pourquoi il affiche seulement l'offre a 5 personne et pas les autres quand je choisis une autre autre que celle ci ...

Merci de votre aide

-
Edité par Infectious_WEB 26 février 2018 à 1:10:31

26 février 2018 à 8:52:03

Bonjour,

En HTML, il me semble qu'un select possède un id et les options un value.

Si tu fais un print_r de $_POST() tu devrais voir ce que ton formulaire renvoie réellement.

Christophe Vallot
26 février 2018 à 11:49:08

...

-
Edité par LEPaul 26 mars 2018 à 12:27:26

Fidèle résumé de mes capacités ! Bon à rien, mauvais à tout. Faire le moins, mais BIEN
27 février 2018 à 4:34:27

Salut ,
merci pour ton aide premièrement et deuxièmement je crois que ce que tu me dis est trop avancé pour le niveau que je suis sensé démontré au BAC cependant c'est beaucoup plus clair , mais le problème étant que je me dois d'utiliser ce qu'on nous apprends et pas faire du hors programme. Donc c'est un problématique....

Je vais essayer d'en parler à mon prof mais merci quand même , je te tiens au jus

Mais si je devais modifier ton code , pour rajouter des offres exemple un anniversaire , que faudrais-t-il que je fasse

Si le client choisis un anniversaire , avec 10 personne , que dois-je rajouter ??

A+

LEPaul a écrit:

Bonjour ça me fait de la peine de voir. Ta {Form html} et les conditions de réponses, je me permets de te proposé une idée suivant :

Quelque lignes tout comprises : Formulaire - Résultat - Notes rédactionels - Traduction
En fin compatible pas erreurs possible, tout ce qu'il a affaire c'est SOIGNES LES TABLEAUX

Je décrit la procédure:

Commencer par ta formulaire HTML en 
1- Textes descriptions
2- Champs de saisis en  {name}{value}{placeholder} {Tu peu mets plus Ex: required pour ... select }

Pour chaque {GROUPE} je prépare les éléments qui vont bien, ici c'est une array() mais ça pourrait combiné avec une Bd et Json ...
Ensuite il me reste à finir la mise en forme et exploités mes tableaux 


 Tu pourrait crée une class de formulaire avec ce système exemple 
Class -> function (evenement reservation voir d autre);

il te restent à approfondir 

		function Sel_XEnum($Aide='', $ValeurSaisie='xyz pour selected',$MonTableau='Ton tableau array' )
		{
/*Permet de lire un Tbl array puis traduire pour un selecteur de fichier attention partie option uniqument Exemple : <option value='ABC' selected>TEST</option> Note ca marche pour les tableaux de un et deux dimentions*/
		foreach($MonTableau AS $Num =>$Valeur)
		{
			$Af_Ops=ucfirst(strtolower($Valeur));
			$XselecUnite=$Num==$ValeurSaisie?"selected":"";
			$Ls.=$Af_Ops==''?"":"<option value='$Num'$XselecUnite>".$Af_Ops."</option>";
		}
		return "$Ls"; 
		}
/*Declaration langue tu mets ca dans un autre fichier et tu peu faire aussi pour $Langue[Us]-$Langue[Es]$Langue[Viper] pas plus d explication*/	
$Langue[fr] = array( Xtype=>"Type d'évènement", Sel_Package=>"Package", XdateResa=>"Date de réservation", Xplaceholder1=>"La date doit être sous forme jour/mois/année", 
Sel_Type_Lan=>"LAN collective", 
Sel_Type_Conf=>"Conférence/Réunion d'entreprise", 
Sel_Type_Anvrsr=>"Anniversaire", 
Rslt_Sel_Pckg_1=>"Package entre 5 et 10 personnes : 15000XPF </br> Comprends : </br> -5 PC </br>-2 consoles (1 PS4 et 1 Xbox One) </br>-3 jeux au choix </br>Livraison : 2000XPF </br>TOTAL : ………………………………………20000 XPF", 
Rslt_Sel_Pckg_2=>"Package entre 10 et 20 personnes : 20000XPF </br> Comprends : </br> -7 PC </br>-4 consoles (2 PS4 et 2 Xbox One) </br>-6 jeux au choix </br>Livraison : 4000XPF </br>TOTAL : ………………………………………26000 XPF",
Rslt_Sel_Pckg_3=>"Package entre 20 et 30 personnes : 25000XPF </br> Comprends : </br> -9 PC </br>-6 consoles (3 PS4 et 3 Xbox One) </br>-9 jeux au choix </br>Livraison : 6000XPF </br>TOTAL : ………………………………………34000 XPF",
Rslt_Sel_Pckg_4=>"Package entre 30 et 40 personnes : 30000XPF </br> Comprends : </br> -11 PC </br>-8 consoles (4 PS4 et 4 Xbox One) </br>-12 jeux au choix </br>Livraison : 8000XPF </br>TOTAL : ………………………………………42000 XPF",
Rslt_Sel_Pckg_5=>"Package entre 40 et 50 personnes : 35000XPF </br> Comprends : </br> -14 PC </br>-10 consoles (4 PS4 ,4 Xbox One et 2 Nintendo Switch) </br>-15 jeux au choix </br>Livraison : 11000XPF </br>TOTAL : ………………………………………52000 XPF",
Ops_Pckg_1=>"5-100 personnes (15000 francs)", 
Ops_Pckg_2=>"10-20 personnes (20000 francs)", 
Ops_Pckg_3=>"20-30 personnes (25000 francs)", 
Ops_Pckg_4=>"30-40 personnes (30000 francs)", 
Ops_Pckg_5=>"40-50 personnes (35000 francs)", 
);
/*Declaration de sélecteur et plus*/	
$Sel_Package= array ( Num1=>"".$Langue[fr][Ops_Pckg_1]."",
 Num2=>"".$Langue[fr][Ops_Pckg_2]."", Num3=>"".$Langue[fr][Ops_Pckg_3]."", Num4=>"".$Langue[fr][Ops_Pckg_4]."", Num5=>"".$Langue[fr][Ops_Pckg_5]."" );
$Sel_Type= array ( Lan=>"".$Langue[fr][Sel_Type_Lan]."", Conf=>"".$Langue[fr][Sel_Type_Conf]."",Annif=>"".$Langue[fr][Sel_Type_Anvrsr]."");

/*Prépare Resultat*/	
$Resul_Sel_Package= array ( Num1=>"".$Langue[fr][Rslt_Sel_Pckg_1]."", Num2=>"".$Langue[fr][Rslt_Sel_Pckg_2]."", Num3=>"".$Langue[fr][Rslt_Sel_Pckg_3]."", Num4=>"".$Langue[fr][Rslt_Sel_Pckg_4]."", Num5=>"".$Langue[fr][Rslt_Sel_Pckg_5]."" );

/*Prepation des groupes de saisis et retourn des POST[*.*] */
$Grp_Saisis_Type= array (
Xtype=>"<select name=Xtype> ".Sel_XEnum($Aide='',$ValX_Selected=$_POST[Xtype],$Sel_Type )." </select>",
Sel_Package=>"<select name=Sel_Package> ".Sel_XEnum($Aide='',$ValX_Selected=$_POST[Sel_Package],$Sel_Package )." </select>",
XdateResa=>"<input type='text' name='XdateResa' value='$_POST[XdateResa]'  size='45' placeholder='".$Langue[fr][Xplaceholder1]."'> <!--J ai retire required minlength='10' maxlength='10' pour test -- >",
Test_Ligne_En_trop=>"Tu voir ici Pas de declarion. ton script fonctionne et pas erreur",
);

/*ON SORT RÉSULTAT PRÉPARE SI _POST[XCondition]!='Test'*/
	if($_POST[XCondition]=='Test') {
		foreach($Grp_Saisis_Type AS $Trad =>$Champ_Sais)
		{$Conversion="$_POST[$Trad]";
/*Cas POST exceptionel*/
			if($Trad=='Xtype')
			{$ConversionAvn="$_POST[Xtype]"; $JoliResultat.= "<p>".$Langue[fr][$Trad]."<br>$Sel_Type[$ConversionAvn]</p>";}
			else
			{$JoliResultat.= $Resul_Sel_Package[$Conversion]==''?"<p>".$Langue[fr][$Trad]."<br>$Conversion</p>":"<p>".$Langue[fr][$Trad]."<br>$Resul_Sel_Package[$Conversion]</p>";}
		}
	}  
	
/*Partie HTML*/
	echo"$JoliResultat<table class='normal'><form action='?' name='booking' method='POST'><br><INPUT type='submit' value='Envoyer'><br> <input type='hidden' name='XCondition' value='Test'>";
		foreach($Grp_Saisis_Type AS $Trad =>$Champ_Sais) {echo"\t<tr>\n<td>".$Langue[fr][$Trad]."</td>\n<td>$Champ_Sais</td>\n</tr> \n";} 
	echo"</table> Et ajout ce que tu veux </form>";

Ps: Note J'ai observé 2 détails qui pourrait 

1 : Regarde dans le champs t'as utilisé  name="date" {input type="text" name="date" required size="45"}
Or le mot {date},{type} sont des fonctions native de php et d'autres donc il peu avoir des problème plus tard
Donc pour correction j'ai mis un {X} devant le date

2 : Essai de gardés les même constance dans le nomination des variables, pour plus tard 

Là tu dit 

$evenement=$_POST["type"];
$taille=$_POST["Package"];

Or le Variable {type} commence avec un ->[t]. et plus loin
 Variable {Package} commence avec un ->[P]

C'est peu être rien quand tu les appelle un par un, mais quant tu commence à faire de GRAND tableau.
C'est la merde croie moi tu perdra des heures et des heurs voir des jours juste par ce que ta déclaration
commence par un minuscule puis les résultats de ce dernier tu commence par Majuscule

Bonne continuation 

Tiens moi au courant

-
Edité par LEPaul il y a environ 13 heures



-
Edité par Infectious_WEB 27 février 2018 à 4:42:00

27 février 2018 à 12:49:29

...

-
Edité par LEPaul 26 mars 2018 à 12:27:11

Fidèle résumé de mes capacités ! Bon à rien, mauvais à tout. Faire le moins, mais BIEN
11 mars 2018 à 14:26:00

Bonjour !

Bon. Je suis le cours/MOOC POO PHP. Tout va bien. Mais quelques choses m'ont visiblement échappées. En effet, je rencontre une erreur 500 543 lors de l'affichage d'un nouveau module. Je l'ai créé en reprennant la démarche pour le Module News créé dans le MOOC. Visiblement cela vient du PDO. Le code d'origine de la fonction getList que j'ai intégré dans le nvModule :

public function getList($debut = -1, $limite = -1)
  {
    $sql = 'SELECT * FROM nvModule ORDER BY id DESC';
    
    if ($debut != -1 || $limite != -1)
    {
      $sql .= ' LIMIT '.(int) $limite.' OFFSET '.(int) $debut;
    }
    
    $requete = $this->dao->query($sql);
    $requete->setFetchMode(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, '\Entity\nvModule');
    
    $listeEA = $requete->fetchAll();
    
    $requete->closeCursor();
    
    return $listeEA;
  }

L'erreur 500 disparait quand je modifie la fonction de cette façon :

	public function getList($debut = -1, $limite = -1)
  	{
    $sql = 'SELECT * FROM nvModule ORDER BY id DESC';
    
    if ($debut != -1 || $limite != -1)
    {
      $sql .= ' LIMIT '.(int) $limite.' OFFSET '.(int) $debut;
    }
    
    $requete = $this->dao->query($sql);

    $listeEA = $requete->fetchAll();
    
    $requete->closeCursor();
    
    return $listeEA;
  	}

Comme vous pouvez le voir, le pb disparaît quand je n'uitilise plus \PDO::xxxx et la class nvModule.

Je ne vois vraiment pas de quoi cela peut venir. Une idée ?

Merci pour votre être précieuse.


Matthieu Charnacé
13 mars 2018 à 10:57:11

Bonjour,

J'ai un problème avec ce cours en particulier avec le TP Mini jeu de combat.

Voici le code qui me pose problème en particulier le UPDATE de $perso. 

...
$retour = $perso->frapper($persoAFrapper); // On stocke dans $retour les éventuelles erreurs ou messages que renvoie la méthode frapper.
      
      switch ($retour)
      {
        case Personnage::CEST_MOI :
          $message = 'Mais... pourquoi voulez-vous vous frapper ???';
          break;
        
        case Personnage::PERSONNAGE_FRAPPE :
          $message = 'Le personnage a bien été frappé !';
          
          $manager->update($perso);
          $manager->update($persoAFrapper);
          
          break;
        
        case Personnage::PERSONNAGE_TUE :
          $message = 'Vous avez tué ce personnage !';
          
          $manager->update($perso);
          $manager->delete($persoAFrapper);
          
          break;
      }
...

En effet lorsque $perso attaque persoAFrapper aucun "paramètre" (attribut) de $perso ne change. Alors pourquoi faire un UPDATE sur ce personnage ? Par contre $persoAFrapper lui voit son attribut $_degats modifié suite à l'attaque donc un UPDATE de ce personnage est nécessaire pour enregistrer dans la base la nouvelle valeur de $degats...

Merci d'avance pour votre aide...



-
Edité par chris79 13 mars 2018 à 11:07:26

13 mars 2018 à 16:52:10

Bonjour à Vous Est qq pourrait me dire ce que je fait comme fautes, sur opération suivante:
Voilà je veux connaitre l'adresse IP un visiteur

Donc pour ça je déploie la fonction native dans PHP supert varriable suivis Extension donc ça donne un truc comme ça : $_SERVER ['REMOTE_ADDR']

Donc en vraie : 

$Ip_Machin=$_SERVER ['REMOTE_ADDR'];
echo  $Ip_Machin; 

 Donc en mode local ça donne bien : 127.0.0.1 Ou localhost
Maintenant que je le met sur mon serveur {chez 1and1.fr}
Ca donne ça : 2a01:cb19:80f1:9200:4425:d65f:b48a:7e85 

Bien supposons cet chaine  {2a01....} est adresse dynamique distribué par Ipv6 (La box)
Comment le convertir  en clair 109.220.135.230

 (C'est vieux comme internet :colere:Mais quand ça ne veux pas )

Merci pour votre aide

Comme personne m'as aidé je suis quand même trouvé et solutionné 

N'attendez plus rien de ma part mes amis
(Si on peu dire )

-
Edité par LEPaul 26 mars 2018 à 12:26:42

Fidèle résumé de mes capacités ! Bon à rien, mauvais à tout. Faire le moins, mais BIEN
13 mars 2018 à 18:44:22

Bonjour !

Dans la partie traitant des interfaces l’implémentation d'Iterator et SeekableIterator me pose problème. En effet, après la boucle 

foreach ($objet as $key => $value)
{
  echo $key, ' => ', $value, '<br />';
}

affichant bien

0 => Premier élément
1 => Deuxième élément
2 => Troisième élément
3 => Quatrième élément
4 => Cinquième élément

Si ensuite je lance :

echo $objet->key(); // affiche 5

cela m'affiche 5, pourquoi pas 4 ?

-
Edité par elkOoman 13 mars 2018 à 18:46:32

14 mars 2018 à 5:12:34

Dans la création d'un framework, dans la classe Route il y a une fonction que j'arrive pas à comprendre. Je me demandais si quelqu'un serait assez gentil pour éclairer ma lanterne.

public function match($url){
    if(preg_match('`^'. $this->url .'$`', $url, $matches)){
        return $matches;
    }else{
        return false;
    }
}				



-
Edité par NakedSam 14 mars 2018 à 5:18:43

14 mars 2018 à 8:07:42

...

-
Edité par LEPaul 26 mars 2018 à 12:29:10

Fidèle résumé de mes capacités ! Bon à rien, mauvais à tout. Faire le moins, mais BIEN
19 mars 2018 à 13:09:24

Bonjour, j'espère que c'est ici qu'on pose les questions.

je souhaiterais maitriser la notion d'exécution d'une requête dans un lien. En effet cette notion est utilisée dans le 1er tp de POO PHP, et permet donc d'incrémenter de 5 les dégâts de façon ultra dynamique. Pourriez vous m'aider à vraiment comprendre comment fonctionne ce lien, car je trouve les explications du cour trop condensées, pour un novice comme moi.

foreach ($persos as $unPerso)
{
echo '<a href="?frapper=', $unPerso->id(), '">', htmlspecialchars($unPerso->nom()), '</a> (dégâts : ', $unPerso->degats(), ')<br />';
}
19 mars 2018 à 23:35:53

Je ne suis pas un pro mais je peux te décortiquer l'instruction

echo '<a href="?frapper=', $unPerso->id(), '">


Donc on crée un lien, avec l'ID du personnage dedans qu'on récupérera dans $_GET. 

 htmlspecialchars($unPerso->nom())

On insère le nom du personnage. C'est ce que l'utilisateur verras comme texte pour le lien.

(dégâts : ', $unPerso->degats(), ')<br />';

On affiche les dégâts, et ensuite on fait un retour de ligne

La ligne ressemblera donc a : Gandalf (dégâts: 5)
Avec un lien cliquable sur Gandalf qui pointera vers : adresseDuFichier?frapper=idDuPerso


Quand tu vas cliquer dessus tu va récupérer la valeur en get(la valeur de $_GET['frapper'] qui correpond à l'id du perso) et lui infliger les dégâts, comme tu as l'id du personnage.

Ce qui m'as perturbé dans ce tp, c'est que l'auteur du cours utilise les dégâts reçu comme indicateur de santé. Plutôt que les PV restants.

J'espère que j'ai pu t'aider, moi aussi je suis en apprentissage.

25 mars 2018 à 3:28:48

bonjours, j'ai un problem avec la fonction ob_start() qui n'a aucun effet et le navigateur continue l'affichage du text
25 mars 2018 à 22:53:37

Créer une page RechercherUtilisateurs.php q

-
Edité par ZinebGuerrab 25 mars 2018 à 22:54:29

27 mars 2018 à 6:32:48

Bonjour,

Je suis novice en PHP. J'ai un problème avec le TP: mini jeu de combat. J'ai bien compris le cours. Et lors de l'exécution du TP, aucune réaction ne se passe. Je reste sur le formulaire avec le champ texte et les deux boutons submits. le seul affichage qu'il y a est le nombre de personnages qui existent dans la base de données et que j'ai inséré à l'aide de phpmyadmin.

Désespérée, j'ai recopié le code du prof. là aussi rien ne fonctionne.

Voilà la classe Personnages :

<?php
	class Personnages{
		//attributs
		private $_id;
		private $_nom;
		private $_degats;
		
			
		//declaration des constantes par rapport à la force
		const CEST_MOI = '1';
		const PERSONNAGE_TUE = "2";
		const PERSONNAGE_FRAPPE = "3";
		
		//declaration des attributs statiques
		private static $texteADire = "je suis le personnage le plus fort. j\'ai gagné tous les combats. Personne ne peut me battre !.";
		//constructeurs -> hydradation à la création de l'objet
		public function __construct(array $donnees){
			$this->hydrate($donnees);
		}
		
		//fonction hydrate
		public function hydrate(array $donnees){
			foreach ($donnees as $key => $value) {
				$setter = 'set'.ucfirst($key);
				if(method_exists($this, $setter)){
					//Appel du setter
					$this->$setter($value);
				}
			}
		}
		//getters 
		public function id(){
			return $this->_id;
		}
		public function nom(){
			return $this->_nom;
		}
		public function degats(){
			return $this->_degats;
		}
		//setters 
		public function setId($id){
			$id = (int)$id;
			if($id > 0){
				$this->_id = $id;
			}
		}
		public function setNom($nom){
			if(is_string($nom) && strlen($nom) <=50){
				$this->_nom = $nom;
			}
		}
		public function setDegats($degats){
			$degats = (int)$degats;
			if($degats >= 0 && $degats <=100){
				$this->_degats = $degats;
			}else{
				trigger_error('les dégats d\'un personnage doitvent être supérieures ou égales à zéro et ne doivent pas dépasser 100 !.',E_USER_WARNING);
				return;
			}
		}
		public function frapper($perso){
			if($this->id() == $perso->id()){
				return self::CEST_MOI;
			}
			return $perso->recevoirDegats();
		}

		public function recevoirDegats(){
			$this->_degats+=5;
			if($this->degats() >= 100){
				return self::PERSONNAGE_TUE;	
			}
			return self::PERSONNAGE_FRAPPE;
		}

		public function nomValide(){
			return !empty($this->_nom);
		}
	}
?>

et voici le code de la classe manager :

<?php
	class PersonnagesManager{

		//instance de PDO
		private $_db;

		//constructeurs
		public function __construct($db){
			$this->setDb($db);
		}

		//les méthodes CRUD
		public function add(Personnages $perso){
			//preparation de la requete d'insertion
			//assignation des valeurs pour le nom, localisation, forcePerso, degats, niveau, experience
			//exécution de la )
			$q = $this->_db->prepare('INSERT into personnages(nom, degats)values(:nom, :degats)');
			$q->bindValue(':nom',$perso->nom(),PDO::PARAM_STR);
			$q->bindValue(':degats',$perso->degats(),PDO::PARAM_INT);
			$q->execute();
			/*$perso->hydrate([
				'id' => $this->_db->lastInsertId(),
				'degats' => 0
			]);*/
		}
		public function count(){
			//exécute une requête count et retourne le nombre de résultats retourné
			/*$q = $this->_db->query('select count(*) from personnages');
			$q->fetchColumn();
			return $q;*/

			return $this->_db->query('select count(*) from Personnages')->fetchColumn();
		}
		public function delete(Personnages $perso){
			//exécute une requête de type delete
			$this->_db->exec('delete from personnages where id='.$perso->id());
		}
		public function exists($info){
			//si le paramètre est un entier, c'est qu'on a fourni un identifiant
			//on exécute une requête count() avec une clause where et on retourne un boolean
			//sinon, c'est qu'on a passé un nom
			//on exécute une requête count() avec une clause where et on retourne un boolean

			if(is_int($info)){
				return (bool) $this->_db->query('SELECT count(*) from personnages where id='.$info)->fetchColumn();
			}
			$q = $this->_db->prepare('SELECT count(*) from personnages where nom = :nom');
			$q->execute([':nom' => $info]);
			return(bool) $q->fetchColumn();
		}
		public function get($info){
			//exécute une requête de type select avec une clause where et retourne un objet de type Personnage
			if(is_int($info)){
				$q = $this->_db->prepare('SELECT id, nom, degats from personnages where id='.$info);
				$donnees = $q->fetch(PDO::FETCH_ASSOC);
				return new Personnages($donnees);
			}else{
				$q = $this->_db->prepare('SELECT id, nom, degats from Personnages where nom= :nom');
				$q->execute([':nom' => $info]);
				return new Personnages($donnees);
			}
		}

		public function getList($nom){
			//retourne la liste des personnages dont le nom n'est pas $nom
			//le résultat sera un tableau d'instances de personnages
			$persos = [];
			$q = $this->_db->prepare('SELECT id, nom, degats from personnages where nom <> :nom order by nom');
			$q->execute([':nom' => $nom]);
			while($donnees = $q->fetch(PDO::FETCH_ASSOC)){
				$persos [] = new Personnages($donnees);
			}
			return $persos;
		}
		/*public function getList(){
			// retourne la liste de tous les personnages
			$persos = [];
			$q = $this->_db->query('select id, nom, degats from personnages order by nom');
			while($donnees = $q->fetch(PDO::FETCH_ASSOC)){
				$persos[] = new Personnages($donnees);
			}
			return $persos;
		}*/

		public function update(Personnages $perso){
			// prépare une requête de type update
			//assignation des valeurs à la requête
			//exécution de la requête
			$q = $this->_db->prepare('update table personnages set degats = :degats where id = :id');
			$q->bindValue(':degats',$perso->degats(),PDO::PARAM_INT);
			$q->bindValue(':id',$perso->id(),PDO::PARAM_INT);
			$q->execute();
		}

		//pas besoin d'accesseurs -> uniquement un setter
		public function setDb(PDO $db){
			$this->_db = $db;
		}
	}
?>

Et voici la fichier formulaire :

<?php
function chargerClasse($classeName){
	require $classeName.'.php';
}
spl_autoload_register('chargerClasse');
	
session_start();

if(isset($_GET['deconnexion'])){
	session_destroy();
	header('Location: .');
	exit();
}



$db = new PDO('mysql:host=localhost;dbname=tests','root','');
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);


$manager = new PersonnagesManager($db);

if(isset($_SESSION['perso'])){
	$perso = $_SESSION['perso'];
}


if(isset($_POST['creer']) && isset($_POST['nom'])){
	
	$perso = new Personnages([
		'nom' => $_POST['nom'],
		'degats' => 0
	]);
	var_dump($perso);

	if(!$perso->nomValide()){
		$message='le nom choisi est invalide !.';
		unset($perso);
	}
	elseif($manager->exists($perso->nom())){
		$message='le nom existe déjà dans la base de données !.';
		unset($perso);
	}
	else
	{
		$manager->add($perso);
	}
}
elseif(isset($_POST['utiliser']) && isset($_POST['nom'])){

	if($manager->exists($_POST['nom'])){
		$perso = $manager->get($_POST['nom']);
	}
	else
	{
		$message='le nom du personnage n\'existe pas dans la base !.';
	}
}
elseif(isset($_GET['frapper'])){
	
	if(!isset($perso)){
		$message='Merci de créer un personnage ou de vous identifier !.';
	}
	else
	{
		if(!$manager->exists((int) $_GET['frapper'])){
			$message = 'Le personnage que vous voulez frapper n\'existe pas !.';
		}
		else
		{
			$persoAFrapper = $manager->get((int) $_GET['frapper']);
			$retour = $perso->frapper($persoAFrapper);
			switch($retour){
				case Personnages::CEST_MOI :
					$message =' Mais .... voulez-vous vous frapper ???';
					break;
				case Personnages::PERSONNAGE_FRAPPE :
					$message='Le personnage a bien été frappé !.';
					$manager->update($perso);
					$manager->update($persoAFrapper);
					break;
				case Personnages::PERSONNAGE_TUE :
					$message='Vous avez tué ce personnage !.';
					$manager->update($perso);
					$manager->delete($persoAFrapper);
					break;
			}
		}
	}
}
?>

<!DOCTYPE html>
<html>
<head>
	<title>TP1 : Jeu de Combat</title>
	<meta charset="utf-8" />
</head>

<body>
	
	<p>Le nombre de personnages créés : <?= $manager->count() ?></p>
	<?php	
		if(isset($message)){
			echo '<p>'.$message.'</p>';
		}
		
		if(isset($perso))
		{
	?>
	<p><a href="?deconnexion=1">Déconnexion</a></p>
	<fieldset>
		<legend>Mes informations</legend>
		<p>
			Nom : <?= htmlspecialchars($perso->nom()) ?> </br>
			Dégats : <?= $perso->degats() ?>
		</p>
	</fieldset>

	<fieldset>
		<legend>Qui frapper ?</legend>
		<p>
			<?php
				$persos = $manager->getList($perso->nom());
				if(empty($persos)){
					echo 'Personne à frapper !.';
				}
				else
				{
					foreach($persos as $unPerso){
						//echo '<a href="?frapper='.$unPerso->id().'">'.htmlspecialchars($unPerso->nom()).'</a> 
							//(dégâts : '.$unPerso->degats().') <br/>';
							echo '<a href="?frapper=', $unPerso->id(), '">', htmlspecialchars($unPerso->nom()), '</a> (dégâts : ', $unPerso->degats(), ')<br />';
					}
			}
			?>
		</p>
	</fieldset>
	<?php
		}
		else
		{
	?>
	<from action="" method="post">
		<p>
			Nom : <input type="text" name="nom" maxlength="50" />
    		<input type="submit" value="Créer ce personnage" name="creer" />
  			<input type="submit" value="Utiliser ce personnage" name="utiliser" />
		</p>
	</from>
	<?php
		}
	?>
</body>
</html>
<?php
if(isset($perso)){
	$_SESSION['perso'] = $perso;
}



Voilà la capture d'ecran : il n' y a pas de message d'erreurs. Je clique sur le bouton créer ce personnage sans résultat.

SVP quelqu'un pourrait m'aider à résoudre ce problème.

Merci d'avance.




27 mars 2018 à 21:16:11

bonjour , jai un probleme avec une requete preparé et la clause limit voila le code :

<?php
if(!isset($_GET['page']))
{
        $req=$db->query('select*from Blog order by dateA desc limit 2');

        while($fetch=$req->fetch())
        {
        ?>
                <div id=news>
                        <h2><?php echo$fetch['titre'];?><em><?php echo$fetch['dateA'];?></em></h2>
                        <p><?php echo $fetch['contenu'];?></p>
                </div>
        <?php
        }

}

else
{
        $l=$_GET['page']*2;
        $o=(int)($l-2);
        $req=$db->prepare('select*from Blog order by dateA desc limit :l offset :o');
        $req->bindparam(':l',$l,pdo::PARAM_INT);
        $req->bindparam(':o',$o,pdo::PARAM_INT);
        $exe=$req->execute();

        while($fetch=$exe->fetch())
        {
        ?>
                <div id=news>
                <h2><?php echo$fetch['titre'];?><em><?php echo$fetch['dateA'];?></em></h2>
                <p><?php echo $fetch['contenu'];?></p>
                </div>
        <?php
        }
}

$i=2;
while($i<3)
{
?>
        <p>page : <a href=index.php?page=<?php echo$i;?>><?php echo$i;?></a></p>
<?php
        $i++;
}



29 mars 2018 à 13:46:59

dadaapocalypse a écrit: 

Bonjour,

J'ai enfin résolu le problème. En effet, j'ai marqué <from> au lieu de <form>. C'est pourquoi, quand je clique sur le bouton 'créer ce personnage', rien ne se passe. C'est une erreur d'inattention. 

Là, je pourrai enfin continuer la suite du cours.

Problème résolu.

Merci :)

toute théorie est grise, seule l'arbre de la vie est verte.

Bonjour,

J'ai enfin résolu le problème. En effet, j'ai marqué <from> au lieu de <form>. C'est pourquoi, quand je clique sur le bouton 'créer ce personnage', rien ne se passe. C'est une erreur d'inattention. 

Là, je pourrai enfin continuer la suite du cours.

Problème résolu.

Merci :)



-
Edité par dadaapocalypse 29 mars 2018 à 13:50:00

30 mars 2018 à 9:21:11

Bonjour je suis actuellement entrain de mettre sur pied un site de ecommerce et j'aimerais savoir comment gerer les images des produits postés par des vendeurs dans ma bd sachant qu'un produit peut avoir plusieurs photos

MOOC Programmez en orienté objet en PHP

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown