[RESOLU] Faire un calendrier.

Eléphant du PHP | 290 Messages

21 août 2014, 15:37

Merci tout d'abord pour ta réponse détaillée à toutes mes questions.

Ca s'éclaircit vachement pour moi pour tout ce qui touche aux conceptions de base de données.
J'ai enfin compris des choses que je n'avais jamais assimilé!!
Là je suis vraiment content :D :D :D

Je pense effectivement qu'il me faut réfléchir à nouveau sur ma conception générale
de l'organisation de mon SGBDR.

Il y a la question 2 où je bloque encore :(
Je crois que je n'ai pas été très clair et qu'il y a vraiment un truc que je n'arrive pas à comprendre.
Ce que je ne comprends pas, c'est cette partie:
L'utilisateur peut, une fois inscrit se connecter sur le site. Quand il se connecte, on vérifie que son pseudo existe dans la table utilisateur, s'il existe on vérifie qu'il a le bon mot de passe qui lui correspond. On sélectionne alors son identifiant que l'on stock en $_SESSION par exemple.
SELECT id_user FROM user WHERE pseudo=$pseudo AND mdp=$mdp
Pour redire clairement les choses, j'ai un utilisateur qui se trouve devant une première page de formulaire où il est invité à
rentrer son nom d'utilisateur et son mot de passe. Chose faite, il clique sur envoyer.

Moi, je veux récupérer son id_user pour créer/déclarer une variable $_SESSION['id_user']
dont la présence sera vérifiée sur toutes les pages de ma session à accès réservé.
Si la variable est absente, l'utilisateur est reconduit en dehors de la session avec un header.

Il est donc nécessaire que cette variable soit présente pour que l'utilisateur puisse naviguer sur la session à accès réservé.
Pour reprendre tes mots ci-dessus, il faut que je sélectionne son identifiant.
Parmi toutes mes variables id_user qui sont dans ma base de données, il va falloir
que je sélectionne CELLE qui correspond au nom d'utilisateur et au mot de passe de l'utilisateur.
Pour sélectionner la bonne variable parmi toutes les variables du champs id_user dans la base de données,
il faut que je sache qu'elle est la bonne variable parmi toutes les variables du champs id_user dans la base de données.
Désolé pour la redondance mais tu suis :)
Parce-que si je ne sais pas laquelle est-ce, je ne peux pas la choisir.
Il me faut donc pouvoir identifier à quel couple nom d'utilisateur / mot de passe correspond
l'utilisateur qui se trouve derrière son écran et dont je ne vois pas le visage.
C'est ça que je veux faire et que je n'arrive pas à faire car je ne comprends comment il faut que je m'y prenne
pour en arriver là #-o
Pour en arriver là, je comprends d'après ton code SQL là où tu veux en venir:
SELECT id_user FROM user WHERE pseudo=$pseudo AND mdp=$mdp
Tu te dis il faut que je rapproche les données saisies par l'utilisateur au premier formulaire et les comparer
avec l'id_user qui correspond à ces données dans la colonne id_user de la base de données.
A partir de là je peux récupérer le bon id_user car j'ai pu l' identifier grâce à la saisie de l'utilisateur.
Cela signifie que tant que l'utilisateur ne saisit pas de données, et plus précisément tant qu'il
n'appuie pas sur envoi après avoir saisi ses données, aucun rapprochement ne peut être fait.
J'en déduis donc que la partie de code
SELECT id_user FROM user WHERE pseudo=$pseudo AND mdp=$mdp
a du sens seulement une fois que l'utilisateur a appuyé sur envoi.
Du coup, j'en déduis que cette partie de code ne peut pas se trouver sur la page du premier formulaire mais
sur une autre page qui suit la page du premier formulaire.
Je pense alors en premier lieu à la page de traitement du premier formulaire.
Et j'identifie le bon id_user en regardant dans la base de données quels
nom d'utilisateur et mot de passe correspondent respectivement à quel
nom d'utilisateur et mot de passe déjà saisis dans le premier formulaire.
Mon bon id_user est donc celui qui se trouve sur la même ligne que les
nom d'utilisateur et mot de passe dans ma base de données.
A mon sens je devrais donc avoir dans ma comparaison des
variables $_POST['nom_utilisateur'] et $_POST['mot_de_passe']
Si la syntaxe de SQL n'accepte pas ce type d'écriture, je dois donc
sûrement déclarer en premier lieu:
$nom_utilisateur=$_POST['nom_utilisateur']
$mot_de_passe=$_POST['mot_de_passe']
pour ensuite écrire en SQL mes variables
$nom_utilisateur et $mot_de_passe
faisant respectivement référence à $_POST['nom_utilisateur'] et $_POST['mot_de_passe']
L'identifiant, alors sélectionné, je dois le stocker en $_SESSION.
J'écris donc là où je déclare déjà (tjs dans la page de traitement de formulaire):
$_SESSION['nom_utilisateur'] = $utilisateur;
$_SESSION['mot_de_passe'] = $mot_de_passe;
cette ligne en plus:
$_SESSION['id_user'] = $id_user;
C'est comme ça que je conçois vaguement les choses
mais je ne comprends pas très bien tout ça.
Je ne sais pas si tu peux m'expliquer un peu plus précisément comment trouver le bon id_user,
comment le sélectionner et comment le stocker en $_SESSION?
A propos de ton code:
SELECT id_user FROM user WHERE pseudo=$pseudo AND mdp=$mdp
j'ai deux petites questions sur le signe $:
pourquoi pseudo et mdp n'ont pas le signe $?
pourquoi $pseudo et $mdp ont le signe $?
D'après mon apprentissage, toute donnée se trouvant dans une base de donnée qu'on ressort dans une page de code prend le signe $.
Toute variable en général prend le signe $.
Toute donnée faisant référence à une variable dans une base de donnée qu'on écrit en SQL mais qu'on ne sort pas de la base de données
pour la mettre dans du code ne prend pas de $.
Mais c'est en fait assez flou pour moi.
Je ne sais pas si tu peuxx m'éclairer aussi un peu là-dessus? :o
Aussi, à propos de la ligne $_SESSION['id_user'] = $id_user; il faut bien le $ devant id_user?
je n'écris pas $_SESSION['id_user'] = id_user; ?

