[RESOLU] Faire un calendrier.

Petit nouveau ! | 2 Messages

29 août 2014, 04:48

Oui!! Cette fois ça y est, j'arrive à enregistrer la date :D
C'est très concis, je ne pensais pas qu'il était nécessaire d'ajouter le tiret entre 0000 et 00-00

Il me reste maintenant à récupérer la variable id_user dans la table.
Dans ma table d'identification (nom d'utilisateur/mot de passe), j'ai la valeur 1 pour le seul id_user que j'ai,
et dans le formulaire je récupère la valeur 0 au lieu de 1 (j'ai 0 comme valeur d'id_user dans ma table de réservations).

Dans le formulaire de ma page d'identification je récupère
bien l' id_user dans la table, et je le mets dans une variable session:
$nombase=mysqli_select_db($connexion,$nombase) or die ("Sélection de la base impossible.");
$req="SELECT id_user FROM identification WHERE nom_utilisateur='$nom_utilisateur_envoye'
                     AND mot_de_passe='$mot_de_passe_envoye'";
$query=mysqli_query($connexion,$req) or die ("Exécution de la requête impossible: ".mysqli_error($connexion));

$_SESSION['id_user'] = $id_user;
(=>question d'ailleurs, pourquoi du code de nettoyage doit être mis dans $req puisque les données viennent de ma table dans phpmyadmin?)

Ensuite, sur toutes mes pages de session je redirige l'utilisateur en dehors de la session si
l'id_user est absent:
<?php
session_start();
if (isset($_SESSION['id_user']) && ...
Dans la page du formulaire de réservation, un champs caché récupère
la variable pour le formulaire:
         <li><input type="hidden" name="id_user" value="id_user" /></li>
Et dans la page de traitement du formulaire, je récupère l'id_user posté:
$identification_id_user=$_POST['id_user'];
Je le nettoie:
$identification_id_user = mysqli_real_escape_string($connexion, $authentification_id_user);
et je l'insère dans la base avec les autres variables:
$req="INSERT INTO reservations (id_user,... ,... ,...)
VALUES('".$identification_id_user."',..., ..., ...)
Dans ma table identification il y a la valeur 1 pour l'id_user et je retrouve la valeur 0 dans la table reservations.
Je ne comprends pas, je ne vois pas ou ça peut clocher.
Plutôt que de dire que ma valeur se soit transformée en cours de route, se serait-elle perdue?
ça a l'air très difficile et complexe.


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
coque one M8

Eléphant du PHP | 290 Messages

29 août 2014, 18:34

Dur dur :?

Je te montre où j'en suis.
Dans mon fichier js, j'ai mis en commentaires les difficultés sur lesquelles je butte.

Ma page de formulaire de réservations.
Première partie (en-tête):
[javascript]
<!-- code dans l'en-tête spécifique pour le calendrier -->
<script src="precajax.js"></script>
<script src=""></script>
[/javascript]
Je précise que je compte m'occuper de la partie mois suivant dans un deuxième temps.

Ma page de formulaire de réservations.
Deuxième partie (les css):
<!-- css pour le formulaire -->
<style type="text/css">
.boutonprec {position: absolute; top: 827px; left: 650px; width: 180px; height: 30px; color: transparent; background-color: transparent; border-color: transparent; z-index: 1; }
.boutonsuiv {position: absolute; top: 827px; left: 833px; width: 180px; height: 30px; color: transparent; background-color: transparent; border-color: transparent; z-index: 1; }
Ma page de formulaire de réservations.
Troisième partie (le corps):
<!-- code dans le corps spécifique pour le calendrier -->
[javascript]
<script="text/javascript">
<button type="button" id="boutonprec" class="boutonprec" onclick="getAJAXmoisPrecedent()" onFocus="this.style.borderColor='#33CCFF';" onBlur="this.style.borderColor='#000000';">mois précédent
</button>
<button type="button" class="boutonsuiv" onclick="getAJAXmoisSuivant()">mois suivant
</button>
<div id= "output"></div>
</script>
[/javascript]
<img src="moisprecedent.jpg" alt="image bouton page précédente" style="position: absolute; top: 827px; left: 650px;" />
<img src="moissuivant.jpg" alt="image bouton page suivante" style="position: absolute; top: 827px; left: 833px;" />
         <li><input type="hidden" name="periode" value="periode" /></li>
Je ne sais pas si je vais avoir besoin de la dernière ligne pour le champs caché?

Le fichier js:
[javascript]
<script type="text/javascript">

var boutonprec = document.getElementById("boutonprec"); //récupération des données

var result = showCalendar($period); //affichage du résultat
if (button.boutonprec == true) {
result =+ getMonth(+1); //ici l'éditeur m'indique une erreur de syntaxe
}

function getAJAXmoisSuivant(){ //début de la fonction globale

var request = new XMLHttpRequest(); //objet qui fait fonctionner AJAX
request.open ("POST", "add1month.php", true);
request.onreadystatechange = checkdate;
request.send("periode="result); //je ne comprends pas comment récupérer cette fonction dans mon script php via un POST

function checkdata(){
if(request.readyState==4){
//si la requête est terminée
if(request.status==200){
//et si la requête est un succès
alert(request.responseText); //je ne sais pas comment gérer ça (je sais qu'on parle du text accompagnant le code de status)
}
}
}


} //fin de la fonction globale

output = document.getElementById("output"); //générer le nouveau calendrier à la sortie
output.innerHTML = result;

</script>
[/javascript]
Note: j'ai essayé de faire des choses en comprenant ce que je fais.
Mais à vrai dire j'ai des difficultés à bien tout comprendre.

Le fichier php ensuite.
Inutile que je le remette là.
J'ai simplement fait un copier/coller de tout le code du calendrier
puisque la fonction de génération comprend tout le calendrier.
Mais là encore je ne suis pas sûr d'avoir bien compris.

Est-ce que tu peux me donner de nouvelles indications pour m'aider à avancer?

Eléphant du PHP | 113 Messages

29 août 2014, 22:01

les balises <script type="text/javascript"></script> ne sont réservé pour n'y mettre que du javascript ! Donc tu ne peux pas mettre de html au naturel comme ça. (C'est pas propre et surtout inutile dans ton cas, là ou tu affiche les deux boutons et le div pour le résultat)
D'ailleurs il me semble (à vérifier) que spécifier le type pour <script> est obsolète (plus dans les normes).

Ensuite pour ce champ: <li><input type="hidden" name="periode" value="periode" /></li>
1- pourquoi des li ?
2- non tu n'en as pas besoin mais il faut que mette la valeur de $periode en paramètre pour que tu saches générer un calendrier pour le mois que l'utilisateur souhaite. Donc:
echo '<button type="button" id="boutonprec" class="boutonprec" onclick="getAJAXmoisPrecedent(\'',$periode,'\')" onFocus="this.style.borderColor='#33CCFF';"         onBlur="this.style.borderColor='#000000';">mois précédent</button>
<button type="button" class="boutonsuiv" onclick="getAJAXmoisSuivant(\'',$periode,'\')">mois suivant</button>';
Dans ta fonction getAJAXmoisSuivant() tu dois déjà déterminer la période pour le mois suivant.

On avait fait un script pour calculer la période pour le mois précédant et suivant il me semble. Donc il s'offre à nous une solution plus simple et plus propre ! => EDIT: en fait non, donc je t'ai directement coder la fonction. Elle fonctionne parfaitement j'ai fait les tests, par contre faut respecter le format de $periode et $operation (soustraction et addition uniquement), tu remarqueras qu'il n'y a pas de gestion des erreurs, donc par la suite c'est quelque chose qui peut être fait... (pas important puisque c'est toi qui l'utilise donc tu sais ce qu'elle demande en paramètre)
$periode; //représente une date au format AAAA-MM-JJ

function OpeMonth($periode,$operation) {
//Cette fonction que j'ai écrite marche pour les
//additions et soustractions de tout nombres
//ex: -140 mois, ou +5 mois

   $mois = getMonth($periode);
   $jour = getDay($periode);
   $annee = getYear($periode);

   if ($operation >= 12) {   //Ajout de mois de plus d'une année
      do {
         $annee++;
         $operation -= 12;
      } while ($operation >= 12);
   } elseif ($operation <= -12) {   //Retrait de mois de plus d'une année
      do {
         $annee--;
         $operation += 12;
      } while ($operation < 0);
   }

   if ($mois + $operation < 1) {   //Si l'opération total passe à l'année précédente 
         $annee--;
         $operation += $mois;
         $mois = 12;
   } elseif ($mois + $operation > 12) {   //Si l'opération total dépasse l'année
         $annee++;
         $operation += $mois - 12;
         $mois = 0;
   }

   $mois += $operation;   //On fait l'opération sur le mois

   return $annee . '-' . $mois . '-' . $jour;
}

$periodePrec = OpeMonth($periode,-1);
$periodeSuiv = OpeMonth($periode,+1);

echo '<button type="button" id="boutonprec" class="boutonprec" onclick="getAJAXmoisPrecedent(\'',$periodePrec,'\')" onFocus="this.style.borderColor='#33CCFF';"         onBlur="this.style.borderColor='#000000';">mois précédent</button>
<button type="button" class="boutonsuiv" onclick="getAJAXmoisSuivant(\'',$periodeSuiv,'\')">mois suivant</button>';
ainsi tu auras directement ta valeur periode en js, donc n'oublie pas le request.send("periode=" + periode); et de traiter le POST['periode'] dan ton php

Eléphant du PHP | 113 Messages

31 août 2014, 12:23

$periode; //représente une date au format AAAA-MM-JJ

function OpeMonth($periode,$operation) {
//Cette fonction que j'ai écrite marche pour les
//additions et soustractions de tout nombres
//ex: -140 mois, ou +5 mois

   $mois = getMonth($periode);
   $jour = getDay($periode);
   $annee = getYear($periode);

   if ($operation >= 12) {   //Ajout de mois de plus d'une année
      do {
         $annee++;
         $operation -= 12;
      } while ($operation >= 12);
   } elseif ($operation <= -12) {   //Retrait de mois de plus d'une année
      do {
         $annee--;
         $operation += 12;
      } while ($operation < 0);
   }

   if ($mois + $operation < 1) {   //Si l'opération total passe à l'année précédente 
         $annee--;
         $operation += $mois;
         $mois = 12;
   } elseif ($mois + $operation > 12) {   //Si l'opération total dépasse l'année
         $annee++;
         $operation += $mois - 12;
         $mois = 0;
   }

   $mois += $operation;   //On fait l'opération sur le mois

   return $annee . '-' . $mois . '-' . $jour;
}
Je devais être un peu dans les vap' car on peut simplement le faire avec une simple soustraction de date sans avoir besoin de fonction... je ne sais pas ce qui m'est arriver ^^' :
$periode; //représente une date au format AAAA-MM-JJ

$periodePrec = date("Y-m-d",mktime(0,0,0,getMonth($periode)-1,1,getYear($periode)));

$periodeSuiv = date("Y-m-d",mktime(0,0,0,getMonth($periode)+1,1,getYear($periode)));


Eléphant du PHP | 290 Messages

01 sept. 2014, 09:59

Merci pour l'avancée :D
le seul truc c'est que mon cerveau traîne un peu pour te suivre ...

Je souhaiterais te poser quelques questions pour mettre à jour ma compréhension.

1) Il y a d'abord un truc que je ne comprends pas à propos des antislashs quant aux variables.
Tu mets:
echo '<button type="button" id="boutonprec" class="boutonprec" onclick="getAJAXmoisPrecedent(\'',$periode,'\')" onFocus="this.style.borderColor='#33CCFF';"         onBlur="this.style.borderColor='#000000';">mois précédent</button>
<button type="button" class="boutonsuiv" onclick="getAJAXmoisSuivant(\'',$periode,'\')">mois suivant</button>';

a) Pourquoi les guillements de $periode ont-ils des antislahs ici? Je ne comprends pas, c'est pourtant de html puisque c'est dans une instruction echo.
On utilise bien les antislahs quand c'est du php, comme c'était le cas avec:
$afficheJour = "<input type=\"button\" name=\"datejour\" value=\"" . $var_j . "\" onClick=\"date_id_jour.value=this.value; date_id_annee_mois.value='" . $var_am . "' \">";
b) autre question en relation avec a), pourquoi dans ce dernier cas $var_am prends les antislashs alors que $var_j ne les prends pas?
Je n'arrive pas à comprendre.
c) je revient au code concernant ajax, pourquoi tu entoures les deux $periode ci-dessus de virgules?
Ca je ne comprends pas non plus.

