[RESOLU] Faire un calendrier.

Eléphant du PHP | 113 Messages

18 août 2014, 18:18

1) Quand ton utilisateur se connecte, tu enregistre son nom dans une variable SESSION, pourquoi ne pas en profiter pour y enregistrer aussi son id par la même occasion ? Tu devras sûrement l'utilisé souvent. C'est ce que je fais en version simplifié. Comme ça pas besoin de hidden ;) Mais ta solution marche quand même à priori.

2) tu peux mettre type="button" et grâce à javascript enregistré cette valeur dans un input type="hidden". SInon tugardes le submit, mais tu récupères la valeur que tu mets dans un hidden aussi (mais tu recharges la page). Autrement , mais sa serait dommage, il existe ce input qui peut remplacer ton calendrier: http://www.alsacreations.com/tuto/lire/ ... local.html (input type date).

3) C'est pas très clair ^^ Ton option supplémentaire n'est pas obligatoire, mais ton script le considère, à cause d'un erreur, comme indispensable ? SI c'est ça faut voir la partie du script qui traite sa valeur de retour.

4) les cases options tu ne peut que jouer sur le "checked" pas sur les values puisque ce sont celle du form que tu imposes. Et pour la liste déroulante il existe le "selected". Pour ça je t'invite à rechercher sur d'autres sites pour mieux comprendre. Sinon oui :)

Eléphant du PHP | 290 Messages

19 août 2014, 12:25

Merci pour tes réponses.
Comme c'est un peu compliqué pour moi, je vais voir déjà les deux premiers points:

1/ En fait, j'ai oublié de dire que je voulais que le premier champs (numéro de client)
soit en auto-incrément dans ma table B. Il est en auto_incrément dans ma table A.
En faisant comme ça je pense que je vais avoir un gros problème de logique:
le numéro de client peut être en auto_incrément dans la table A car les premiers couples
nom d'utilisateur et mot de passe peuvent se suivrent les uns derrières les autres dans
la table au fur et à mesure qu'il sont créés, et l'auto_incrémentation correspond au
numéro d'ordre de création du couple dans la table.
Mais pour ce qui est du formulaire, dont la table correspondante dans le SGBD est la table B,
à mon avis on ne peut pas concevoir l'auto_incrémentation de la même manière.
Un client peut faire trois réservations à différents moments par exemple, et ces trois réservations
devront avoir un numéro d'auto_incrémentation différent.
Il n'est donc plus possible d'associer un numéro d'auto_incrémentation avec un client.
Dans ma table B, l'auto_incrémentation doit donc faire référence à une réservation
et non un client.
Je n'ai pas trop l'habitude de faire des trucs si difficlies (si difficiles pour moi je veux dire) #-o
dinc si tu à l'habitude de ces problèmes de conception je serais
très content d'avoir ton avis.
Mon idée générale dans la conception de mes table est d'avoir un numéro de client comme
clée pour toutes mes tables, quite à avoir certaines tables avec deux clées:
celle du numéro de client + une autre.
En attendant ta réponse bien sûr je vais réfléchir au problème...


2/ J'ai mis type="button". Ca correspond bien à ce que je veux faire:
d'une part j'ai d'autres boutons sur mon formulaire et d'autre part
je préfère éviter de recharger la page.
Maintenant, je voudrais procéder par étape car je galère vraiment.
Est-ce que déjà 1) tu peux me dire si j'arrive bien à associer les accolades
d'ouverture et de fermeture dans mon code ci-dessous (j'utilise deux antislashs // pour chaque description):
<?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 . "\"></input>";
                    } //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
?>
Si tu veux bien me dire si mon découpage est bon ce serait très sympa car j'ai beaucoup
de mal à y retrouver mes petits.

A propos de $pas, tu m'as dis que cette variable sert à générer le calendrier.
Je voudrais savoir 2) comment tu lis
1 + $pas
qu'on trouve à plusieurs reprises dans le code ?

Pour la partie qui m'intéresse surtout:
        else { //accolade d'ouverture 4 else
               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 . "\"></input>";
                    } //accolade de fermeture 5
                     else { //accolade d'ouverture 5 else
                          $class = "";
                          } //accolade de fermeture 5 else