Eléphant du PHP | 113 Messages

21 août 2014, 17:13

Pour utiliser les variables session il faut que tu es lancé une session, voir session_start() => documente toi sur comment faire une bonne session

j'ai mis des $ devant pour expliquer que c'était tes variables php que tu devais récup pour ta requête

Pour récupéré ton id_user, imaginons que le formulaire est validé (simplifié) :
if (!empty($_POST['peusdo']) && !empty($_POST['mdp'])) {
   $requete = "SELECT id_user FROM user 
                     WHERE pseudo='".mysqli_real_escape_string($bdd,htmlentities($_POST['pseudo']))."'
                     AND mdp='".md5(mysqli_real_escape_string($bdd,htmlentities($_POST['mdp'])))."'";
   // md5 est une fonction de hashage, il faut donc que tu mettes la fonction que tu as utiliser pour hasher 
   // ton mdp lors de l'inscription (c'est une question de sécurité, le mot de passe ne doit pas être en clair !)
   $resultat = mysqli($bdd,$requete);
   $date = mysqli_fetch_array($resultat);
   mysqli_free_result($resultat);

   // si data == 1 alors il y a un résultat (count(*) = le nombre de ligne retournés par la requête ici)
   if ($data[0] == 1) {
      session_start();
      $_SESSION['id_user'] = $data[1];   // correspond deuxième colonne du résultat de la requete, sois id_user
      $_SESSION['pseudo'] = htmlentities($_POST['pseudo']);
   } else {
      echo "Erreur d'identifiants !";
      // tu renvoie vers le formulaire si celui renvoie vers cette page
      // tu peux aussi simplement faire renvoyer le formulaire sur la même page
      // avec action="#"
   }

}
si tu as du mal avec les sessions http://fr2.php.net/manual/fr/reserved.v ... ession.php

Les variables en php:

$var; // variable
DEFINE("var","mavaleur"); // constante que tu utilises sans le "$"
http://www.lephpfacile.com/cours/19-les ... s-globales // variables globales
Modifié en dernier par toytoy le 21 août 2014, 18:58, modifié 2 fois.

Eléphant du PHP | 290 Messages

21 août 2014, 18:09

Réussi :D
Mais le problème venait d'ailleurs!
Et je dois dire en avoir assez baver!
Dans ma page de traitement de formulaire, j'étais déjà à l'intérieur d'une condition if qui dit
que le nom d'utilisateur et le mot de passe sont égaux à ceux qu'il y a dans la base de donnée.
J'ajoute donc la capture du bon id_user presque juste avant d'entrer dans la session.
Il fallait que j'enlève la partie qui commence par "WHERE..." puisque cet écrémage était
déjà fait par le if précédent (tu suis?) et du coup "en faisant faire le même écrémage" l'éxecution de la
requête devenait impossible (pour reprendre cette phrase que je commence à connaître par cœur).
En effaçant la partie superflue à partir de "WHERE..." tout se règle.
Je commençait à desespérer, ça aura été dur!! :mrgreen:

Une nouvelle étape est franchie, j'ai mon $_SESSION['id_USER'] qui fonctionne sur toutes mes pages de ma session... :D
Il faut que je continue...

Eléphant du PHP | 113 Messages

21 août 2014, 19:00

Fais voir ton code php pour la connexion et l'affectation de tes variables session ?

Eléphant du PHP | 290 Messages

22 août 2014, 08:55