2) dans ton code php, je ne connais pas -= et +=
$operation -= 12;
$operation += 12;
Je n'ai jamais vu ça, qu'est-ce que ça veut dire?
=>même si je prends la solution la plus simple je serais curieux de savoir ^ ^

3) Que représente la variable $operation dans ton code?

C'est sympa si tu peut me renseigner sur ces quelques points.

Par rapport au fait de mettrre du html dans mon javascript:
[javascript]
<!-- code dans le corps spécifique pour le calendrier -->
<script="text/javascript">
<button type="button" id="boutonprec" class="boutonprec" onclick="getAJAXmoisPrecedent()" onFocus="this.style.borderColor='#33CCFF';" onBlur="this.style.borderColor='#000000';">mois précédent
</button>
<button type="button" class="boutonsuiv" onclick="getAJAXmoisSuivant()">mois suivant
</button>
<div id= "output"></div>
</script>
[/javascript]
Je n'ai pas voulu mettre du html mais c'est bien du javascript que j'ai voulu écrire.
j'ai lu dans des livres que ça s'écrit comme ça en javascript, même pour [javascript]<button type="button"...[/javascript]
il s'agit bien javascript, pas de html d'après ce livre (peut-être qu'il y a une erreur dans le livre ou qu'il est obsolète).