Si je regarde la ligne
     else { //accolade d'ouverture 4 else
Elle dit bien "s'il ne s'agit pas du jour d'aujourd'hui..."
ce qui signifie bien que la partie de code suivante concerne tous
les jours sauf le jour d'aujour'd'hui, 3) c'est bien ça?
La partie suivante étant:
               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 . "\"></input>";
                    } //accolade de fermeture 5
                     else { //accolade d'ouverture 5 else
                          $class = "";
                          } //accolade de fermeture 5 else
Est-ce que tu veux bien déjà répoondre aux questions
1/ et 2/ 1) 2) 3) ? :D
Merci encore pour tout le suivi :D
Je crois qu'il faut que j'y aille par étape! 8-|

Eléphant du PHP | 113 Messages

19 août 2014, 12:54

1/ Il faut que tu rajoutes un champ id_user dans commande:

id_commande, id_user, id_produit, id_quantite

id_user est une clé externe qui référence id_user de ta table utilisateur

2/

1) Les accolades sont correctes

2) Il s'agit du jour, http://php.net//manual/fr/function.mktime.php pour expliquer mktime au passage

3) C'est exactement ça

Eléphant du PHP | 290 Messages

19 août 2014, 15:09

Merci, j'y vois plus clair même si j'ai encore du travail devant moi :D

Pour 1/ je ne comprends pas ce que sont les champs qui commencent par id_...
Est-ce que tu parles de ma table B dans mon SGBD quand tu dis commande?
Je sais ce que c'est qu'une clef primaire, mais je ne comprends pas clef externe.
Je ne sais pas si tu veux bien m'expliquer un peu ta réponse pour le 1/
A dire vrai, je ne comprends pas ta réponse car je suis pas très fort.
Désolé :mrgreen:
Si tu veux bien m'expliquer un peu plus...

Pour 2/ 2) à propos de 1 + $pas j'ai en fait besoin de savoir si:
- le signe + est un élément de concaténation. Si non, qu'est-ce que c'est?
Quel relation crée-t'il entre 1 et $pas?
- le 1 fait référence à indexe? Que la réponse soit oui ou non, il s'agit bien d'un incrément,
il donne 1 comme valeur au jour d'aujourd'hui et il n'a rien à voir avec une valeur booléenne (soit 1 soit 0), c'est bien juste?
- $pas est la génération du calendrier en même temps (même temps exprimé avec le signe +, c'est ça?) que la date d'aujourd'hui:
le 1 exprimé par indexe, c'est bien ça?
Pour mktime, j'ai compris. Merci.
- à propos toujours de l'ensemble 1 + $pas ...
Ici, j'ai une boucle for. Toute boucle for à un début, une fin et un incrément.
Si l'incrément est:
                  $pas++;
et le début est:
$indexe == 1
alors l'ensemble 1 + $pas ne serait-il pas finalement la fin? Ce jusqu'où va l'incrémentation.

A propos de ta réponse sur l'input:
tu peux mettre type="button" et grâce à javascript enregistrer cette valeur dans un input type="hidden"
Il y a deux input, donc? Là, je ne comprends pas. Normalement il n'y a qu'un input pour un champs de formulaire.
Pourquoi en rajouter un deuxième? Quelle relation se crée entre le premier imput et le deuxième?
Je n'arrive pas à voir pourquoi et encore moins comment mettre ça en place.
Ecrire du javascript dans du php est difficile pour moi.
Comment insères-tu du code js dans du code php?
Je ne sais pas si tu peux m'aider un peu pour ça, me montrer comment fonctionne le code
ou me donner quelques autres explications :priere:

Désolé pour toutes ces questions mais il me faut prendre le taureau par les cornes
pour comprendre ma programmation puis la réussir.
Merci encore pour toute ton aide :D

Eléphant du PHP | 113 Messages

19 août 2014, 16:54

1) c'est juste le nom que tu peux donner aux champs, mais sache qu'id est un identifiant, il sera toujours unique. Comme ça, même si l'utilisateur change de nom on peut toujours le retrouvé grâce à son id par exemple. Tu comprends le principe de l'id ?