#teste si le nom d'utilisateur et le mot de passe envoyés correspondent à un de ceux dans la bdd
if ($nom_utilisateur_envoye == $nom_utilisateur_bdd && $mot_de_passe_envoye == $mot_de_passe_bdd){ 	

#test si réponse au CAPCHA est bonne
/*
Ici j'ai mis si réponse pas bonne utilisateur redirigé vers sortie de session avec un message javascript
informant que la réponse au CAPTCHA est erronée
*/
} else {
include("amis_enfance.php"); #informations de connexion bdd
$connexion=mysqli_connect($hote,$utilisateur,$motPasse) or die ("Connexion au serveur impossible.");
$nombase=mysqli_select_db($connexion,$nombase) or die ("Sélection de la base impossible.");
$req="SELECT id_user FROM identification";
$query=mysqli_query($connexion,$req) or die ("Exécution de la requête impossible.");
$chart = mysqli_fetch_assoc($query);
extract($chart);

$_SESSION['id_user'] = $id_user;
$_SESSION['nom_utilisateur'] = $nom_utilisateur_envoye;
$_SESSION[mot_de_passe'] = $mot_de_passe_envoye;	
header("Location: http://localhost/mon_site/premiere_page_session_acces_reserve.php");

Eléphant du PHP | 113 Messages

22 août 2014, 11:27

c'est bien ce que je me disais, tu n'as pas compris exactement les requête SQL...

"SELECT id_user FROM identification" va te retourner la liste de tous les id_user de ta table identification !

Pour sélectionner l'id_user correspondant à ton utilisateur (avec le couple pseudo/mdp) il te faut une condition ex:, WHERE pseudo='patati' AND mdp='patata'
Cette condition te retournera l'id_user, de la ligne de ta table qui correspond en champ pseudo la valeur 'patati' et en champ mdp la valeur 'patata'

$_SESSION['mot_de_passe'] = $mot_de_passe_envoye; Pourquoi ? Explique moi pourquoi tu veux le garder en session, c'est risqué et inutile, si tu as son id, c'est que son mdp était forcément bon. Donc pas la pein de le réutiliser par la suite, à moins de le redemander à l'utilisateur.

Eléphant du PHP | 290 Messages

22 août 2014, 12:18

La variable S_SESSION['mot_de_passe'] doit disparaître de la session.
Je pensais juste m'occuper de ça à la fin, car tout ce qui est sécurité je m'en occupe
en dernier dans ma programmation. J'avais donc bien prévu de le faire :D

Je comprends:
"SELECT id_user FROM identification" va te retourner la liste de tous les id_user de ta table identification !
Maintenant si j'ajoute une condition WHERE dans mon code SQL:
#teste si le nom d'utilisateur et le mot de passe envoyés correspondent à un de ceux dans la bdd
if ($nom_utilisateur_envoye == $nom_utilisateur_bdd && $mot_de_passe_envoye == $mot_de_passe_bdd){      

#test si réponse au CAPCHA est bonne
/*
Ici j'ai mis si réponse pas bonne utilisateur redirigé vers sortie de session avec un message javascript
informant que la réponse au CAPTCHA est erronée
*/
} else {
include("amis_enfance.php"); #informations de connexion bdd
$connexion=mysqli_connect($hote,$utilisateur,$motPasse) or die ("Connexion au serveur impossible.");
$nombase=mysqli_select_db($connexion,$nombase) or die ("Sélection de la base impossible.");
$req="SELECT id_user FROM identification WHERE nom_utilisateur_envoye=$nom_utilisateur_bdd AND mot_de_passe_envoye=$mot_de_passe_bdd";
$query=mysqli_query($connexion,$req) or die ("Exécution de la requête impossible.");
$chart = mysqli_fetch_assoc($query);
extract($chart);

$_SESSION['id_user'] = $id_user;
$_SESSION['nom_utilisateur'] = $nom_utilisateur_envoye;
$_SESSION['mot_de_passe'] = $mot_de_passe_envoye;        
header("Location: http://localhost/mon_site/premiere_page ... eserve.php");
Le navigateur m'envoit "Exécution de la requête impossible."
J'ai un problème avec ma condition WHERE car sans elle j'arrive à rentrer dans la session.
Je ne sais pas ce qui ne va pas avec mon WHERE.

Eléphant du PHP | 290 Messages

22 août 2014, 12:36

Je voulais dire:
$req="SELECT id_user FROM identification WHERE nom_utilisateur_bdd=$nom_utilisateur_envoye AND mot_de_passe_bdd=$mot_de_passe_envoye";

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

22 août 2014, 12:44

salut,

- on ne passe le mot de passe dans la requête sql tu récupère ce qu'il y a en base et tu compare avec php
- extract c'est le mal (surtout si tu utilise register_globals = on).
- tu ne test pas si la requête retourne un résultat et la du coup quand le couple utilisateur / mdp n'existe pas en base ton code derrière se vautre ;)

En SQL une chaine de caractère est délimitée par des ' or je ne pense pas que tes variables les contiennent du coup la requête ne s'execute pas.

Affiche la variable $req et test la requête dans un client SQL.

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

Eléphant du PHP | 290 Messages

22 août 2014, 13:10

J'ai mis quatre ' et tout s'est réglé.
Merci :D
Mais il y a quand même des choses que je ne comprends pas:
$req="SELECT id_user FROM identification WHERE nom_utilisateur_bdd='$nom_utilisateur_envoye' AND mot_de_passe_bdd='$mot_de_passe_envoye'";
Ca maintenant ça marche.
Mais pourquoi l'apostrophe est-elle facultative pour le premier terme (devant le signe égal) et obligatoire pour le deuxième (derrière le signe égal)?
Pourquoi le premier terme (devant le signe égal) ne peut pas être précédé d'un $ alors qu'il s'agit d'une variable?
J'ai enlevé:
$chart = mysqli_fetch_assoc($query);
extract($chart);
Ca ne me sert à rien.

Bien plus haut dans mon code j'ai un autre extract mais je le garde car j'en ai besoin.
Je ne sais pas pourquoi c'est le mal: il permet à mon programme de fonctionner.

Eléphant du PHP | 290 Messages

22 août 2014, 14:20

J'arrive maintenant à envoyer un formulaire et à récupérer les données utilisateur dans ma base de données. :D

J'ai encore un problème avec mon javascript.

1)Problème javascript.
Le code javascript suivant ne fonctionne pas:
          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 = Date("d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));
                    $afficheJour = "<input type=\"button\" name=\"datejour\" value=\"" . $var . "\" onClick=\"date_id.value=this.value;\" onClick=\"this.style.backgroundColor=\'#3300FF\';\" onBlur=\"this.style.backgroundColor=\'#99FF66\';\" onFocus=\"this.style.backgroundColor=\'#3300FF\';\"; onmouseOver=\"this.style.backgroundColor=\'#99FF66\';\" onmouseOut=\"this.style.backgroundColor=\'#3300FF\';\"}/\>";
                                                                      } //accolade de fermeture 5
J'ai mis <noscript>Activez javascript pour que le script fonctionne</noscript> comme tu m'as dis.
Rien n'apparaît à l'écran. Ca veut donc dire que javascript doit marcher?
J'ai mis cette portion de code entre mon premier et mon deuxième programme php.
Donc pas entre des balises <?php ... ?>
Pour info j'ai sur la même page de réservations du code javascript pour les boutons envoyer, recommencer,...
(événements onmouseOut, onmouseOver,...) et ça marche.
Autre info, dans le programme de traitement du formulaire de réservations j'ai une boîte modale en javascript
qui ne fonctionne pas. Je suis obligé de contourner le javascript.
Il semblerait, à priori, que c'est dans la page de traitement de formulaire que javascript ne fonctionne pas.
Pourquoi ce language a-t'il besoin d'être activé (je n'ai pas besoin d'activer du html) et comment l'activer si besoin?

2)
a)Problème php/sql.
Quand j'envoie un formulaire pour une réservation, je peux aller voir les données rentrées dans phpmyadmin.
Dans le champs date j'ai toujours 0000-00-00 00:00:00 quoi que j'écrive dans le champs du formulaire en tant
qu'utilisateur (même si je n'écris rien) :(

b) J'ai refait ma requête avec WHERE en suivant les indications de Moogli.
Par contre, id_user qui est la clef de ma première table avec le paramètre AUTO_INCREMENT
a pour le premier utilisateur le numéro 1 mais lorsque ma table pour les réservations récupère
l'id_user il a le numéro 0.
Y aurait-il un problème de lecture dans la table?

