Quand faire demarrer la session

Mammouth du PHP | 686 Messages

01 nov. 2008, 12:35

Bonjour,
je créé un site de commande en ligne et je voudrais savoir si il m'est possible de definir la session qu'a partir de la page panier.php lorsq'un article est ajouté
<?php
session_start();
include("connect.php");
@MYSQL_CONNECT($serveur,$utilisateur,$mdp) or die ("Connexion impossible");
@MYSQL_SELECT_DB($db) or die ("Connexion à la base $base impossible");
if(!isset($_SESSION['commande'])){
$_SESSION['commande'] = array(); 
/* Subdivision du panier */ 
$_SESSION['commande']['id'] = array(); 
$sql = mysql_query("SELECT * FROM numero ORDER BY numero DESC LIMIT 0,1");
while($result=mysql_fetch_array($sql)){
$id = $result['numero'];
$nouvel_id = $id + 1;
array_push($_SESSION['commande']['id'],$nouvel_id);
mysql_query("UPDATE `numero` SET `numero` = '$nouvel_id' WHERE `numero` = '$id' LIMIT 1") ;
}
$nom = $_SESSION['commande']['id'][0];
mysql_query("CREATE TABLE `$nom` (`id` INT NOT NULL AUTO_INCREMENT ,`ref` TEXT NOT NULL ,`nom` TEXT NOT NULL ,`quantite` TEXT NOT NULL ,`prix` TEXT NOT NULL ,PRIMARY KEY ( `id` ) 
) TYPE = MYISAM");
}
?>
et mettre sur toutes les autres pages, y compris la page d'accueil juste
session_start();
pour ne pas qu'une nouvelle table soit créée et qu'elle ne serve a rien si le visiteur ne commande pas lors de sa visite
Merci d'avance

Eléphant du PHP | 419 Messages

01 nov. 2008, 13:32

J'aurais une petite question, pourquoi tu met @ devant
@MYSQL_CONNECT($serveur,$utilisateur,$mdp) or die ("Connexion impossible");
@MYSQL_SELECT_DB($db) or die ("Connexion à la base $base impossible"); 
??

Mammouth du PHP | 686 Messages

01 nov. 2008, 13:54

euh oui je sais qu'ils servent a rien, d'ailleurs je vais les enlever car s'il y a une erreur il me semble que si il y a un @ ca evite qu'il retoune l'erreur non ?

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

01 nov. 2008, 14:53

Tout à fait, l'opérateur de silence "@" indique à php de ne pas signaler les erreurs de la fonction à laquelle il s'applique. A ne pas utiliser pendant les phases de débugage, voire à ne pas utiliser tout court, dans la mesure où il suffit simplement de coder correctement pour éviter les messages d'erreur ;)

Et pour répondre à ta question initiale, la session n'a besoin d'être démarrer que lorsque tu as besoin d'y accéder (pour y ajouter ou y lire des données). En gros tu peux effectivement n'y faire appel que dans les scripts où l'utilisateur remplira ou consultera son pannier.

Maintenant ouvrir une session n'a pas de grosses conséquences, à part créer un fichier temporaire de session par connexion/visiteur. Et en règle général quand on passe commande en ligne, on aime bien savoir ce qu'il y a dans notre caddie (ne serait-ce que le nombre d'éléments) même si l'on continu à visiter le site. Mais pour connaitre le contenu du pannier ou le nombre d'élément, il faut bien accéder à la session, donc l'avoir démarré.

A toi de voir ensuite ce que tu préfères faire, mais en effet, tant que tu ne fais pas appel à $_SESSION, un session_start() est inutile

Par contre je ne comprends pas du tout ta partie création de table... tu crées quand même pas dynamiquement une table par commande ? :shock: Faut faire une ou deux tables pour tes commandes (une principale avec les infos liés à la commande : date, prix, etc. et une avec le détail de la commande) et ajouter des enregistrements dedans uniquement lorsque l'utilisateur valide ses achat. C'est tout l'intérêt de la session : garder les informations en mémoire d'une page à l'autre et de ne les stocker qu'à la validation finale ou de les laisser se perdre si l'utilisateur s'en va sans finaliser :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 686 Messages

01 nov. 2008, 15:22

d'accord.
Pour répondre à ta question eh bien .... je vais me faire tirer les oreilles je le sent ... oui je cree une table pour chaque commande qui est ensuite supprimée dès validation de la commande,
parce que pour les array(); et les session j'ai un peu de mal même avec le tuto

Eléphant du PHP | 419 Messages

01 nov. 2008, 17:27

Pour les arrays, je te comprends mais pour les sessions, c'est plutot simple...
Ce sont des variables qui ne se suppriment jamais.. ( du moins lorsque tu es sur le site ) donc tu peux les transmettre à toutes les autres pages.

Merci pour l'information avec le "@" je ne savais pas!

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

01 nov. 2008, 18:29

Gargl.... bon et ben on va commencer par le commencement hein :)