Eléphant du PHP | 113 Messages

01 sept. 2014, 13:04

1) http://php.net/manual/fr/function.echo.php
echo est multi-paramètres, c'est une procédure, mais comme dans les fonctions, pour séparer les paramètres on met une virgule. C'est pourquoi j'ai mis des "," autour de ma variable dans le echo, j'aurai pu concaténer avec "." ou simplement mettre ma variable comme tel "$var". Or en faisant des tests tu peux observer que l'utiliser comme un paramètre (ça aura le même visuel à la fin) est un chouilla plus rapide ^^ Bon c'est une convention, à toi de voir ce qui te vas le mieux, mais c'est pas très logique de pas utiliser les ",".

Dans cette ligne:
 echo '<button type="button" id="boutonprec" class="boutonprec" onclick="getAJAXmoisPrecedent(\'',$periode,'\')" onFocus="this.style.borderColor='#33CCFF';"         onBlur="this.style.borderColor='#000000';">mois précédent</button>
<button type="button" class="boutonsuiv" onclick="getAJAXmoisSuivant(\'',$periode,'\')">mois suivant</button>'; 
On attend ce résultat dans le code HTML:
<button type="button" id="boutonprec" class="boutonprec" onclick="getAJAXmoisPrecedent('2014-08-01')" onFocus="this.style.borderColor='#33CCFF';"         onBlur="this.style.borderColor='#000000';">mois précédent</button>
<button type="button" class="boutonsuiv" onclick="getAJAXmoisSuivant('2014-10-01')">mois suivant</button>
Je t'en avait déjà parler, tu commences par écrire ton code html comme tu le vois à la fin. Tu rajoutes echo devant et toutes les apostrophes qu'il faut, au début, à la fin, à chaque ',' si c'est pour délimiter une nouvelle chaîne ou variable...
$afficheJour = "<input type=\"button\" name=\"datejour\" value=\"" . $var_j . "\" onClick=\"date_id_jour.value=this.value; date_id_annee_mois.value='" . $var_am . "' \">";
b) les deux prennent des anti-slash, mais tu dois bien faire attention à la délimitation. Le premier c'est value="", l'autre c'est onclick="". Dans le value tu as directement mis la valeur de ta variable (normal). Dans onclick="" tu mets d'abord une chaîne (la nom des champs à changer).
Tu as donc: $var = "onClick=\"date_id_jour.value=this.value; date_id_annee_mois.value='" . $var_am . "' \"";