MES PROGRAMMES PHP EN ENTIER:

Premier programme php:
<?php # fonctions utiles, $valeur 
 # représente une date au format AAAA-MM-JJ
 function getSecond($valeur) {
 return substr($valeur, 17, 2);
   }

   function getMinute($valeur) {
       return substr($valeur, 14, 2);
   }

  function getHour($valeur) {

      return substr($valeur, 11, 2);
  }

  function getDay($valeur)     {
     return substr($valeur, 8, 2);
  }

  function getMonth($valeur)     {
     return substr($valeur, 5, 2);
  }

  function getYear($valeur) {
     return substr($valeur, 0, 4);
 }

  function monthNumToName($mois) {
    $tableau = Array("", "Janvier", "Février", 
    "Mars", "Avril", "Mai", "Juin", "Juillet", 
    "Aôut", "Septembre", "Octobre", "Novembre", "Décembre");

    return (intval($mois) > 0 && intval($mois) 
    < 13) ? $tableau[intval($mois)] : "Indéfini";
}
?>
Deuxième programme php:
<?php
# Fonction pour afficher le calendrier
 function showCalendar($periode) { //accolade d'ouverture 1
    $leCalendrier = "";
    # Tableau des valeurs possibles pour un numéro 
    # de jour dans la semaine
    $tableau = Array("0", "1", "2", "3", "4", "5", "6", "0");

    $nb_jour = Date("t", mktime(0, 0, 0, getMonth($periode), 
    1, getYear($periode)));
    $pas = 0;
    $indexe = 1;

    # Affichage du mois et de l'année
    $leCalendrier .= "<h2>" . monthNumToName
    (getMonth($periode)) . " " . getYear($periode) . "</h2>";

    # Affichage des entêtes
    $leCalendrier .= "
    <ul id=\"libelle\">
        \t<li>&nbsp;L</li>
        \t<li>&nbsp;M</li>
        \t<li>&nbsp;M</li>
        \t<li>&nbsp;J</li>
        \t<li>&nbsp;V</li>
        \t<li>&nbsp;S</li>
        \t<li>&nbsp;D</li>
    </ul>";

    # Tant que l'on n'a pas affecté tous les jours du mois traité
      while ($pas < $nb_jour)                { //accolade d'ouverture 2
        if ($indexe == 1) $leCalendrier .= 
        "\n\t<ul class=\"ligne\">";

        # Si le jour calendrier == jour de la semaine en cours
        if (Date("w", mktime(0, 0, 0, getMonth($periode), 
        1 + $pas, getYear($periode))) == $tableau[$indexe]) { //accolade d'ouverture 3
          # Si jour calendrier == aujourd'hui
          $afficheJour = Date("d", mktime(0, 0, 0, 
          getMonth($periode), 1 + $pas, getYear($periode)));
          if (Date("Y-m-d", mktime(0, 0, 0, getMonth($periode),
          1 + $pas, getYear($periode))) == Date("Y-m-d"))        { //accolade d'ouverture 4
                $class = " class=\"itemCurrentItem\"";
                                                                 } //accolade de fermeture 4
          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 = Date("d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));
                    $afficheJour = "<input type=\"button\" name=\"datejour\" value=\"" . $var . "\" onClick=\"date_id.value=this.value;\" onClick=\"this.style.backgroundColor=\'#3300FF\';\" onBlur=\"this.style.backgroundColor=\'#99FF66\';\" onFocus=\"this.style.backgroundColor=\'#3300FF\';\"; onmouseOver=\"this.style.backgroundColor=\'#99FF66\';\" onmouseOut=\"this.style.backgroundColor=\'#3300FF\';\"}/\>";
                                                                      } //accolade de fermeture 5
                     else                                             { //accolade d'ouverture 5 else
                          $class = "";
                                                                      } //accolade de fermeture 5 else
                                                                 } //accolade de fermeture 4 else
                     # Ajout de la case avec la date
                     $leCalendrier .= "\n\t\t<li$class>
                     $afficheJour</li>";
                     $pas++;
                                                            } //accolade de fermeture 3
             #
             else { //accolade d'ouverture 3 else

                    # Ajout d'une case vide
                    $leCalendrier .= "\n\t\t<li>&nbsp;</li>";
             } //accolade de fermeture 3 else
             if ($indexe == 7 && $pas < $nb_jour) 
             { $leCalendrier 
             .= "\n\t</ul>"; $indexe = 1;} else {$indexe++;}
                                             } //accolade de fermeture 2

          # Ajustement du tableau
          for ($i = $indexe; $i <= 7; $i++)                           { //accolade d'ouverture 6
               $leCalendrier .= "\n\t\t<li>&nbsp;</li>";
                                                                      } //accolade de fermeture 6
          $leCalendrier .= "\n\t</ul>\n";

          # Retour de la chaine contenant le Calendrier
          return $leCalendrier;

                                 } //accolade de fermeture 1