Un array c'est litérrallement un tableau, c'est à dire un ensemble de cases dans lesquelles on va pouvoir ranger des choses, un peu comme un placard. Dans le premier placard, tu vas mettre des livres, dans le deuxième des serviettes, dans le 3ème des cd. Concrêtement ça donne ceci :
$placard = array ($livre, $serviette, $cd);
Si jamais tu as besoin de regarder ce qui est dans le 1er et 3ème placard, il suffit de le demander ainsi :
echo $placard[0]; // bon alors le premier en info, c'est le 0, me demande pas pourquoi ;)
echo $placard[2]; // et du coup, ben le 3ème c'est le 2 !
C'est un tableau indéxé.

Bon alors dès fois, on a tout plein de placard et on veut pas forcément compter à chaque fois pour retrouver celui qui nous interesse, alors on leur donne des p'tits noms :
$placard = array (
  "bouquins" => $livre, 
  "torchons" => $serviette, 
  "disques" => $cd)
;
Du coup, quand on veut les retrouver, on les appelle directement par leur nom
echo $placard['torchons']; // me renvoi $serviette
Et ça, c'est un tableau associatif.

Sauf que dans mon placard à torchons, j'ai des serviettes, mais j'ai aussi des nappes et des torchons, qui sont chacun sur une étagère différente. De même pour mes disques, j'ai séparé le classique du hip-hop parce que c'était quand même plus commode. J'ai donc maintenant des placards avec des étagères :
$placard = array (
  "torchons" => array ($serviette, $nappe, $torchon)
  "disques" => array ( "classique" => $cd, "hip-hop" => $cd)
);
Et pour pouvoir écouter le dernier tube de Mozart je vais aller chercher :
echo $placard["disques"]["classique"]; 
Et c'est ce que l'on appelle un tableau à plusieurs dimensions, ici 2, mais je peux ensuite séparer mes Mozart de mes Beethoven, les symphonies des menuets, etc.

====== End of part ouaneuh =====

====== Part touh =====

Bon, maintenant que les tableaux n'ont plus de secrets pour toi, z'yeutons voir du côté des sessions :)

Quand tu surfes sur un site, tu passes d'une page à une autre sans te poser de questions. Les pages sont totalement indépendantes et chacune vie sa vie comme elle l'entend. Mais parfois il faut que deux pages communiquent. Pour cela, la première envoi des données à la seconde, via l'url (en GET) ou un formulaire (en POST). Mais pour que la 3ème soit au courrant, il faut que la 2ème lui fasse suivre, et ainsi de suite, même cette andouille d'internaute décide de revenir à la première entre temps. C'est là que les sessions interviennent.

Le but de la session, c'est de stocker en mémoire sur le serveur les données de chaque utilisateur, dont tes différentes pages peuvent avoir besoin. Ainsi elles interrogent directement le serveur, le mettent à jour au besoin, et se prennent pas la tête à essayer d'informer les pages 1 et 3, elles n'auront qu'à venir chercher l'info là où elle est ! :)

L'autre intérêt, c'est que la session a une durée de vie limitée. C'est à dire que si au bout de x minute elle n'a pas été sollicitée bah le serveur la dégage manu militari, à grand coup de pied aux fesses (enfin au niveau informatique quand même, mais l'idée est là ;))

Dans ton cas, la session te permet donc de stocker en mémoire sur le serveur toutes les données relatives au surf et aux commandes de tes visiteurs, sans avoir à les consigner physiquement dans une base de données. Du coup si l'utilisateur s'en va sans valider, la session expire et ça s'arrête là, pas besoin de venir faire du ménage derrière lui. Par contre s'il valide, à ce moment là tu vas enregistrer les infos en base, pour ne surtout pas les perdre (nan parce que quand même il a payé, ca serait dommage que le serveur botte le train de sa commande ;))

D'un point de vue technique, à chaque fois qu'une page à besoin de lire ou d'écrire dans la session, tu vas faire un appel à session_start() au début de ta page pour ouvrir la session, et à la variable $_SESSION pour y stocker les données dont tu as besoin. Ah ! Et bonne nouvelle, $_SESSION, c'est rien de plus qu'un array(), donc un placard, et les placards n'ont pas de secret pour toi ;)
$_SESSION["caddie"][] = array (
  "article" => "serviette", 
  "quantite" => 8,
  "couleur" => "mauve à rayures vertes et à poids jaunes",
  ...
);
En espérant que tu y vois désormais plus clair sur les tableaux, les sessions et éventuellement la façon de gérer tes commandes :)

Ps : et bravo à ceux qui auront poursuivi la lecture jusqu'ici !
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 686 Messages

02 nov. 2008, 00:33

merci beaucoup Ryle, j'avoue que c'es texpliqué très ludiquement et ca permet de bien comprendre pour ceux ki sont pas trop aidés !!
merci !