Dans cette ligne:
Les " délimitent ta variable.
Les \" délimitent les propriétés html
Les ' délimitent le string en js

2) Les opérateurs -= et +=, tu connais certainement déjà les décrémenteur et incrémenteur de variable ++ et -- (généralement utiliser dans les for et while) ?
Et bien -= correspond à : (c'est comme pour --, ++, +=, *=, /=... tous les opérateurs devant =)
$var = 5;
$var -= 1; //$var = 4

//même chose que:
$var = 5;
$var = $var - 5;
3) <button> c'est une balises html, mais tu peux mettre du html dans un script il sera interprété comme du html. Mais sa fait pas très propre selon moi. C'est toi qui voit. Sa peut être pratique quand même si tu veux en effet n'afficher que cela dans le cas de js, mais on utilise les dom d'habitude je crois (je suis vraiment pas très doué en js)

Eléphant du PHP | 290 Messages

01 sept. 2014, 18:14

Merci beaucoup pour ces précisions.
Les explications sont parfaitement claires.
Je comprends beaucoup mieux maintenant :D

Bon, je te montre où j'en suis (j'ai écris les difficultés que je rencontre dans des doubles slashs à la fin de chaque ligne):

Dans l'en-tête de la page du formulaire de réservation.
[javascript]
<!-- code spécifique pour le programme ajax du calendrier partie 1/2 -->
<script src="precajax.js"></script>
<script src=""></script>
[/javascript]

Dans le corps de la page du formulaire de réservation.
<!-- code spécifique pour le programme ajax du calendrier partie 2/2 -->
<?php 
$periode; //représente une date au format AAAA-MM-JJ
function OpeMonth($periode,$operation) {
//Cette fonction marche pour les
//additions et soustractions de tout nombres
//ex: -140 mois, ou +5 mois

   $mois = getMonth($periode);
   $jour = getDay($periode);
   $annee = getYear($periode);

   if ($operation >= 12) {   //Ajout de mois de plus d'une année
      do {
         $annee++;
         $operation -= 12;
      } while ($operation >= 12);
   } elseif ($operation <= -12) {   //Retrait de mois de plus d'une année
      do {
         $annee--;
         $operation += 12;
      } while ($operation < 0);
   }

   if ($mois + $operation < 1) {   //Si l'opération totale passe à l'année précédente 
         $annee--;
         $operation += $mois;
         $mois = 12;
   } elseif ($mois + $operation > 12) {   //Si l'opération totale dépasse l'année
         $annee++;
         $operation += $mois - 12;
         $mois = 0;
   }

   $mois += $operation;   //On fait l'opération sur le mois

   return $annee . '-' . $mois . '-' . $jour;
}


$periodePrec = OpeMonth($periode,-1);
$periodeSuiv = OpeMonth($periode,+1);
?>
<button type="button" id="boutonprec" class="boutonprec" onclick="getAJAXmoisPrecedent(\'',$periodePrec,'\')" onFocus="this.style.borderColor='#33CCFF';" onBlur="this.style.borderColor='#000000';">mois précédent
</button>
<button type="button" id="boutonsuiv" class="boutonsuiv" onclick="getAJAXmoisSuivant(\'',$periodeSuiv,'\')" onFocus="this.style.borderColor='#33CCFF';" onBlur="this.style.borderColor='#000000';">mois suivant
</button>
<img src="boutonpp.jpg" alt="image bouton page précédente" style="position: absolute; top: 827px; left: 650px;" />
<img src="boutonps.jpg" alt="image bouton page suivante" style="position: absolute; top: 827px; left: 833px;" />
css afférent aux boutons dans la page de formulaire pour réservations:
.boutonprec {position: absolute; top: 827px; left: 650px; width: 180px; height: 30px; color: transparent; background-color: transparent; border-color: transparent; z-index: 1; }
.boutonsuiv {position: absolute; top: 827px; left: 833px; width: 180px; height: 30px; color: transparent; background-color: transparent; border-color: transparent; z-index: 1; }
Fichier precajax.js:
[javascript]
<script type="text/javascript">
function getXMLHttpRequest(){
var xmlHttpRequest = null; //l'éditeur m'indique qu'il y a une erreur sur cette ligne. Je me suis aidé du tuto sur ajax sur phpfrance (que je trouve par ailleurs génial :D ).
if(window.XMLHttpRequest) // Firefox et autres
xmlHttpRequest = new XMLHttpRequest();
else if(window.ActiveXObject){ // Internet Explorer
try {
xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
}
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
xmlHttpRequest = false;
}
return xmlHttpRequest
}