?>

Eléphant du PHP | 113 Messages

22 août 2014, 15:11

les ' c'est comme en php, c'est en fonction des types, tout ce qui est chaîne de caractère sont entourés des guillemets ' ou "

en sql SELECT * FROM table WHERE col1='typeVarchar' AND col2=1; 1est un int, pas besoin de '. En php ta requete devient elle même un string, d'où: "SELECT * FROM table WHERE col1='typeVarchar' AND col2=1"
(Tu n'as pas regardé le message que j'ai posté sur comment faire une connexion pour l'utilisateur avec la bonne syntaxe ;) et un conseil, commence tout de suite à faire un peu de sécurité, sinon tu risques d'oublier des morceaux !)

$query=mysqli_query($connexion,$req) or die ("Exécution de la requête impossible.");
rajoute mysqli_error($connexion) pour avoir l'erreur de ta requête, sa t'aidera grandement à l'avenir
$query=mysqli_query($connexion,$req) or die ("Exécution de la requête impossible: ".mysqli_error($connexion));


Par contre pour ça je suis pas content :non: :non: :non: :non: c'est pas très propre ;)
$afficheJour = "<input type=\"button\" name=\"datejour\" value=\"" . $var . "\" onClick=\"date_id.value=this.value;\" onClick=\"this.style.backgroundColor=\'#3300FF\';\" onBlur=\"this.style.backgroundColor=\'#99FF66\';\" onFocus=\"this.style.backgroundColor=\'#3300FF\';\"; onmouseOver=\"this.style.backgroundColor=\'#99FF66\';\" onmouseOut=\"this.style.backgroundColor=\'#3300FF\';\"}/\>"; 
met un class à ton bouton et dans ton fichier .css tu mettras input.leNomDuClass:hover { background-color: #99FF66; }
Garde uniquement le 1er onClick , le reste tu peux l'enlever (regarde tout ce qui existe en css comme évènement)

Ensuite j'aimerais vraiment voir la gueule de ton formulaire ^^ Avec tout ce que tu me racontes j'ai un peu du mal à voir

2) a) quand tu insères la date, vérifie que ce soit le même format entre le champ de ta table et celui de la variable !

