vérifier l'existence de "liens croisés".

VaN
Mammouth du PHP | 1107 Messages

16 avr. 2010, 18:06

Encore un problème, me dira stealth35 :p

Voici la situation :

Un tableau HTML, crée à l'aide d'une boucle PHP sur des entités.

Chaque ligne du tableau représente une structure, extraite de la table ci-dessous :
CREATE TABLE IF NOT EXISTS `jes` (
  `je_id` smallint(6) NOT NULL AUTO_INCREMENT,
  `je_nom` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`je_id`),
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=241 ;
Sur chacune de ces lignes, j'ai un champ texte qui va me permettre de lier des auditeurs à cette structure. Une fois qu'au moins 1 auditeur a été choisi pour une structure donnée, un audit est crée pour cette structure. Voici la table des audits :
CREATE TABLE IF NOT EXISTS `audits` (
  `audit_id` int(11) NOT NULL AUTO_INCREMENT,
  `audit_je_id` int(11) NOT NULL,
  `audit_session_id` int(11) NOT NULL,
  PRIMARY KEY (`audit_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
Les auditeurs sont des utilisateurs classiques, dont voici la table :
CREATE TABLE IF NOT EXISTS `users` (
  `user_id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `user_prenom` varchar(50) DEFAULT NULL,
  `user_nom` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=794 ;
Chaque utilisateur est également lié à une ou plusieurs structures, par une table de postes qu'il occupe :
CREATE TABLE IF NOT EXISTS `cnje_postes` (
  `poste_id` int(11) NOT NULL AUTO_INCREMENT,
  `poste_user_id` int(11) NOT NULL,
  `poste_je_id` int(11) NOT NULL,
  `poste_statut` tinyint(1) NOT NULL,
  PRIMARY KEY (`poste_id`),
  KEY `poste_user_id` (`poste_user_id`),
  KEY `poste_je_id` (`poste_je_id`),
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=765 ;
Et pour faire le lien entre un audit et un auditeur, une table de liaison :
CREATE TABLE IF NOT EXISTS `liaisons_audits_auditeurs` (
  `laa_id` int(11) NOT NULL AUTO_INCREMENT,
  `laa_audit_id` int(11) NOT NULL,
  `laa_auditeur_id` int(11) NOT NULL,
  PRIMARY KEY (`laa_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
Attention : les liaisons entre utilisateurs/structures via le poste, et utilisateurs/structures via l'audit n'ont rien à voir.
Le poste indique si un utilisateur appartient à telle structure.
L'audit représente une visite dans une structure, à laquelle on lie des visiteurs (auditeurs).


Donc lorsque je génère mon tableau HTML de structures, je peux récupérer une liste des auditeurs liés à cette structure.

Mon problème est le suivant :

J'aimerai savoir si dans mon tableau HTML, il y a des "audits croisés". Si pour un auditeur (A1) faisant une visite dans une structure (S2), y a t-il des membres (donc des utilisateurs ayant au moins un poste) de S2 étant auditeur (A2) d'une structure à laquelle appartient A1 (donc qui possède un poste chez A1).

Un exemple concret sous forme de tableau :

Soit un utilisateur U1, qui possède un poste dans la structure S1.
Soit un utilisateur U2, qui possède un poste dans la structure S2.
Soit un utilisateur U3, qui possède un poste dans la structure S3.

On lie U2 et U3 à l'audit de la structure S1. U2 et U3 sont donc des auditeurs, appelés A2 et A3.
On lie U1 à l'audit de la structure S2. U1 est donc un auditeur, appelé A1.

J'aimerai mettre en évidence ce cas là, car il devrait être interdit par l'application :
- Soit A2 n'a pas le droit d'être auditeur de S1, car A1 est membre de S1 et audite déjà A2 (structure à laquelle appartient A2)
- Soit A1 n'a pas le droit d'être auditeur de S2, car A2 est membre de S2 et audite déjà A1 (structure à laquelle appartient A1)

Structures | Auditeurs
S1 | A2, A3
S 2 | A1

J'ai donc tenté une requête comme ça :
$audits_croises = get_value_from_query(sprintf("SELECT COUNT(poste_user_id) 
FROM ".$tables["junior_entreprises"].", ".$tables["postes"]." POSTES_AUDITEUR, ".$tables["postes"]." POSTES_TARGETS, ".$tables["liaisons_audits_auditeurs"]." 
WHERE POSTES_TARGETS.poste_je_id = '%d' AND POSTES_AUDITEUR.poste_je_id = audit_je_id AND audit_id = laa_audit_id AND laa_auditeur_id = POSTES_TARGETS.poste_user_id", $auditeur["user_id"]));

if($audits_croises > 0) {
// attention, cas interdit
}
qui donne ça :
SELECT COUNT(POSTES_TARGETS.poste_user_id) FROM cnje_junior_entreprises, cnje_postes POSTES_AUDITEUR, cnje_postes POSTES_TARGETS, cnje_liaisons_audits_auditeurs, cnje_audits WHERE POSTES_TARGETS.poste_je_id = '146' AND POSTES_AUDITEUR.poste_je_id = audit_je_id AND audit_id = laa_audit_id AND laa_auditeur_id = POSTES_TARGETS.poste_user_id
Mais cela me renvoie 0, alors que je suis bien dans un cas interdit. Un peu d'aide sur cette requête ne serait donc pas de refus : )

J'espère avoir été suffisamment clair dans la description de mon problème.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 avr. 2010, 15:50

J'espère avoir été suffisamment clair dans la description de mon problème.
Le message est parfait mais je l'ai lu deux fois à deux jours d'intervalle et les deux fois j'ai eu mal à la tête.

Peut-on avoir de quoi créer les tables, et quelques lignes de données pour un cas interdit ? Tout ça en SQL pour le créer vite fait :)

Edit: tu as essayé ta requête directement dans MySQL ? Pas d'erreur ? Déjà je trouve bizarre que tu utilises 5 tables et qu'il n'y ait que 3 jointures.

Je ne retrouve pas les tables que tu nous as citées dans ta requête. Et est-ce que ça ne serait pas plus clair en utilisant JOIN plutôt qu'en mixant filtre et jointures dans le WHERE ?
SELECT COUNT(POSTES_TARGETS.poste_user_id) 
FROM cnje_junior_entreprises
INNER JOIN cnje_postes POSTES_AUDITEUR ON POSTES_AUDITEUR.poste_je_id = audit_je_id 
INNER JOIN cnje_liaisons_audits_auditeurs laa
INNER JOIN cnje_postes POSTES_TARGETS ON laa_auditeur_id = POSTES_TARGETS.poste_user_id
INNER JOIN cnje_audits a ON a.audit_id = laa.laa_audit_id 
(je n'ai pas réussi à tout recomposer...)

VaN
Mammouth du PHP | 1107 Messages

30 avr. 2010, 18:37

CREATE TABLE IF NOT EXISTS `cnje_audits` (
`audit_id` int(11) NOT NULL AUTO_INCREMENT,
`audit_je_id` int(11) NOT NULL,
`audit_session_id` int(11) NOT NULL,
`audit_debut` date NOT NULL,
`audit_fin` date NOT NULL,
`audit_date` date NOT NULL,
`audit_date_decision_date` date NOT NULL,
`audit_pregrille_orga` varchar(100) NOT NULL,
`audit_pregrille_orga_date` date NOT NULL,
`audit_pregrille_treso` varchar(100) NOT NULL,
`audit_pregrille_treso_date` date NOT NULL,
`audit_grille_orga` varchar(100) NOT NULL,
`audit_grille_orga_date` date NOT NULL,
`audit_grille_treso` varchar(100) NOT NULL,
`audit_grille_treso_date` date NOT NULL,
`audit_CR_admin` varchar(100) NOT NULL,
`audit_CR_admin_date` date NOT NULL,
`audit_CR_debrief` varchar(100) NOT NULL,
`audit_CR_debrief_date` date NOT NULL,
`audit_decision` tinyint(4) NOT NULL,
`audit_decision_date` date NOT NULL,
`audit_CDC` varchar(100) NOT NULL,
`audit_courrier` varchar(100) NOT NULL,
`audit_courrier_date` date NOT NULL,
`audit_etape` tinyint(4) NOT NULL,
`audit_statut` tinyint(4) NOT NULL,
PRIMARY KEY (`audit_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=147 ;

--
-- Contenu de la table `cnje_audits`
--

INSERT INTO `cnje_audits` (`audit_id`, `audit_je_id`, `audit_session_id`, `audit_debut`, `audit_fin`, `audit_date`, `audit_date_decision_date`, `audit_pregrille_orga`, `audit_pregrille_orga_date`, `audit_pregrille_treso`, `audit_pregrille_treso_date`, `audit_grille_orga`, `audit_grille_orga_date`, `audit_grille_treso`, `audit_grille_treso_date`, `audit_CR_admin`, `audit_CR_admin_date`, `audit_CR_debrief`, `audit_CR_debrief_date`, `audit_decision`, `audit_decision_date`, `audit_CDC`, `audit_courrier`, `audit_courrier_date`, `audit_etape`, `audit_statut`) VALUES
(96, 137, 1, '2009-12-17', '2010-01-16', '0000-00-00', '0000-00-00', '', '0000-00-00', '', '0000-00-00', '', '0000-00-00', '', '0000-00-00', '', '0000-00-00', '', '0000-00-00', 0, '0000-00-00', '', '', '0000-00-00', 1, 0),
(103, 157, 1, '2009-12-17', '2010-01-16', '2010-07-30', '2010-04-30', 'pregrille_orga_103_20100430123211.xml', '2010-04-30', 'pregrille_treso_103_20100430123211.xml', '2010-04-30', 'grille_orga_103_20100430123236.xml', '2010-04-30', 'grille_treso_103_20100430123435.xml', '2010-04-30', '', '0000-00-00', '', '0000-00-00', 2, '2010-04-29', '', 'courrier_103_20100430124051.pdf', '2010-04-30', 3, 0),


--
-- Structure de la table `cnje_junior_entreprises`
--

CREATE TABLE IF NOT EXISTS `cnje_junior_entreprises` (
`je_id` smallint(6) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`je_id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=246 ;

--
-- Contenu de la table `cnje_junior_entreprises`
--

INSERT INTO `cnje_junior_entreprises` (`je_id`) VALUES

(53),
(113),
(137),
(157),

-- --------------------------------------------------------

--
-- Structure de la table `cnje_liaisons_audits_auditeurs`
--

CREATE TABLE IF NOT EXISTS `cnje_liaisons_audits_auditeurs` (
`laa_id` int(11) NOT NULL AUTO_INCREMENT,
`laa_audit_id` int(11) NOT NULL,
`laa_auditeur_id` int(11) NOT NULL,
PRIMARY KEY (`laa_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

--
-- Contenu de la table `cnje_liaisons_audits_auditeurs`
--

INSERT INTO `cnje_liaisons_audits_auditeurs` (`laa_id`, `laa_audit_id`, `laa_auditeur_id`, `laa_prix_billets`, `laa_grille_orga`, `laa_grille_orga_date`, `laa_grille_treso`, `laa_grille_treso_date`, `laa_CR`, `laa_CR_date`) VALUES
(2, 103, 417, 0, '', '0000-00-00', '', '0000-00-00', '', '0000-00-00'),
(4, 96, 2, 0, '', '0000-00-00', '', '0000-00-00', '', '0000-00-00');

-- --------------------------------------------------------

CREATE TABLE IF NOT EXISTS `cnje_postes` (
`poste_id` int(11) NOT NULL AUTO_INCREMENT,
`poste_user_id` int(11) NOT NULL,
`poste_session_type` tinyint(1) NOT NULL,
`poste_je_id` int(11) NOT NULL,
`poste_debut` date NOT NULL,
`poste_fin` date NOT NULL,
`poste_statut` tinyint(1) NOT NULL,
PRIMARY KEY (`poste_id`),
KEY `poste_user_id` (`poste_user_id`),
KEY `poste_session_type` (`poste_session_type`),
KEY `poste_je_id` (`poste_je_id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=765 ;

--
-- Contenu de la table `cnje_postes`
--

INSERT INTO `cnje_postes` (`poste_id`, `poste_user_id`, `poste_session_type`, `poste_je_id`, `poste_debut`, `poste_fin`, `poste_niveau_id`, `poste_pole_id`, `poste_type_id`, `poste_titre`, `poste_statut`) VALUES
(2, 2, 1, 1, '2010-02-01', '2010-04-30', 3, 19, 44, 'Prestataire Kiwi', 1),
(149, 146, 2, 53, '2009-12-24', '2010-12-23', 2, 1, 2, 'Vice-Président', 1),
(150, 146, 2, 53, '2009-12-24', '2010-12-23', 1, 8, 19, 'Chargée d''affaires', 1),
(322, 342, 2, 113, '2010-01-01', '2011-01-01', 3, 4, 11, 'chargé de projet qualité', 1),
(380, 417, 2, 137, '2010-01-15', '2011-01-15', 3, 19, 43, 'Responsable SI', 1),
(762, 2, 2, 157, '2010-04-01', '0000-00-00', 2, 1, 1, 'Président', 1);

--
-- Structure de la table `cnje_users`
--

CREATE TABLE IF NOT EXISTS `cnje_users` (
`user_id` mediumint(9) NOT NULL AUTO_INCREMENT,
`user_mail` varchar(100) DEFAULT NULL,
`user_password` varchar(50) DEFAULT NULL,
`user_new_mail` varchar(100) DEFAULT NULL,
`user_new_mail_key` varchar(10) DEFAULT NULL,
`user_new_password` varchar(50) DEFAULT NULL,
`user_new_password_key` varchar(10) DEFAULT NULL,
`user_cle_activation` varchar(10) DEFAULT NULL,
`user_datetime` datetime NOT NULL,
`user_civilite` tinyint(4) DEFAULT NULL,
`user_prenom` varchar(50) DEFAULT NULL,
`user_nom` varchar(50) DEFAULT NULL,
`user_naissance` date DEFAULT NULL,
`user_telephone` varchar(20) DEFAULT NULL,
`user_mobile` varchar(20) DEFAULT NULL,
`user_adresse_1` varchar(100) DEFAULT NULL,
`user_adresse_2` varchar(100) DEFAULT NULL,
`user_code_postal` varchar(10) DEFAULT NULL,
`user_ville` varchar(100) DEFAULT NULL,
`user_pays` smallint(6) DEFAULT NULL,
`user_photo` varchar(50) DEFAULT NULL,
`user_cv` varchar(50) DEFAULT NULL,
`user_newsletters` tinyint(1) DEFAULT NULL,
`user_statut` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=794 ;

--
-- Contenu de la table `cnje_users`
--

INSERT INTO `cnje_users` (`user_id`, `user_mail`, `user_password`, `user_new_mail`, `user_new_mail_key`, `user_new_password`, `user_new_password_key`, `user_cle_activation`, `user_datetime`, `user_civilite`, `user_prenom`, `user_nom`, `user_naissance`, `user_telephone`, `user_mobile`, `user_adresse_1`, `user_adresse_2`, `user_code_postal`, `user_ville`, `user_pays`, `user_photo`, `user_cv`, `user_newsletters`, `user_statut`) VALUES
(2, '[email protected]', '40f6b99491e4bc3fe36b1c73022ed73b', NULL, NULL, '40f6b99491e4bc3fe36b1c73022ed73b', 'zDhW6E8v', 'oqJKZCsI0b', '2010-03-12 20:05:53', 1, 'prenom', 'NOM', '2010-03-29', '01.48.74.24.81', '06.22.28.62.79', '5 rue de Maubeuge', '4ème étage', '75009', 'paris', 77, '2_20100312200553.jpg', 'cv_2_20100312201236.pdf', 1, 1),
(417, '[email protected]', 'e19a815d2eb4b6e928c2a2fa8710f1c7', NULL, NULL, NULL, NULL, 'epeFh1wSd3', '0000-00-00 00:00:00', 1, 'prenom2', 'NOM2', '0000-00-00', '', '', '', '', '', '', 77, NULL, NULL, 1, 0),
(342, '[email protected]', 'b30f172d16a82fd45c17c6d3d4b87673', NULL, NULL, 'b30f172d16a82fd45c17c6d3d4b87673', 'm5XTcugI', 'JkEn9txkQR', '2010-03-14 13:26:18', 1, 'Prénom3', 'NOM3', '0000-00-00', '', '', '', '', '', '', 77, NULL, 'cv_342_20100314144941.pdf', 1, 1),
(146, '[email protected]', '14ce635ecc1163106ee3aacde217dae1', NULL, NULL, '14ce635ecc1163106ee3aacde217dae1', 'NSQgbYUR', 'YuZ16ImKjV', '2010-03-13 14:44:38', 3, 'Prénom4', 'NOM4', '1989-11-10', '', '', '', '', '', 'Paris', 77, '146_20100313144438.jpg', 'cv_146_20100313144849.pdf', 1, 1);
Voilà une requête qui devrait te permettre de créer les 5 tables nécessaires, ainsi que quelques données, qui créent un cas interdit.

Le cas interdit est le suivant :
L'utilisateur user_id = 417 de la table cnje_users est auditeur sur audit_id = 103 de la tables cnje_audits, car la liaison entre ces deux ID existe dans la table liaisons_audits_auditeurs.
De même, l'utilisareur user_id = 2 est auditeur sur audit_id = 96.

Or, l'audit_id 103 touche la je_id = 157, à laquelle appartient le user_id 2 (via la table cnje_postes, qui permet de lier un cnje_user avec une cnje_junior_entreprises.
Et l'audit_id 96 touche la je_id 137, à laquelle appartient le user_id 417.

Il s'agit donc d'un audit croisé : on audit pas la structure de l’une des personnes qui fait l’audit de notre structure.

Mon script PHP se présente comme ceci :
<?php
$tables["users"] 												= $config["db_prefixe"]."users";
$tables["junior_entreprises"] 									= $config["db_prefixe"]."junior_entreprises";
$tables["audits"] 												= $config["db_prefixe"]."audits";
$tables["postes"] 												= $config["db_prefixe"]."postes";
$tables["liaisons_audits_auditeurs"] 							= $config["db_prefixe"]."liaisons_audits_auditeurs";

function get_array_from_query($sql, $debug = false) {
	if($debug === true) echo "<p>".$sql."<p>";
	
	$query = mysql_query($sql) or die(mysql_error());
	$data = array();
	while($result = mysql_fetch_assoc($query)) {
		$data[] = $result;
	}
	return $data;
}


$audits = get_array_from_query(sprintf("SELECT audit_id, je_id
FROM ".$tables["audits"].", ".$tables["junior_entreprises"]." 
WHERE audit_je_id = je_id AND audit_statut = 0 AND audit_session_id = '%d'
ORDER BY je_nid", $audits_session["session_id"]));

foreach($audits as $audit) {
										
	$auditeurs_actuels = get_array_from_query(sprintf("SELECT user_id, CONCAT_WS(' ', user_prenom, user_nom) AS auditeur FROM ".$tables["users"].", ".$tables["audits"].", ".$tables["liaisons_audits_auditeurs"]." WHERE audit_session_id = '%d' AND audit_je_id = '%d' AND laa_auditeur_id = user_id AND laa_audit_id = audit_id", $audits_session["session_id"], $audit["je_id"]));

	########################################
	## GESTION DES ERREURS DE REPARTITION ##
	########################################

	//////////////////////////////////////////////////////////////
	// Erreur 2 : Pas d'audit croisé							// A FINIR 
	//////////////////////////////////////////////////////////////
	foreach($auditeurs_actuels as $auditeur) {
		/*
		$audits_croises = get_value_from_query(sprintf("SELECT COUNT(POSTES_TARGETS.poste_user_id) 
		FROM ".$tables["junior_entreprises"].", ".$tables["postes"]." POSTES_AUDITEUR, ".$tables["postes"]." POSTES_TARGETS, ".$tables["liaisons_audits_auditeurs"].", ".$tables["audits"]." 
		WHERE POSTES_TARGETS.poste_je_id = '%d' AND POSTES_AUDITEUR.poste_je_id = audit_je_id AND audit_id = laa_audit_id AND laa_auditeur_id = POSTES_TARGETS.poste_user_id", $auditeur["user_id"]));
		*/
		
		// ICI, la requête qui devrait compter le nombre d'audit croisé pour l'auditeur en cours.
		
		if($audits_croises > 0) {
			// Il existe un audit croisé pour cet auditeur
		}
	}

}
?>
A priori, ça devrait te permettre de faire un test réel.

VaN
Mammouth du PHP | 1107 Messages

30 avr. 2010, 19:04

Bon pour info, j'ai réussi à faire ce que je voulais, mais ce n'est pas vraiment propre comme méthode :
// On récupère les membres de la JE de l'audit en cours
$postes_je = get_field_array_from_query(sprintf("SELECT poste_user_id FROM ".$tables["postes"]." WHERE poste_je_id = '%d'", $audit["je_id"]));
										
foreach($auditeurs_actuels as $auditeur) {
											
	// On va chercher les membres qui auditent les JEs de l'auditeur en cours
	$cross_auditeurs = get_array_from_query(sprintf("SELECT laa_auditeur_id, user_id, CONCAT_WS(' ', user_prenom, user_nom) as auditeur FROM ".$tables["postes"].", ".$tables["audits"].", ".$tables["liaisons_audits_auditeurs"].", ".$tables["users"]." WHERE poste_user_id = '%d' AND poste_je_id = audit_je_id AND audit_id = laa_audit_id AND laa_auditeur_id = user_id", $auditeur["user_id"]));
											
	if(!empty($cross_auditeurs) && in_array($cross_auditeurs[0]["user_id"], $postes_je)) {
		$class = " class=\"audit_warning\"";
		$audit_warning = "Pas d'audit croisé.<br />Problème sur auditeur #".$auditeur["user_id"]." : ".$auditeur["auditeur"];
	}
}
En gros, pour chaque audit, je récupère les membres de la structure concernée. Puis sur chaque auditeur de cet audit, je vais chercher les auditeurs qui auditent la structure à laquelle il est liée. Puis je fais un in_array, pour retrouver l'id de ces auditeurs dans le tableau des membres de la structure de l'audit.

Assez bof non ?

Il me reste maintenant un "cas interdit" à mettre en surbrillance.

Voici une nouvelle table, qui entre en compte :
CREATE TABLE IF NOT EXISTS `cnje_auditeurs` (
`auditeur_id` int(11) NOT NULL AUTO_INCREMENT,
`auditeur_user_id` int(11) NOT NULL,
`auditeur_type` tinyint(4) NOT NULL,
`auditeur_wefa_date` date NOT NULL,
`auditeur_statut` tinyint(1) NOT NULL,
PRIMARY KEY (`auditeur_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

--
-- Contenu de la table `cnje_auditeurs`
--

INSERT INTO `cnje_auditeurs` (`auditeur_id`, `auditeur_user_id`, `auditeur_type`, `auditeur_wefa_date`, `auditeur_statut`) VALUES
(1, 2, 1, '2010-04-29', 1),
(2, 417, 1, '2010-04-29', 1),
(3, 342, 2, '2010-04-29', 1),
(4, 146, 1, '2010-04-29', 1);
Le dernier cas interdit que je dois traiter est : Pas d’audits du même type (champ auditeur_type de la table ci_dessus) 2 fois de suite de la même Junior par des auditeurs issus de la même Junior.

Et là, je sèche encore plus que pour le précédent : /

ViPHP
ViPHP | 5462 Messages

04 mai 2010, 10:28

j'arrive pas a installer ta base chez moi :?