function (getAJAXmoisPrecedent(\'',$periodePrec,'\')) { //début de la fonction globale
var xmlHttpRequest = getXMLHttpRequest();
getXMLHttpRequest() = new XMLHttpRequest(); //je ne suis pas sûr que le fait de annoncer nouvel objet ici soit nécessaire
xmlHttpRequest.open ("POST", "add1month.php", true);
var periode = document.getElementById("boutonprec"); //récupération des données
periode = boutonprec.value; //je ne sais pas si il est nécessaire ici de ajouter un paramètre => .value
request.onreadystatechange = checkdate;
xmlHttpRequest.send("periode="+periode);

function checkdata(){
if(request.readyState==4){
//si la requête est terminée
if(request.status==200){
//et si la requête est un succès
alert(request.responseText); //je ne sais pas comment gérer ça (je sais que on parle du text accompagnant le code de status
}
}
}
} //fin de la fonction globale
} //fin de la fonction getAJAXmoisprecedent
</script>
[/javascript]

Fichier add1month.php:
<?php
if (isset($_POST['periode'])){
showCalendar($periode);
#showCalendar = innerHTML(request.responseText); Je ne comprends pas très bien ce qu'il faut faire avec innerHTML
}
?>
C'est par encore ça mais je comprends un peu mieux l'organisation d'ensemble.
Mais c'est clair que j'ai besoin de ton aide car c'est encore loin d'être ça!!

Aussi, deuxième chose, j'essaye de bien comprendre ton code
avec les opérateurs arithmétiques.
Tu peux me dire si mon analyse est bonne?
J'ai une incrémentation ou une décrémentation d'un mois 0 jusqu'à un mois 11 (0 et 11 inclus).
D'après les deux while je dois toujours rester sur un nombre entre 0 et 11 (0 et 11 inclus):
while ($operation >= 12);
while ($operation < 0);
Si ça dépasse d'une année en plus, on enlève 12 mois pour le compteur et on ajoute + 1 an en mémoire => $annee++;
Si ça dépasse d'une année en moins, on enlève 12 mois pour le compteur et on compte - 1 an en mémoire => $annee--;

Par exemple, aujourd'hui nous sommes le 1er septembre ça donnerait donc sachant que le compteur commence à 0: $operation >= 8
On ajoute 4 mois, on retourne au mois 0 sur le compteur et on compte +1 année en mémoire.

Mais pourquoi tu parles d'ajout de mois et de retrait de mois dans tes commentaires alors qu'il s'agit pourtant d'années, non? => $annee++; $annee--;

D'après moi $operation <= -12 pourrait être changé en $operation <= 0 mais je crois plutôt qu'il me manque quelques clefs de compréhension.
Tu peux me dire ce que je ne comprends pas? J'ai cherché un très long moment et j'ai vraiment du mal.
Mais ça m'intéresse vraiment de savoir et si tu m'expliques je pense que cette partie je la comprendrai très vite.

Eléphant du PHP | 113 Messages

01 sept. 2014, 19:33

1) Je te réexpliquerais l'ajax et de ce que l'on peut en faire (avec innerHTML) dans un deuxième post (un ptit tuto bref mais que tu pourras réutiliser pour tous les cas 8-) )

2) Ma fonction, comme je t'ai dis en fait les deux lignes suffisent (beaucoup plus court ;) ):
$periodePrec = date("Y-m-d",mktime(0,0,0,getMonth($periode)-1,1,getYear($periode)));

$periodeSuiv = date("Y-m-d",mktime(0,0,0,getMonth($periode)+1,1,getYear($periode)));
Pour la compréhension de l'algorithme:

$operation est du type de -1, 1, bref c'est le nombre de mois que tu veux rajouter ou enlever

while ($operation >= 12) => tant que le nombre de mois que tu veux rajouter est supérieur à 12mois, on rajoute une année et on en enlève 12 à operation alors. (12inclus >= veut dire supérieur ou égale à)

while ($operation <= -12) => operation identique à avant sauf qu'on enlève une année et on rajoute 12mois. (-12inclus <= veut dire inférieur ou égale à)

Donc pour toute valeur de $operation de cette liste (-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11) , il n'entrera jamais dans ces deux boucles. (car inférieur à 12 mois absolu)

Maintenant imaginons nous sommes en Septembre, c'est le 09. On veut rajouter 5mois, c'est inférieur à 12mois absolu, mais quand on fait 9 + 5 c'est supérieur à 12, donc on engage une nouvelle année d'où elseif ($mois + $operation > 12)
, et inversement si on faisait 9 -11 sa deviendrait négatif, d'où if ($mois + $operation < 1)
if ($mois + $operation < 1) {   //Si l'opération totale passe à l'année précédente 
         $annee--; 
         $operation += $mois; //**1
         $mois = 12; //
   } elseif ($mois + $operation > 12) {   //Si l'opération totale dépasse l'année
         $annee++;
         $operation += $mois - 12; //**2
         $mois = 0;
   }
**1 : ex: nous somme le mois 9. On souhaite retirer 11 mois ! Si on faisait l’opération tel qu'elle on obtiendrait -2 ! -2 mois de cette année. On décrémente une année, on enregistre le -2 dans $operation et on place la valeur de $mois à 12 (puisqu'on décrémente des mois, on se place au mois max de l'année précédente). Avec la dernière ligne de la fonction on obtient 12-2 => 10 ! 2014-09-01 - 11mois vaut bien 2013-10-01 !

**2 : même résonnement que précédemment sauf dans l'autre sens, on dépasse l'année !

3)

Eléphant du PHP | 113 Messages

02 sept. 2014, 14:12