b) Tu as afficher tes scripts pour afficher le calendrier seulement, il faudrait celui pour le traitement de ton formulaire.. :) J'en ai besoin pour voir ce que tu as fait et si jamais corriger tes erreurs

Eléphant du PHP | 290 Messages

22 août 2014, 18:33

C'est vrai que c'est très moche. J'ai mis du code un peu partout pour faire différents essais avec les navigateurs,
mais quand on écrit du code aussi moche pour faire des essais alors dans ce cas on ne le montre pas.
Désolé!!

Si ça ne t'ennuie pas je souhaite te montrer mon formulaire et ma page de traitement de formulaire
comme s'il n'y avait que le calendrier comme rubrique dans mon formulaire.
Le reste ne servirait à rien pour régler les problèmes du formulaire et
il y a aussi le fait que j'ai des choses à terminer à plein d'autres endroits du formulaire.
Pour dire ça simplement, tout comme mon javascript ci-dessus mes autres
champs ne sont pas présentables maintenant.

Page formulaire calendrier:
<form action="traitement_reservations.php" method="POST">
&nbsp;&nbsp;Veuillez sélectionner la date du premier jour
<div style="color: red; font-size: 15px; font-weight: 600;">
<?php
date_default_timezone_set('Europe/Paris');
$auj = date(" d m Y \(\s\\e\m\a\i\\n\\e W\)");// \\e\\t \i\l \\e\s\\t H \h i \m\\n.");
echo "<br/>&nbsp;&nbsp;&nbsp;Nous sommes le $auj<br/>";
?>
</div>
</br>

<?php # fonctions utiles, $valeur 
 # représente une date au format AAAA-MM-JJ
 function getSecond($valeur) {
 return substr($valeur, 17, 2);
   }

   function getMinute($valeur) {
       return substr($valeur, 14, 2);
   }

  function getHour($valeur) {

      return substr($valeur, 11, 2);
  }

  function getDay($valeur)     {
     return substr($valeur, 8, 2);
  }

  function getMonth($valeur)     {
     return substr($valeur, 5, 2);
  }

  function getYear($valeur) {
     return substr($valeur, 0, 4);
 }

  function monthNumToName($mois) {
    $tableau = Array("", "Janvier", "Février", 
    "Mars", "Avril", "Mai", "Juin", "Juillet", 
    "Aôut", "Septembre", "Octobre", "Novembre", "Décembre");

    return (intval($mois) > 0 && intval($mois) 
    < 13) ? $tableau[intval($mois)] : "Indéfini";
}
?>