Laisse tomber la clé externe ^^ ça fonctionne sans, mais il faut bien construire ses requêtes surtout. Mais c'est le champ (id_user ou ref_user comme tu veux) qui te permet de dire que cette commande appartient à cet utilisateur. Le SQL c'est du français. Avant d'écrire une table ou une requête pense le en français, par exemple pour la table commande tu dis: une table de commande avec pour chaque commande un identifiant unique, la référence de l'utilisateur qui l'as passé, le produit qu'elle contient et sa quantité. Compris :D ?

2) 1 + $pas = la valeur de $pas +1. C'est une bête addition :wink:
Tu remarqueras que $pas est initialisé à 0. Donc il y a un décalage.

(Remarque: il me semble qu'il aurait pu être initialisé à 1, pour simplifier quelques élément du code, mais il aurait du changer la condition du while en while ($pas <= $nb_jour) mais il y aurait eu d'autres petits imprévus. De toute manière l'algorithme à été réfléchie donc il n'y a pas de problème)


Ensuite pour le for la condition de fin se trouve dans le test booléen:
for ($i=0; $i < 11; $i++)
// on le lit de cette manière pour $i allant de 0 à 10

la seule boucle for est celle ci dans ton code
# Ajustement du tableau
          for ($i = $indexe; $i <= 7; $i++) { //accolade d'ouverture 6
               $leCalendrier .= "\n\t\t<li>&nbsp;</li>";
          } //accolade de fermeture 6
l'incrémentation $pas++; à lieu dans le while ($pas < $nb_jour) { ... }

Pour le input je vais t'expliquer:
(le </input> est inutile)
//à la place du input $afficheJour = "<input type=\"button\" name=\"datejour\" value=\"" . $var . "\"></input>";
$afficheJour = "<input type=\"button\" name=\"datejour\" value=\"" . $var . "\" onclick=\"date_hid.value=this.value\">";
et dans ton formulaire tu rajoutes:
<input type="hidden" name="date_hid" id="date_hid" value="">
Du coup quand tu valides ton formulaire, tu récupéreras la valeur de $_POST['date_hid'] :!: Pense à tester si elle n'est pas vide (!empty($var))
Forcément il faut que javascript soit activé, donc avant ton formulaire tu peux mettre un noscript pour prévenir les utilisateurs ayant désactivé js

A moi de te poser une petite question, est-ce que tu as une petite base en programmation ou tu découvre ? Dans le second cas il est peut être bon de voir du côté des syntaxes à apprendre et des ptits trucs récurrents en prog. Je suis à ta disposition si jamais.

Eléphant du PHP | 290 Messages

19 août 2014, 18:24

Merci pour tout.
Ca me donne du travail :D

J'aurais juste deux petites questions qui sont VRAIMENT courtes cette fois:

-les champs qui commencent par id_, j'écris id_user par exemple, sont des champs uniques
qui peuvent être choisis avec l'option auto_increment?

- à propos de javascript, je vois que tu es très à l'aise pour insérer du javascript où tu veux,
et "toutes les têtes" en programmation qui répondent aux questions sur ce forum le sont aussi.
Je suis en fait assez surpris car moi, j'ai appris que pour écrire du javascript il faut
écrire le code entre
[javascript]
//<![DATA[
<script type="text/javascript">
[/javascript]
et ...
[javascript]
</script>
//]]>
[/javascript]

Tout comme je mets mon php entre un
<?php
et...
?>
Bien sûr, quand je jette un coup d'oeil sur ce qui se passe sur les forums je vois que la réalité est bien différente...

...et j'en arrive à ta question.
Pour ce qui est de la programmation, j'ai lu un pavé sur html et css,
un autre sur javascript, un autre pavé sur php et MySQL,
un autre sur l'éditeur Dreamweaver (jusque là ça fait environ 2000 pages
d'apprentissage), je lis des tutoriels sur les forums, je pose des questions
sur les forums et je lis les questions et réponses des autres personnes.
Mais je n'ai presque aucune expérience dans la "fabrication" d'un site.
Je commence juste et le manque de pratique me fait cruellement défaut.
Souvent, les programmeurs qui répondent à mes questions quand j'en pose
me renvoient sur des pages de théorie (qui me sont d'ailleurs presque toujours très utiles).
Ils semblent penser que c'est la théorie qui me manque le plus, hors je crois
que c'est la pratique (ce qui n'empêche pas par ailleurs qu'il puisse me manquer de la théorie aussi).

Je suis un débutant mais je trouve la programmation très intéressant :D
Je pars de bas et j'ai très envie de progresser :D

Eléphant du PHP | 290 Messages

19 août 2014, 18:27

A oui, ma deuxième question: pourquoi tu peux mélanger le javascript et le php ensemble
sans mettre toutes les balises que je mets pour annoncer le langage dans lequel tu m'exprimes?

Eléphant du PHP | 113 Messages

19 août 2014, 18:48

Tu peux inclure du js en html, c'est ce que j'ai fait avec <input .... onclick="...."> , onclick est un évènement et dedans j'ai mis du js.
Mais avec les normes, sa tente à disparaître, et donc il faudra crée des événements en js (méthode plus "correcte"). Mais oui sinon le js comme les autres langages faut les mettres dans les balises :)