En ajax il te faut une variable xmlHttpRequest que tu as (je l’appellerais xhr, plus court ^^). Le mieux c'est de l'initialiser à false (tu l'as mise à null).

ce qui revient à crée un fonction (imagine que tu utilises jax plusieurs fois sur ta page):

[javascript]
function Ajax()
{
var request = false; //Initialisation

try { request = new ActiveXObject('Msxml2.XMLHTTP'); }
catch (err2) {
try { request = new ActiveXObject('Microsoft.XMLHTTP'); } //IE
catch (err3) {
try { request = new XMLHttpRequest(); } //Tout explorer
catch (err1) { request = false; }
}
}

return request;
}
[/javascript]

Une fois que tu as ta variable xhr tu vas pouvoir écrire ta requête ajax;

Sa se décompose en trois 4 codes:

[javascript]
var xhr = Ajax();

xhr.open("POST", "tonfichiercible.php", true); //Sa peut être GET aussi
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(); // Ici tu peux faire passer des variables vers ta cible

xhr.onreadystatechange; // c'est cette partie qui vas nous intéresser !
[/javascript]

onreadystatechange : C'est dans cette partie que tu vas dire à ton code ce qu'il va se passer avec la réponse de ton fichier cible !

[javascript]
xhr.onreadystatechange = function() {
if ((xhr.readyState == 4) && (xhr.status == 200)) {
//Ici ton traitement, tu récupères la réponse avec xhr.responseText
//Si ton script php affiche ton calendrier dans un format html tu peux
//directement l'afficher dans ta div prévu pour avec innerHTML; ex:
//document.getElementById('output').innerHTML = xhr.responseText;
} else {
//alert("Error code " + xhr.status); //Affichage du code d'erreur, mais pas utile si tu ne débogue pas
// Tu peux ici afficher un gif de chargement sur ta page ex:
// document.getElementById('chargement').innerHTML = 'Chargement des données en cours... <img src="ajax-loader.gif" alt="Chargement..."></img>';
}
};
[/javascript]

Maintenant pour en revenir sur ton script, puisque qu'on calcul la période prec et suiv au chargement de la page en php tu n'as pas besoin de faire deux fonctions js pour getAJAXmoisSuivant() et getAJAXmoisPrecedent() ! Il te suffit d'une fonction getAJAXmois() avec en paramètre la période; On a :
$periodePrec = date("Y-m-d",mktime(0,0,0,getMonth($periode)-1,1,getYear($periode)));

$periodeSuiv = date("Y-m-d",mktime(0,0,0,getMonth($periode)+1,1,getYear($periode)));

echo '<button type="button" id="boutonprec" class="boutonprec" onclick="getAJAXmois(\'',$periodePrec,'\')" onFocus="this.style.borderColor='#33CCFF';"         onBlur="this.style.borderColor='#000000';">mois précédent</button>
<button type="button" class="boutonsuiv" onclick="getAJAXmois(\'',$periodeSuiv,'\')">mois suivant</button>';
Ta fonction getAJAXmois inclura simplement le code ajax vu au début, tu récupéreras le paramètre periode que tu passeras dans le xhr.send("periode=" + periode) !

Maintenant ton script php cible: tu le nommes comme tu veux, dans ce fichier il y aura uniquement les fonctions pour afficher ton calendrier (showCalendar et les getMMonth...). A la fin de ton script php tu auras juste ces lignes:
if (!empty($_POST['periode'])) {
   showCalendar(htmlentities($_POST['periode']));
}
Maintenant pour bien être sûr d'avoir compris, il faut que tu t'imagines cliquer sur le bouton mois suivant ou précédent. Ce bouton va aller sur ta page php grâce à ajax, c'est comme si tu te rendais toi même sur ccette page et que tu faisais passer des variables en POST, tu verrais alors ton calendrier s'afficher. Avec le xhr.responseText c'est comme si tu copiait cette page dans ta page avec le formulaire, dans l'endroit réserver (document.getElementById('output').innerHTML = xhr.responseText;)

EN espérant avoir été un peu clair ^^'

Eléphant du PHP | 290 Messages

03 sept. 2014, 16:13

Merci pour les explications concernant ton code sur les incrémentations et décrémentations :D
C'est assez complexe mais je comprends mieux maintenant.

Mais oui, je vais prendre le code le plus simple:
$periodePrec = date("Y-m-d",mktime(0,0,0,getMonth($periode)-1,1,getYear($periode)));
$periodeSuiv = date("Y-m-d",mktime(0,0,0,getMonth($periode)+1,1,getYear($periode)));
echo '<button type="button" id="boutonprec" class="boutonprec" onclick="getAJAXmois(\'',$periodePrec,'\')" onFocus="this.style.borderColor=\'#33CCFF\';"         onBlur="this.style.borderColor=\'#000000\';">mois précédent</button>
<button type="button" class="boutonsuiv" onclick="getAJAXmois(\'',$periodeSuiv,'\')" onFocus="this.style.borderColor=\'#33CCFF\';"         onBlur="this.style.borderColor=\'#000000\';">mois suivant</button>';
Voilà le code php que ça donne dans ma page du formulaire de réservation.
Malheureusement, ça bloque aux deux premières lignes :(
Undefined variable: periode in "nom de ma page sur mon site"
La variable $periode semble ne pas interpeller le serveur.
Tu sais pas s'il faut à propos de cette variable que j'y apporte des précisions et quoi?

Eléphant du PHP | 290 Messages

03 sept. 2014, 18:34

J'ai relu plusieurs fois tes explications qui m'aident, mais j'ai encore des difficultés.

D'abord, concernant la compréhension du programme:
Si je comprends bien dans ma page de réservations j'ai deux boutons avec chacun un Id,
=> mais ces deux Id sont réunis dans une même fonction getAJAXmois()
Par l'intermédiaire des Id, la page de réservations va faire passer l'information que l'utilisateur
a appuyé sur un des deux boutons, et cette information arrive dans le fichier javascript.

Le fichier javascript récupère l'information et l'envoie au fichier php qui va générer un
nouveau calendrier mensuel basé sur cette information.

Le fichier php lu, on reprend la lecture du fichier javascript permettant
de remplacer l'affichage du calendrier par défaut par celui du nouveau calendrier.
document.getElementById('output').innerHTML = xhr.responseText;
On remplace (innerHTML) l'affichage (output) normal par celui du nouveau calendrier généré (xhr.responseText)

On obtient ainsi affiché notre nouveau calendrier généré sans rechargement de la page.

Voilà en gros la compréhension que j'ai de ce que je fais.

1) Est-ce que ma compréhension est bonne?

2) Je te montre où j'en suis:

Page de réservations:
En-tête:
<script src="calendar_ajax.js"></script>
Corps:
echo '<button type="button" id="boutonprec" class="boutonprec" onclick="getAJAXmois(\'',$periodePrec,'\')" onFocus="this.style.borderColor=\'#33CCFF\';" onBlur="this.style.borderColor=\'#000000\';">mois précédent</button>
<button type="button" id="boutonsuiv" class="boutonsuiv" onclick="getAJAXmois(\'',$periodeSuiv,'\')" onFocus="this.style.borderColor=\'#33CCFF\';" onBlur="this.style.borderColor=\'#000000\';">mois suivant</button>';
Je crois que tu veux que je rajoute ici ces deux lignes:
$periodePrec = date("Y-m-d",mktime(0,0,0,getMonth($periode)-1,1,getYear($periode)));
$periodeSuiv = date("Y-m-d",mktime(0,0,0,getMonth($periode)+1,1,getYear($periode)));
Mais ça pose problème: on me dis que la variable $periode n'est pas définie (voir mon message précédent.

Page javascript:
[javascript]
function Ajax() // Fonction pour s'adapter à Internet Explorer
{
var request = false; //Initialisation

try { request = new ActiveXObject('Msxml2.XMLHTTP'); }
catch (err2) {
try { request = new ActiveXObject('Microsoft.XMLHTTP'); } //IE
catch (err3) {
try { request = new XMLHttpRequest(); } //Tout explorer
catch (err1) { request = false; }
}
}

return request;
}

var xhr = Ajax(); //Fonction pour envoyer requête ajax

var boutonprec = document.getElementById(getAJAXmois('periodePrec'));
var boutonsuiv = document.getElementById(getAJAXmois('periodeSuiv'));
xhr.open("POST", "change_month.php", true); //Ca peut être GET aussi
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var periode = boutonprec;
var periode = boutonsuiv;
xhr.send("periode=" + periode); // Ici tu peux faire passer des variables vers ta cible

xhr.onreadystatechange; // c'est cette partie qui vas nous intéresser !

xhr.onreadystatechange = function() { //Fonction pour permettre l'affichage du nouveau calendrier initialisé
if ((xhr.readyState == 4) && (xhr.status == 200)) {
document.getElementById('output').innerHTML = xhr.responseText;
//Ici ton traitement, tu récupères la réponse avec xhr.responseText
//Si ton script php affiche ton calendrier dans un format html tu peux
//directement l'afficher dans ta div prévu pour avec innerHTML; ex:
//document.getElementById('output').innerHTML = xhr.responseText;
} else {

alert("Error - ") + request.status + ":" + request.statusText;
}
};
[/javascript]

Page php:
<?php
$periodePrec = date("Y-m-d",mktime(0,0,0,getMonth($periode)-1,1,getYear($periode)));
$periodeSuiv = date("Y-m-d",mktime(0,0,0,getMonth($periode)+1,1,getYear($periode)));
if (isset($_POST['periode'])){
showCalendar(htmlentities($_POST['periode']));
}
?>
Je reconnais avoir une difficulté à bien dissocier le code php que je mets dans ma page de réservations
et celui que je mets dans cette page-là.

3) Je viens d'identifier un problème embêtant dans mon calendrier.
J'ai voulu attendre un peu pour être sûr que le problème est bien là.
Les jours du calendrier sont écris sur des lignes de sept jours.
Par exemple pour septembre, sur la première ligne j'ai 1, 2, 3, 4, 5, 6, 7,
sur la deuxième j'ai 8, 9, 10, 11, 12, 13, 14,
etc...
Je dois normalement pouvoir en tant qu'utilisateur choisir n'importe
lequel des jours du mois sauf le jour d'aujourd'hui.
Il se trouve que je ne peux pas choisir un des jours se trouvant sur la deuxième
ligne du mois (ce mois-ci par exemple, pas possible de réserver pour le 8, le 9, le 10, le 11,
le 12, le 13 ou le 14 septembre).
J'ai se problème quelque soit le mois courant.
Je ne sais pas trop d'où ça vient.
Je pense que ça doit venir de:
          else                                                   { //accolade d'ouverture 4 else
                # 1 est toujours vrai => on affiche 
                # un lien à chaque fois
                # A vous de faire les tests 
                # nécessaire si vous gérer un agenda par exemple
                if (1)                                                { //accolade d'ouverture 5
                    $class = " class=\"itemExistingItem\"";
                    $var_j = Date("d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));
					$var_am = Date("Y-m", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))); #code rajouté pour avoir l'année et le mois courants					
                    $afficheJour = "<input type=\"button\" name=\"datejour\" value=\"" . $var_j . "\" onClick=\"date_id_jour.value=this.value; date_id_annee_mois.value='" . $var_am . "' \">";

                                                                      } //accolade de fermeture 5
                     else                                             { //accolade d'ouverture 5 else
                          $class = "";
                                                                      } //accolade de fermeture 5 else
                                                                 } //accolade de fermeture 4 else
       