<?php
# Fonction pour afficher le calendrier
 function showCalendar($periode) { //accolade d'ouverture 1
    $leCalendrier = "";
    # Tableau des valeurs possibles pour un numéro 
    # de jour dans la semaine
    $tableau = Array("0", "1", "2", "3", "4", "5", "6", "0");

    $nb_jour = Date("t", mktime(0, 0, 0, getMonth($periode), 
    1, getYear($periode)));
    $pas = 0;
    $indexe = 1;

    # Affichage du mois et de l'année
    $leCalendrier .= "<h2>" . monthNumToName
    (getMonth($periode)) . " " . getYear($periode) . "</h2>";

    # Affichage des entêtes
    $leCalendrier .= "
    <ul id=\"libelle\">
        \t<li>&nbsp;L</li>
        \t<li>&nbsp;M</li>
        \t<li>&nbsp;M</li>
        \t<li>&nbsp;J</li>
        \t<li>&nbsp;V</li>
        \t<li>&nbsp;S</li>
        \t<li>&nbsp;D</li>
    </ul>";

    # Tant que l'on n'a pas affecté tous les jours du mois traité
      while ($pas < $nb_jour)                { //accolade d'ouverture 2
        if ($indexe == 1) $leCalendrier .= 
        "\n\t<ul class=\"ligne\">";

        # Si le jour calendrier == jour de la semaine en cours
        if (Date("w", mktime(0, 0, 0, getMonth($periode), 
        1 + $pas, getYear($periode))) == $tableau[$indexe]) { //accolade d'ouverture 3
          # Si jour calendrier == aujourd'hui
          $afficheJour = Date("d", mktime(0, 0, 0, 
          getMonth($periode), 1 + $pas, getYear($periode)));
          if (Date("Y-m-d", mktime(0, 0, 0, getMonth($periode),
          1 + $pas, getYear($periode))) == Date("Y-m-d"))        { //accolade d'ouverture 4
                $class = " class=\"itemCurrentItem\"";
                                                                 } //accolade de fermeture 4
          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 = Date("d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));
                    $afficheJour = "<input type=\"button\" name=\"datejour\" value=\"" . $var . "\" onClick=\"date_id.value=this.value;\">";
                                                                      } //accolade de fermeture 5
                     else                                             { //accolade d'ouverture 5 else
                          $class = "";
                                                                      } //accolade de fermeture 5 else
                                                                 } //accolade de fermeture 4 else
                     # Ajout de la case avec la date
                     $leCalendrier .= "\n\t\t<li$class>
                     $afficheJour</li>";
                     $pas++;
                                                            } //accolade de fermeture 3
             #
             else { //accolade d'ouverture 3 else

                    # Ajout d'une case vide
                    $leCalendrier .= "\n\t\t<li>&nbsp;</li>";
             } //accolade de fermeture 3 else
             if ($indexe == 7 && $pas < $nb_jour) 
             { $leCalendrier 
             .= "\n\t</ul>"; $indexe = 1;} else {$indexe++;}
                                             } //accolade de fermeture 2

          # Ajustement du tableau
          for ($i = $indexe; $i <= 7; $i++)                           { //accolade d'ouverture 6
               $leCalendrier .= "\n\t\t<li>&nbsp;</li>";
                                                                      } //accolade de fermeture 6
          $leCalendrier .= "\n\t</ul>\n";

          # Retour de la chaine contenant le Calendrier
          return $leCalendrier;

                                 } //accolade de fermeture 1
?>

<?php
echo showCalendar (date("Y-m"));
?>

<style type="text/css">
calendrier.css?201208241130"css">#calendrier li{ list-style: none; } #libelle { width: 210px; margin: 0 auto; padding: 0; position: absolute; left: 387px; } .ligne { width: 210px; margin: 0 auto; padding: 0; position: relative; top: 50px; position: relative; right: 395px  } #libelle li {  float : left; width : 30px; list-style-type: none; font-size: 27px; margin-right: 0px; margin-left: 0px; padding: 0px;} .ligne li { float : left; width : 30px; list-style-type: none; } .ligne li a:hover{ color: #800080; list-style: none; text-decoration: none; font-weight: 800; } li.itemCurrentItem { color: #FF0000; position: relative; top: 4px; left: 6px; font-weight: 600;/* A vous de configurer l'apparence de la date du jour */ } li.itemSelectedItem { color: #0099FF;/* A vous de configurer l'apparence du jour sélectionné */ } li.itemExistingItem {background-color: #FFB693; } li.itemExistingItem:hover {background-color: #663300; }
</style>

<input type="type" name="date_id" id="date_id" value="" />
</br>
</br>
<input type="submit" name="validation" style="background-color: #A9A9A9;" type="button" value="VALIDER VOTRE RESERVATION"
onmouseOver="this.style.backgroundColor='#C0C0C0';";
onmouseOut="this.style.backgroundColor='#A9A9A9';"/>
<input type="reset" name="reset"style="background-color: #A9A9A9;" type="button" value="RECOMMENCER"
onmouseOver="this.style.backgroundColor='#C0C0C0';";
onmouseOut="this.style.backgroundColor='#A9A9A9';"/>  
&nbsp;&nbsp;<input style="background-color: #A9A9A9;" type="button" value="RETOUR PAGE PRECEDENTE"
onmouseOver="this.style.backgroundColor='#C0C0C0';";
onmouseOut="this.style.backgroundColor='#A9A9A9';"
onClick="window.location='session.php';" />
</br>
</br>       
</form>

Page traitement formulaire calendrier:
$date_id_envoye=$_POST['date_id'];
if ($date_id_envoye ==""){
echo '<body onLoad="alert(\'Veuillez renseigné le champs.\')">'; 
echo '<meta http-equiv="refresh" content="0;URL=reservation.php">';
}
include("montagnesregion.php");

$connexion=mysqli_connect($hote,$utilisateur,$motPasse) or die ("Connexion au serveur impossible.");
$nombase=mysqli_select_db($connexion,$nombase) or die ("Sélection de la base impossible.");

#nettoyage des données.
$date_id_envoye = mysqli_real_escape_string($connexion, $date_id_envoye);

$req="INSERT INTO table_des_reservations (datepremier jour)VALUES('".$date_id_envoye."')
$query=mysqli_query($connexion,$req) or die ("Exécution de la requête impossible: ".mysqli_error($connexion));

