J'ai des données qui se "corrompent"

Eléphant du PHP | 139 Messages

18 déc. 2008, 00:27

Bonsoir,

J'ai des données qui se "corrompent" à l'enregistrement dans la bd (mysql).

Structure de la bd (en bref)
une table user
une table session (pour enregistrer les sessions :-))))
une table menu de la semaine.

Je propose à chaque user un menu à la semaine. J'utilise un formulaire menu de la semaine pour enregistrer les données dans la table.
Lorsque j'ouvre une session de mon site, et que je valide le menu, je n'ai aucun souci.

Voici comment je procède (pour arriver à générer le problème):

Lorsque je souhaite proposer 2 menus de la semaine pour le même user et pour des semaines différentes, j'ouvre deux sessions en même temps (je faisais des essais :-))).
Je valide et enregistre l'un après l'autre les formulaires du menu de la semaine sur chaque session et là ça coince. L'un des menus est correctement enregistré, mais l'autre menu est enregistré avec une erreur de l'identifiant du user qui est à 0.

Je pense à un problème de file d'attente pour l'enregistrement dans la bd, mais je ny crois pas vraiment.

Je souhaiterais garder la possibilité d'ouvrir plusieurs sessions en même temps par l'administrateur (le cuisinier).

Pouvez-vous m'éclairer (j'espère à ce propos avoir été clair dans les explications).
Merci

Mammouth du PHP | 1339 Messages

18 déc. 2008, 02:12

Envoie les structure des tables retournées par PHPMyAdmin.
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Eléphant du PHP | 139 Messages

19 déc. 2008, 01:27

Je ne suis certain que les tables soient en cause.
Mais, comme je ne suis sûr de rien, toute les options sont ouvertes...
Ci-joints les tables

[code]
-- Structure de la table `sessions`
--

CREATE TABLE `sessions` (
`id` varchar(32) collate latin1_general_ci NOT NULL,
`access` int(10) unsigned default NULL,
`data` text collate latin1_general_ci,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

-- Structure de la table `user`
--

CREATE TABLE `user` (
`Id_user` int(11) NOT NULL auto_increment,
`Nom_user` varchar(30) collate latin1_general_ci NOT NULL default '',
`Prenom_user` varchar(30) collate latin1_general_ci NOT NULL default '',
`Login_user` varchar(15) collate latin1_general_ci NOT NULL,
`Pass_user` text collate latin1_general_ci NOT NULL,
`Email_user` text collate latin1_general_ci NOT NULL,
PRIMARY KEY (`Id_user`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=25 ;

-- Structure de la table `programme_menu`
--

CREATE TABLE `programme_menu` (
`Id_prog_menu` int(11) NOT NULL auto_increment,
`Id_user` int(11) NOT NULL default '0',
`Jour_semaine` varchar(10) collate latin1_general_ci NOT NULL default '',
`Date_prog_prop` date NOT NULL default '0000-00-00',
`Menu` text collate latin1_general_ci,
`Commentaire` text collate latin1_general_ci,
PRIMARY KEY (`Id_prog_menu`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=680 ;
[/code][/img]

Mammouth du PHP | 1339 Messages

19 déc. 2008, 01:31

Un question ...

A quoi sert la table "Session".

En gros dans ta table menu tu stock l'id_user, la liste du menu et la semaine.

Apres quand un user s'identifie tu compare son id et le numero de semaine poure recuperer la liste du menu.

L'url est en ligne ?
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Eléphant du PHP | 139 Messages

19 déc. 2008, 02:26

La table session, ben,:
- bonne pratique sécuritaire pour éviter le vol de sessions.
- gestion des connectés (par ex: lors d'une éventuelle maintenance bd ).
- possibilité de faire une connexion exclusive (que je n'ai pas envie de faire pour l'instant)
- et sûrement d'autres atouts...

[quote]
Apres quand un user s'identifie tu compare son id et le numero de semaine poure recuperer la liste du menu.
[/quote]
Oui

[quote]
L'url est en ligne ?
[/quote]
Non, je récupère les variable via une méthode post (variable globale <form method="post" action="<?php $_SERVER['PHP_SELF'];?>">).

Mammouth du PHP | 1339 Messages

19 déc. 2008, 03:42

je voulais dire est ce que l'on peut voir le script !
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Eléphant du PHP | 139 Messages

19 déc. 2008, 14:18

Pas de problème, c'est un script que j'ai repris du site developpez.com
Mais, je ne pense pas que cela a un rapport avec la mise en bd des sessions, car j'avais le même problème, lorsque je n'utilisait pas de bd pour stocker les sessions et que cela se faisait par cookie via le répertoire temp.

[code]
<?php
session_set_save_handler('_open','_close','_read','_write','_destroy','_clean');
//connection a la base de donnees
function _open(){
global $_sess_db;
if ($_sess_db = mysql_connect('127.0.0.1', 'root', '')) {
return mysql_select_db('ma_base', $_sess_db);
}
return FALSE;
}
//deconnexion de la base de donnees
function _close(){
global $_sess_db;
return mysql_close($_sess_db);
}
//verifie si l'id session du user connecté correspond a l'id session enregistré
function _read($id){
global $_sess_db;
$id = mysql_real_escape_string($id);
$sql = "SELECT data FROM sessions WHERE id = '$id'";
if ($result = mysql_query($sql, $_sess_db)) {
if (mysql_num_rows($result)) {
$record = mysql_fetch_assoc($result);
return $record['data'];
}
}
return '';
}
function _write($id, $data){
global $_sess_db;
$access = time();
$id = mysql_real_escape_string($id);
$access = mysql_real_escape_string($access);
$data = mysql_real_escape_string($data);
$sql = "REPLACE INTO sessions VALUES ('$id', '$access', '$data')";
return mysql_query($sql, $_sess_db);
}
function _destroy($id){
global $_sess_db;
$id = mysql_real_escape_string($id);
$sql = "DELETE FROM sessions WHERE id = '$id'";
return mysql_query($sql, $_sess_db);
}
function _clean($max){
global $_sess_db;
$old = time() - $max;
$old = mysql_real_escape_string($old);
$sql = "DELETE FROM sessions WHERE access < '$old'";
return mysql_query($sql, $_sess_db);
}
?>
[/code]

Eléphant du PHP | 139 Messages

04 janv. 2009, 03:13

Désolé de vous avoir dérangé pour rien, mais le problème vient de la session. les variables de sessions sont "écrasées" d'un enregistrement à l'autre...
Merci de votre aide.