Mais je ne vois pas pourquoi et où exactement ça cloche.

4) Enfin, pour parler du dernier problème que j'ai à propos du calendrier,
sur ma page de traitement du formulaire de réservation j'ai ce code qui n'est pas pris en compte:
#vérification du remplissage des champs.
if (!isset($variable1) && !isset($variable2) && !isset($variable3) && !isset($variable4) && !isset($variable5) && !isset($variable6) && !isset($variable7) && !isset($variable8) && !isset($variable9)){
} else {
echo '<body onLoad="alert(\'Seul le dernier champs est facultatif. Veuillez remplir tous les autres champs.\')">'; 
echo '<meta http-equiv="refresh" content="0;URL=reservations.php">';
}
C'est à dire que même avec des champs vide la nouvelle ligne rentre dans la table.

Par contre, exactement le même code dans la page de traitement des identifiants (nom d'utilisateur et mot de passe )
le code marche à la perfection:
#vérification du remplissage des champs.
if (!isset($identifiant1) && !isset($identifiant2) && !isset($identifiant3)){
} else {
echo '<body onLoad="alert(\'Veuillez saisir les trois champs.\')">';
echo '<meta http-equiv="refresh" content="0;URL=identification.php">';
}
[/php]
Ca ne vient à priori pas du code puisque c'est EXACTEMENT le même.
Sur la page de traitement des identifiants je ne suis pas encore sur ma session alors
que sur celle du traitement du formulaire de réservations si.
Est-ce que ça viendrait de là?

Désolé encore pour toutes ces questions.
Malheureusement, c'est encore un peu la galère
et je bloques vraiment sur ces points.

Petit nouveau ! | 1 Messages

04 sept. 2014, 06:25

Merci pour tout.....

Mammouth du PHP | 2278 Messages

04 sept. 2014, 08:17

Intervention après la bagarre:
1) Si l'id est unique, pourquoi le mettre en BDD? autant le mettre en dur dans les requ^etes.
2) Il n'y a aucune raison de réinsérer un id utilisateur dans une table qui a été seulementconsultée.
.3)
$a = a + 12; éest identique à $a += 12;
idem avec -, * / (Division)
4)
$a .= "ceci";
$b = " est";
$a = $a.b$ ; identique à a.= $b ; (ceci est)
5) on peut écrire
a$ = "<input type = 'text' value = 'moisson' />"; ce qui dispense des antislashes (si on a un appel de fonction javasscruipt passant du texte, il en faut à cet endroit seulement)
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 | 113 Messages

04 sept. 2014, 10:09

Intervention après la bagarre:
1) Si l'id est unique, pourquoi le mettre en BDD? autant le mettre en dur dans les requ^etes.
2) Il n'y a aucune raison de réinsérer un id utilisateur dans une table qui a été seulementconsultée.
.3)
$a = a + 12; éest identique à $a += 12;
idem avec -, * / (Division)
4)
$a .= "ceci";
$b = " est";
$a = $a.b$ ; identique à a.= $b ; (ceci est)
5) on peut écrire
a$ = "<input type = 'text' value = 'moisson' />"; ce qui dispense des antislashes (si on a un appel de fonction javasscruipt passant du texte, il en faut à cet endroit seulement)
1) De quel id tu parles ?

2) Il y a une table réservation et table user, tu en a besoins dans les deux tables comme clés externe ... (attribution d'une réservation à un client)

3)4) Je pense qu'il a compris maintenant ^^

5) Sur le forum on distingue mal le simple ' du double " et du double simple '', d'où les antislahs ;)

Eléphant du PHP | 113 Messages

04 sept. 2014, 10:18

$periode, c'est une variable que tu dois initialiser avec la valeur de la periode courante du calendrier. En gros tu as ça au début de ta page du form:
$periode = date("Y-m-d");
//affichage par défaut
showCalendar($periode);
:oops: Tout comme moi tu auras compris l'énorme bêtise... L'ajax marcherait une fois, pas deux fois puisque la valeur des periodes serait la même ^^' En gros faut changer de tactiques ( :oops: pardon ). Il faut que tu récupères la valeur courante du calendrier d'un champ hidden (qui se trouverait dans le div du calendrier), que tu l'envoie à ton script php avec un paramètre en plus (+1 ou -1 qui correspond au mois à rajouter ou enlever), puis ce script calculeras la nouvelle periode, et ton script php rajouteras avec ton calendrier un champ hidden avec la nouvelle valeur courante...

Je reposterai plus tard (en plus clair ^^ avec une ptit aide pour t'aider, je suis pris par le temps :/)