echo "<h4>Les données que vous avez saisies ont bien été enregistrées.</h4>";

$ok = mysqli_close($connexion);
echo 'Déconnexion : $ok = ',($ok)?"TRUE":"FALSE","<br />\n";
	
header("Location: http://localhost/mon_site/etape_suivante_dans_session.php");
?>
et la ligne dans ma table qui correspond au champs du calendrier:
datepremier jour date NOT NULL,
Pour info, j'ai essayé de mettre le champs caché dans ma première page en text
(type="hidden" => type="text") pour voir ce que ça donne.
Le jour choisi par l'utilisateur apparaît alors dans le champs qui n'est plus caché
(par exemple 23 ou 28).
Ni le mois ni l'année n'apparaissent.
Deux remarques me viennent à l'esprit par rapport à ce que tu m'as dis:
dans mon code php:
                    $var = Date("d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));
                    $afficheJour = "<input type=\"button\" name=\"datejour\" value=\"" . $var . "\" onClick=\"date_id.value=this.value;\">";
Le php range d'abord le mois, le jopur puis l'année si je lis bien.
Hors dans phpmyadmin j'ai dans ma colonne dédiée à la date du calendrier 0000-00-00, qui correspond
à année, mois puis jour. C'est l'inverse.
Mais avant même de régler ce problème, j'aimerais d'abord bien savoir si dans ma variable
j'ai bien le mois et l'année d'entrés, car si jamais je n'ai que le jour d'enregistré ça ne me sert à rien.

Eléphant du PHP | 290 Messages

22 août 2014, 18:59

Si c'est vraiment nécessaire que tu vois tout le formulaire
(idem pour la page de traitement de formulaire), je le ferai.
Il me faudra alors travailler d'abord la présentation sinon j'ai trop honte!!

Je te montre pourquoi j'ai honte avec un exemple:
&nbsp;&nbsp;Veuillez sélectionner le ou les créneau(x) qui vous intéresse(nt):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="creneau" value="matinee"/>&nbsp;&nbsp;la matinée&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="creneau" value="apres-midi"/>&nbsp;&nbsp;l'après-midi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="creneau" value="soiree"/>&nbsp;&nbsp;la soirée
</br>
</br>
C'est moche avec tous ces &nbsp;
Mon premier formulaire (identification) est très beau car j'ai des ul et des li pour chaque input, ça respire, c'est propre!!
Mais ici les puces me gênent. Elles créent des décalages que je ne choisis pas sur ma page du site.
Donc pour avoir mon rendu souhaité j'en arrive à écrire un code aussi moche... mais qui me rend un
meilleur rendu sur le site.

Eléphant du PHP | 113 Messages

22 août 2014, 21:52

A la fin de ton formulaire tu as ça:
<input type="type" name="date_id" id="date_id" value="" />
un input type="type", sa n'existe pas, tu voulais mettre quoi exactement ?

Attention :
$date_id_envoye=$_POST['date_id'];
if ($date_id_envoye ==""){...
ta 1er ligne retournera une erreur si ton champ date_id n'as pas été remplie. Il faut don tester POST directement.
Pour savoir si une variable existe et si elle n'est pas vide, la meilleure solution est celle-ci:
if (!empty($_POST['date_id'])) {
   $date_id_envoye=htmlentities($_POST['date_id']); //htmlentities protège de l'injection php
   // suite du traitement de ton formulaire si tu n'attribue pas de valeur par défaut en cas d'échec
else {
   //ton traitement de l'erreur ou affectation à date_id_envoye d'une valeur par défaut
}
à cette ligne :
$req="INSERT INTO table_des_reservations (datepremier jour)VALUES('".$date_id_envoye."')
une chtite erreur qui m'arrive souvent ^^ , l'oublie du fameux ";" de plus tu as oublié de fermer ta chaîne avec ".

tu as deux solution pour régler le problème de la date:

1- tu ne peux faire des réservations que sur le mois courant,
donc avant ta requete, ta variable issue du formulaire tu la transformes, $date = date("Y-m-").$date;

2- les réservations marchent pour n'importe quel dates; il faut que tu enregistres dans une variable le mois et l'année du calendrier en cours et que tu la stocke dans un input hidden que tu récupéreras au traitement et tu feras la concaténation des deux variables pour obtenir le bon format.



Pour ton formulaire et l'esthétique je t'invite à découvrir toutes les possibilités de css3. Avec les parents/fils, pour les puces je t'avais expliquer comment les enlever: (list-style-type: none;)
à la place de tes espaces tu peux faire un padding ou margin en fonction de tes éléments. Après il y a la solution de facilité qui consiste à mettre ton formulaire dans un tableau en html ^^
pour ta date tu peux changer le format juste avant ta requête:
ta valeur de retour est sous la forme d

date("Y-m-d");