Oui les id en auto_increment, après c'est ma façon de les noter, tu mettre idu, iduser, ou ce que tu veux, mais faut que ce soit clair et compréhensible.

Si tu veux j'ai commencer à coder du vbs en bloc note, donc oui la pratique c'est bien, mais quand tu découvres la théorie et que tu te retournes sur ce quee tu as fait tu prends peu ^^. Donc avoir des bon réflexes et des bonnes habitudes c'est bon à prendre :)

Eléphant du PHP | 290 Messages

20 août 2014, 14:55

Merci encore pour tes réponses :D

J'ai ajouté le code suivant:
          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;\"
					onMouseover=\"this.style.color=\'#99FF66\';\" onMouseout=\"this.style.color=\'#3300FF\';\"/\>";
                                                                      } //accolade de fermeture 5
                     else                                             { //accolade d'ouverture 5 else

et
<input type="hidden" name="date_id" id="date_id" value=""/>
Tout en haut de ma page de traitement de formulaire j'ai ajouté:
if (!empty($_POST['var']))
{ 
echo "la date est prise en compte";
} else{
echo"la date n'est pas prise en compte";
}
J'ai deux soucis :cry: :
-Mon javascript ne fonctionne pas.
-le navigateur retourne "la date n'est pas prise en compte".

Eléphant du PHP | 290 Messages

20 août 2014, 15:11

Mais si je remplace var par date_id comme ceci:
if (!empty($_POST['date_id']))
{ 
echo "la date est prise en compte";
} else{
echo"la date n'est pas prise en compte";
}
le navigateur renvoit: "la date est prise en compte" :)

Ce point semble réglé
Il faut juste voir ce qui ne va pas avec mon javascript

Eléphant du PHP | 290 Messages

20 août 2014, 15:13

Si bien sûr tu es toujours d'accord pour m'aider :)

Eléphant du PHP | 290 Messages

20 août 2014, 16:42

J'ai aussi un question à propos des tables avec le champs id.
Quand je crée une table avec un champs id_utilisateur et que je précise le paramètre AUTO_INCREMENT
je n'arrive pas à créer ma table.
Phpmyadmin précise qu'il y a un soucis avec le champs id_utilisateur.
Je suis donc obligé d'enlever le paramètre AUTO_INCREMENT pour arriver à créer ma table.
Je voudrais savoir si c'est normal que ça pose problème.

Je mets en clée primaire:
PRIMARY KEY (id_utilisateur)

Eléphant du PHP | 113 Messages

20 août 2014, 16:52

Pour les formulaires tu récupères toujours les valeurs de tes champs par leur name, ainsi un input name="abc" tu le récuperas avec $_POST['abc']

Normalement sa marche, sinon regarde si javascript est bien activé, met
<noscript>Activez javascript pour que le script fonctionne</noscript>
Si tu vois cette ligne sur ta page, js est désactivé

Pour t'aider il faudrait le message d'erreur complet et le schéma de ta table
Modifié en dernier par toytoy le 20 août 2014, 21:56, modifié 1 fois.

Eléphant du PHP | 290 Messages

20 août 2014, 20:31

Malheureusement il y a d'abord des points importants que je ne comprends pas,
et tant que ces points là je ne les comprends pas je ne peux pas avancer. :cry:

Il faut que je revienne à des points de compréhension plus généraux, je n'ai pas le choix.

J'ai une session à accès réservé avec une première page où je demande un nom d'utilisateur et un mot de passe.
Si cette première étape est validée, l'utilisateur arrive à un formulaire de réservation. C'est la deuxième étape.

J'ai dans mon SGBD une table qui correspond à mon formulaire pour le couple nom d'utilisateur/mot de passe
que j'appelle table A.
J'ai aussi dans mon SGBD une table qui correspond à mon formulaire de réservation que j'appelle table B.

La table A a un champs numéro de client (clef primaire), un champs nom d'utilisateur et un champs mot de passe.
La table B a plein de champs afférents à des choix spécifiques pour une réservation (nombre de personnes, réservation pour 1/2 journée ou une journée,...).

Le gros problème que je rencontre est quand je commence à me poser la question de savoir qu'est-ce que je dois mettre comme clef primaire
pour ma table B.
En effet, alors que je pensais utiliser le numéro de client comme clef primaire pour ma table B (qui est déjà clef primaire de ma table A),
je me rencontre que ça ne va pas le paramètre de l'auto_incrémentation que doit prendre la clef primaire donne des valeurs différentes
pour toutes les réservation d'un même client, alors que ce client lui est toujours unique.
Tu m'as alors proposé pour résoudre le problème d'utiliser des champs id qui ont l'avantage de pouvoir être un clef avec le paramètre AUTO_INCREMENT
tout en donnant une seule valeur seulement pour toutes les réservations d'un même client.

1ère question: est-ce que c'est pertinent d'un point de vue conception générale de rajouter un champs id en plus pour la table A et pour la table B
- en position de deuxième champs en dessous du champs numéro de client pour la table A et en position de premier champs pour la table B - en plus des champs déjà existants
(sachant dans ce cas que le champs numéro de client est toujours clef primaire dans la table A et c'est le champs id qui devient clef primaire dans la table B)?

2ème question: si j'ai alors un champs id dans les deux tables A et B, il convient mieux comme tu me l'as fait remarquer d'ajouter
la présence obligatoire en plus de $_SESSION['id_utilisateur'] sur toutes les pages de la session comme suit:
session_start();
if (isset($_SESSION['id_utilisateur]) && isset($_SESSION['nom_utilisateur']) && isset($_SESSION['mot_de_passe'])){
...
au lieu seulement de:
session_start();
if (isset($_SESSION['nom_utilisateur']) && isset($_SESSION['mot_de_passe'])){
...
Je suis sûr ainsi de pouvoir disposer de cette variable chaque fois que j'en ai besoin.

Ma question est de savoir comment récupérer cette variable?
Je récupère les variables du nom d'utilisateur et du mot passe avec le premier formulaire car
j'ai des champs text, mais je n'ai pas de champs text me permettant de récupérer l'id qui se trouve
dans ma base de données.
J'ai donc pensé à mettre un champs caché sur mon premier formulaire mais je galère vachement...
J'arrive à coder sur ma page du premier formulaire pour récupérer toutes les données sur trouvant
dans le champs id dans ma base de données, à mettre ces données en attente, dans un endroit
temporaire grâce à Mysqli_query et j'arrive bien sûr à créer un champs caché dans mon formulaire
avec name="id_utilisateur".
Mais c'est pas simple car il me reste un travail d'association à faire. C'est ça sur quoi je bloque #-o
En effet, il faut encore que j'associe la valeur qui se trouve dans l'endroit temporaire
avec la valeur qui se trouve dans le champs caché.
Pour dire ça autrement, il faut que je permette au programme de prendre la bonne variable dans l'endroit temporaire et de l'associer
au champs caché, sinon la variable restera éternellement dans l'endroit temporaire et sera toujours déconnectée du champs caché.
Moi, je veux permettre la connexion entre les deux.
Mais c'est encore plus compliqué que ça, car je ne sais pas parmi toutes les valeurs id qui se trouvent dans l'endroit temporaire
laquelle est celle qui va correspondre à la référence de l'utilisateur qui va cliquer sur envoi.
Ca je pourrai le savoir une fois seulement que l'utilisateur aura cliqué sur envoi,...
Si maintenant je mets la portion de code avec mysqli_query dans la page de traitement de formulaire et non dans
la page de formulaire, je ne peux pas mettre mon champs caché dans ma page de traitement de formulaire.
C'est le chat qui essaye de se mordre la queue.
Pour moi c'est un vrai casse-tête chinois.
Je ne sais pas si tu peux m'éclairer.
Si j'ai une solution pour ça, je peux alors répercuter l'id sur toutes les pages de ma session!!

3ème question: ma table en SQL
CREATE TABLE reservations (
id_utilisateur char(5) NOT NULL AUTO_INCREMENT,
...
et patati et patata tout ça ça marche très bien il s'agit des détails de la réservation du client X
...
PRIMARY KEY (id_utilisateur)
);
Je n'arrive pas à créer la table!
L'interface de phpmyadmin m'informe:
#1063 - Incorrect column specifier for column 'id_utilisateur'
Il suffit que l'enlève le paramètre AUTO_INCREMENT comme suit pour que ça marche:
CREATE TABLE reservations (
id_utilisateur char(5) NOT NULL,
...
et patati et patata tout ça ça marche très bien il s'agit des détails de la réservation du client X
...
PRIMARY KEY (id_utilisateur)
);
Mais bien sûr ça ne va pas: aucune ligne de réservation ne peut fonctionner
sans un champs avec le paramètre AUTO_INCREMENT.

4ème question: c'est moi qui donne un mot de passe et un nom d'utilisateur à mes clients.
Mes clients, eux, ne peuvent pas les choisir eux-mêmes (c'est un choix voulu par rapport à
mon projet professionnel).
Il en est de même pour le champs id.
Comme c'est nouveau pour moi, est-ce que tu pourrais me donner un conseil sur quelle valeur
mettre pour le champs id? Le champs id est tout-à-fait nouveau pour moi et je ne sais pas trop comment
l'appréhender.
D'après ce que j'ai dis tout en haut de la question 4, mon premier formulaire ne permet donc pas à l'utilisateur d'entrer des
données dans une base de données alors que le deuxième si.
Le premier formulaire vérfie si les données saisies correspondent à celles qui sont dans la base de données
et le deuxième permet à l'utilisateur de remplir la base de données (pour dire ça simplement).

5ème question: est-ce que tu peux me dire si cette façon de voir les choses est bonne?
Le champs id donne une valeur unique à toutes les réservations d'un même client dans ma table B
et il permet aussi de permettre à l'ordinateur d'assurer l'AUTO_INCREMENTATION.
C'est pour cela que je dois avoir ce champs dans ma table B.
Pour des raisons pratiques, il convient de garder "en mémoire vive" la variable du champs id sur toutes les
pages de ma session. Il faut pour ce faire récupérer cette variable dans la base de données même pour
un utilisateur qui a ses identifiants mais qui n'a encore jamais fait de réservation.
C'est pour cela que je dois avoir ce champs dans ma table A aussi.
Mon champs numéro de client qui se trouve dans ma table A est le seul champs qui donne une
identification VRAIMENT unique pour un seul client.
Je le garde dans ma table A car c'est très significatif avec le couple nom d'utilisateur/mot de passe.
Je ne le garde pas dans ma table B car c'est mon significatif dans cette table là.

Je crois que je n'ai jamais autant galérer sur la conception d'un programme #-o #-o #-o

Vraiment, désolé pour toutes ces questions et un grand merci!!!

Eléphant du PHP | 113 Messages

20 août 2014, 22:42

C'est ta compréhension des bases de données qui te fais défaut. Je vais tenté de t'expliquer rapidement, mais il vaut mieux lire un bon tuto sur comment crée proprement une belle base de donnée avec plusieurs tables.

Imaginons que je veuille crée un site de réservation. J'ai donc des utilisateurs qui peuvent s'inscrire pour pouvoir réserver. Ainsi dès qu'un utilisateur s'inscrit il reçoit un identifiant unique qu'il gardera toute sa vie (comme ton numéro de sécurité sociale par exemple). Donc dans ma base de donnée je commence par crée une table utilisateur. Je mets une clefs primaire en auto_increment (je suis sûr que les valeurs seront uniques) puis un champ peudo et mot de passe.

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
L'utilisateur souhaite maintenant réserver une salle. Il faut donc une table reservation dans la base de donnée. On décide de crée un numéro unique pour chaque réservation, (un peu comme quand tu reçois une facture, elle a un numéro unique), on peut la mets en cléf primaire en auto_increment. Mais on veut savoir pour qui est cette réservation, plutôt que de rappeler le pseudo de l'utilisateur (qu'il peut changer et se qui créerait des problèmes de cohésion), on enregistre son identifiant, on le met aussi en clefs primaire, car il permet aussi d'une certaine façon d'identifier la réservation (pour ma part je le mettrais en clé secondaire).
INSERT INTO reservation (id_user,salle,duree) VALUES ($id_user,$salle,$duree) #Note qu'il est inutile de mentionner le champ id_reservation, il sera insérer automatiquement
Bon, l'utilisateur souhaite voir les réservation qu'il a déjà pu passer, son id permettra ainsi de remonter toutes ses réservations.
SELECT * FROM reservation WHERE id_user=$id_user
Sache que la liaison entre les tables ne se fait pas toute seule, c'est à toi d'écrire tes requête de façon cohérente (quand tu feras des jointures par exemple, tu verras plus tard aussi les relations entre les tables, pour simplifier quelques requêtes et faire des "liaisons" entre tes tables). C'est pourquoi pour le script les champs id_user de la table utilisateur et reservation sont totalement différent, mais toi tu sais que c'est une relation, et tu les utiliseras de façon à les lier ect (mais sa sera pour uand tu auras déjà compris les bases). Les identifiants id_user sont une manière de coder et de concevoir des bdd, elle font parties des bonnes pratiques mais tu es tout à fait libre de coder comme bon te semble.

1)

2) N'enregistre pas le mdp de l'utilisateur dans une variable session ! tu en as juste besoin au moment de l'authentification de l'utilisateur ! Après l'id de l'utilisateur, et son pseudo suffise, si la variable session est remplies sa veut dire qu'un utilisateur est connecter dans ton cas. En fait tant que la session n'est pas détruite, la variable SESSION garde ses champs même si tu recharge ta page, jet'invite là aussi à voir la doc http://php.net/manual/fr/book.session.php

Pour une variable SESSION comme les autres variables globales comme GET ou POST. Si tu as enregistrer l'id de l'utilisateur dans $_SESSION['id_user'] = $resultat['id_user']; (ou resultat est le résultat de ta requete lors de la connexion de ton utlisateur et qque tu récupère son id), tu récupère la variable de la même façon que n'importe quel autre variable, imaginons dans une requete : 'SELECT * FROM reservation WHERE id_user="'.$_SESSION['id_user'].'" '

Pour ta question je t'ai un peu perdu dans tes propos ^^ Explique point par point se que tu veux faire, par exemple: 1) l'utilsateur fait ça, 2) le bouton se met à jour ...)....

3) auto_increment c'est seulement pour les nombres, tu as mis un char (caractère) il faut que tu mettes un int ! (renseigne toi un peu sur les types) et retire cet auto_increment sur ton champ id_user de ta table reservation !!! :O Sinon il n'y as plus cohésion, c'est comme si tu créais un nouvel utilisateur à chaque réservation ^^

Le primarey key, en auto_increment permet d'indexer ta table, c'est pas forcément utile dans certains cas, mais se donne ente autre l'odre d'enregistrement par exemple ^^

4) - Pas de problème ;)
- Le champ id, pas besoin d'y toucher sa se fera tout seul sur ta table, tu auras certainement déjà quelques réponses à ce sujet si tu as lu le début de ma réponse :P
-Ta valeur id ne se trouve que dans la table A, les autres dis toi que ce sont des références à la valeur de la table A !
- En fait le problème c'est qu'il faudrait que tu prennes un peu de recul, que tu te repose et que tu ré attaques ton programme une fois que tu es au clair, un bon conseil: quand tu bloques et même avant de coder, prends une feuille et fait des dessins récapitulatif et les principaux objectifs de ton programme. Liste y quelques solutions auxquels tu as pensés, le détail de la procédure, tout ce que l'utilisateur doit faire par exemple pour valider quelque chose, élabore ton algorithme, il faut que tu comprennes la démarche qui va suivre et que ton programme va exécuter. ça et le débogage sont pour moi les principaux points de la programmation. Avec ses acquis, coder n'est plus un problème. (La doc t'aide , on ne peut pas tout savoir par cœur non plus ! ;) )

Il n'y as pas à être désolé :wink: la programmation c'est aussi de la douleur :P