aide pour petit bout de code ! variables tableau ?

Eléphant du PHP | 73 Messages

03 mai 2011, 16:32

Bonjour,

Etant en partie débutant en PHP, j'ai une petite question à propos d'une chose que je n'arrive pas à faire (du moins je ne sais pas "comment" aborder la chose, il y a plusieurs façons de faire).

pour faire simple : j'ai une page web, avec des données que je récupère d'une base MySQL.

par exemple j'ai une table avec les champs "NOM" et "U". pour le champ "U" :

ces données sont de la forme : UXXUXX (par exemple U16U18, ou encore U02U07)

nb : je pourrais aussi changer la forme des données par exemple en XX-XX (02-07 par ex) si les U posent problème.

exemple de ma base :

Code : Tout sélectionner

nom01 U01U07 nom02 U14U18 nomNN UXXUXX
ce que je désire faire :
j'aimerais afficher un tableau HTML de 42 lignes (chaque ligne représentant 1 U) dans l'ordre décroissant, et remplir ces lignes automatiquement suivant les champs "U" trouvés dans la base. (j'arrive déjà à afficher ce tableau avec une simple boucle FOR sans soucis, le problème n'est pas de l'afficher, mais de le remplir !)

je m'explique : par exemple, nom02 qui va de U14 à U18 (compris), alors j'aimerais que chaque case (u14, u15, u16, u17, u18) par exemple se remplisse avec "nom02" (ou couleur de la case etc.. bref, du html simple)


j'ai plusieurs techniques pour faire ceci, mais certaines me parraissent assez "sales", et je me demandais s'il ne serait pas plus simple de demander vos avis ici :)

j'imagine que le moyen le plus propre serait de faire une sorte de tableau PHP (variable tableau de 42 de taille), que je remplirais dans un premier temps avec une boucle sur la requette mysql, qui ferait un parsing des données en UxxUxx et remplirait le tableau PHP automatiquement. puis une fois le tableau PHP fait et "trié", alors je pourrais faire une boucle pour mon tableau HTML et remplir les champs ? (et laissez par exemple en "empty" les cases non remplies).

seulement.. je ne vois pas trop comment faire ce genre de manips, si quelqu'un pouvait m'éclairer.

en espérant avoir été clair.

si vous ne comprenez pas vraiment, je peux vous expliquer en "détail" mon projet, ça serait peut-être plus simple (je cherche à générer des schémas de racks 42U automatiquement à partir d'un champ dans ma base de données serveurs dans lequel je renseigne l'emplacement du serveur dans le rack)


vous en remerciant par avance

amicalement

Mammouth du PHP | 672 Messages

03 mai 2011, 16:47

j'imagine que le moyen le plus propre serait de faire une sorte de tableau PHP
Non.
Le moyen le plus prore ce serait d'avoir un schéma de BDD correct.
Genre :
MaTable (Nom, U) (
(nom01, U01),
(nom01, U07)
)
(Et vu le principe, je ferais même dans l'autre sens : (U, NomServeur) )
Parce que là, il va falloir bidouiller, alors qu'une table bien faite rendrait les choses très simples.

Questions :
- un U est occupé par un et un seul serveur (je suppose que les noms correspondent à des noms de serveurs) ?
- tu as toujours la forme UxxUxx (ou ça peut être Ux, Uxxx) ?
Si oui, ce que je ferais :
Récupération des données de la table.
Pour chaque Nom :
$Tableau [ substr (U, 0, 3) ] = Nom
$Tableau [substr (U, 3, 3) ] = Nom

Au final :
$Tableau[U01] = nom01
$Tableau[U02] = ...

Eléphant du PHP | 73 Messages

03 mai 2011, 16:55

bonjour,

merci pour ta réponse rapide

et malheureusement non, un serveur peut prendre 1, 2, 4, etc.. U

le même serveur peut prendre plusieurs U

par exemple :

serveur 1 - U01 à U04 (il prend les 4 premiers U)
serveur 2 - U05 à U05 (lui ne fait qu'1 seul U)
serveur 3 - U06 à U07 (lui prend 2 U)
etc.. jusqu'à 42 (sachant qu'il y a également des emplacements libres à gérer)

voilà mon état actuel des choses

par exemple, je lance une requette sur tous les serveurs du rack "Y", ça me donne la même chose que ci-dessus (par exemple 4 serveurs, de 4-6u, 12-14, 31-34, et 36-36, tout le reste dans ce rack est de l'espace libre)

pour rentrer plus en détails, j'ai une base "serveurs" avec plein de champs comme :

nom, ip, dns, etat du ping, rack, etc.. et j'ai donc rajouté un champ "emplacement dans le rack" ou je cherche une méthode correcte justement pour définir son emplacement (ça peut être UxxUxx comme n'importe quelle autre, tant que ça reste logique).

mais ce n'est peut-être pas la bonne solution de schéma BDD en effet, peut-être y-at'il un autre moyen de faire mieux.. je vais relire ton message en détail, quoi qu'il en soit, je dois gérer différentes choses (dont ces emplacements pouvant prendre plusieurs U, c'est d'ailleurs le cas dans 80% des cas, mes serveurs prennent entre 2 et 4 U)

ps : ma "seconde méthode" *sale* dont je parlais consistait justement à la limite à créer des tables des racks directement dans la base de données (je sais pas trop sous quel schéma mais bref, ça reste à voir, mais un peu comme ce que tu explique, avec U01, U02, U03 etc.), et modifier mon code PHP pour updater directement cette table de rack lorsqu'une entrée est ajoutée/modifiée/retirée sur le panneau d'administration. mais j'aurais préférer générer ces schémas "à la volée" en PHP comme je souhaite le faire actuellement, simplement en récupérant les variables UxxUxx et en remplissant mon tableau html à l'aide des infos de ces variables, je trouve cela plus propre.. (mais plus complexe pour moi qui ne connait rien aux variables tableau php :p)

Eléphant du PHP | 73 Messages

03 mai 2011, 17:14

mmh je viens de relire ton message à tête reposée, j'avais peut-être mal compris.

en fait tu souhaiterais que par exemple, je crée une table "racks" un peu comme ça :

- serveur01 (4U, de 01 à 04)
- serveur02 (3U, de 10 à 12)
- serveur03 (1U, le 08)

qui donne un truc du genre :

Code : Tout sélectionner

U nom U01 serveur01 U02 serveur01 U03 serveur01 U04 serveur01 U05 U06 U07 U08 serveur03 U09 U10 serveur02 U11 serveur02 U12 serveur02 ... etc.
?

ça pourrait en effet le faire, mais je trouve ça un peu "crade" si je puis dire (ça m'oblige à créer plusieurs tables de racks, avec 42 entrées dans chaque), et à modifier mon code d'ajout/suppression/modification de serveur pour écrire dans ces tables etc. et ça risque d'être galère pour gérer l'affichage (car je dois colorier certaines cases suivant le type d'OS etc.; et tous ces champs sont dans ma base serveurs, donc il faudra un petit paquets de liens etc.)

mmh je vais y réfléchir..

Eléphant du PHP | 73 Messages

04 mai 2011, 08:43

Si oui, ce que je ferais :
Récupération des données de la table.
Pour chaque Nom :
$Tableau [ substr (U, 0, 3) ] = Nom
$Tableau [substr (U, 3, 3) ] = Nom

Au final :
$Tableau[U01] = nom01
$Tableau[U02] = ...
merci pour ce "trick" mais n'y connaissant rien en tableau, peux-tu me donner une marche à suivre un peu plus complète ?

voici le petit bout de code actuel que j'essaye de faire :

$query_principale = 'SELECT server_name, baie_loc FROM inv_serveurs, inv_baie, inv_lieu WHERE inv_serveurs.baie_id = inv_baie.baie_id AND inv_baie.server_location = inv_lieu.server_location AND inv_serveurs.baie_id = "'.$rack_id.'" ORDER BY inv_serveurs.baie_loc ASC';
$req_query_principale = mysql_query($query_principale);

	while($row = mysql_fetch_assoc($req_query_principale))
	{
		$unumb  = $row['baie_loc'];		// on récupère le champ U (UXXUXX)
		//  $Ustart = substr($unumb, 0, 2) 	// commenté (pour debug)
		//  $Uend   = substr($unumb, 4, 5)	// commenté (pour debug)
		$tableau[substr($unumb, 0, 3)] = $row['server_name'];
		$tableau[substr($unumb, 3, 3)] = $row['server_name'];
		
		// reste à faire 
	}

et voici mon "ex code" ou il y a juste la génération d'un tableau à 42 cases que je dois remplir avec les bons champs (je pense qu'il faut garder les deux, et remplir ce tableau avec les champs que je récupère dans la boucle d'avant ?
$cab_name = 'SELECT baie_name FROM inv_baie WHERE baie_id = "'.$rack_id.'"';
$req_cab_query = mysql_query($cab_name);
$result_cab_query = mysql_result($req_cab_query, 0);

	echo '<br><br>';
	echo '<table border="1" cellpadding="2" cellspacing="1" width="300">';
	echo '<tr bgcolor="#26618d" class="category">';
	echo '<td colspan="2"><font color="#ffffff">Cab '.$result_cab_query.'</font></td>';
	echo '</tr>';
	echo '<tr>';
	echo '<td bgcolor="#dddddd">';

	for ($CabDraw = 42; $CabDraw >= 1; $CabDraw-- ) {

		echo '<tr height="'.$UHeight.'">';

		echo '<td align="left" width="10">'.$CabDraw.'</td>';
		echo '<td align="center">NOM DE SERVEUR A METTRE</td>';

		echo '</tr>';

	}	

	echo '</td>';
	echo '</tr>';
	echo '</table>';
voilà, merci encore

Eléphant du PHP | 73 Messages

05 mai 2011, 09:21

une petite aide svp ? :(

Mammouth du PHP | 672 Messages

05 mai 2011, 09:50

ça pourrait en effet le faire, mais je trouve ça un peu "crade" si je puis dire (ça m'oblige à créer plusieurs tables de racks, avec 42 entrées dans chaque), et à modifier mon code d'ajout/suppression/modification de serveur pour écrire dans ces tables etc. et ça risque d'être galère pour gérer l'affichage (car je dois colorier certaines cases suivant le type d'OS etc.; et tous ces champs sont dans ma base serveurs, donc il faudra un petit paquets de liens etc.)
Pourquoi plusieurs tables de Racks ?

Tu utilises une Base de données Relationnelle. Ce qui veut dire qu'il faut étudier les relations entre tes éléments. L'analyse que je te propose n'est qu'une des possibilités, il faut voir suivant la logique globale...

Tu as des serveurs, des racks et des baies.
Relations :
- Un serveur peut être mis sur une ou plusieurs unités, et une unité contient un unique serveur (ou aucun ?).
- Un rack contient une ou plusieurs unités, et une unité est forcément sur un rack.
=> Des relations de ce type se traduisent dans ta base par (avec * = clé primaire et # = clé étrangère) :
Une table Serveurs (ID_serveur *, Nom, os, <autres infos>)
Une table Racks(ID_rack *, <autres infos>) (si tu as besoin d'informations propres au rack, sinon tu peux t'en passer...)
Une table Unites(ID_unite *, ID_rack #, ID_serveur #, emplacement, <autres infos>)

Ce que tu veux, c'est avoir une table par baie, qui liste les racks, les serveurs qu'ils contiennent et l'OS installé sur ces serveurs (plus peut-être d'autres infos).
SELECT U.ID_unite, U.ID_rack, U.ID_serveur, S.os FROM UNITE U, SERVEURS S
WHERE U.ID_rack = <numero du rack> AND U.ID_serveur = S.ID_serveur
Te retourne la liste des unités du rack demandé, et pour chaque unité le serveur et l'OS installé.

Eléphant du PHP | 73 Messages

05 mai 2011, 11:55

bon j'ai résolu mon soucis tout seul (je lis ton message dans 1 minute, merci pour la réponse)

c'est pas encore tip top, mais voici pour info le code qui m'a permis de faire ce que je désire (sans design) :
// -----------------------------------------------------------
// DESSIN DU RACK - TABLE PRINCIPALE QUAND LE RACK EST CHOISI
// -----------------------------------------------------------

if (isset($_GET['rackid'])) { 
$rack_id = $_GET['rackid'] ;

// on choppe le nom du rack

	$cab_name = 'SELECT baie_name FROM inv_baie WHERE baie_id = "'.$rack_id.'"';
	$req_cab_query = mysql_query($cab_name);
	$result_cab_query = mysql_result($req_cab_query, 0);

// on dessine la table html pour ce rack

	echo '<br><br>';
	echo '<table border="1" cellpadding="2" cellspacing="1" width="300">';
	echo '<tr bgcolor="#26618d" class="category">';
	echo '<td colspan="2"><font color="#ffffff">Cab '.$result_cab_query.'</font></td>';
	echo '</tr>';

// on definit un tableau vide de 42 lignes (42 U)

$array = array();
for($i=42; $i>=0; $i--){
	$array[] = $i;
}


// on passe a la generation du rack (query pour les entrées de la base sur ce rack)

$query_principale = 'SELECT server_name, baie_loc FROM inv_serveurs, inv_baie, inv_lieu WHERE inv_serveurs.baie_id = inv_baie.baie_id AND inv_baie.server_location = inv_lieu.server_location AND inv_serveurs.baie_id = "'.$rack_id.'" ORDER BY inv_serveurs.baie_loc ASC';
$req_query_principale = mysql_query($query_principale);

	while($row = mysql_fetch_assoc($req_query_principale))
	{
		$unumb  = $row['baie_loc'];		// on récupère le champ U
		$uname  = $row['server_name'];	                // on récupère le nom du serveur
		$Ustart = substr($unumb, 1, 2); 	                // on récupère le U de départ
		$Uend   = substr($unumb, 4, 5);	                // on récupère le U d'arrivée

		// on vire le 0 en debut de U
		if (preg_match('/^0/', $Ustart)) {
		$Ustart = str_replace("0","",$Ustart);
		} 

		// boucle pour ajouter chaque U dans le tableau
		for ($u=$Ustart; $u<=$Uend; $u++) {
		 $array[$u] = "$uname";
		}
		
	}

	// on dessine les lignes remplies 

	for ($i=42; $i>=0; $i--) {
	 echo '<tr>';
	  echo '<td>'.$i.'</td>';
	  if (strlen($array[$i]) == "2" || strlen($array[$i]) == "1") {
	  echo '<td>&nbsp;</td>';
	  } else {
	  echo '<td>'.$array[$i].'</td>';
	  }
	 echo '</tr>';
	}



// fin du tableau html

	echo '</table>'

}



?>

Eléphant du PHP | 73 Messages

05 mai 2011, 12:04

macgawel : merci pour les infos sur la bdd relationelle. j'en ai grandement besoin

ma base est déjà "en partie" relationelle, mais je ne suis pas un gros connaisseur, donc je ne connaissait que les "clefs primaires" (pas étrangères, je vais regarder ça de plus prêt), j'ai des relations dans ma table, mais elles sont "manuelles" comme tu peux le voir dans mes requettes SQL.

par exemple, actuellement j'ai (chez moi "rack" signifie armoire/baie en fait) :

une table serveurs (id_server, nom_server, autres champs, baie_loc, rack_id) -> table comprenant les serveurs
une table racks (rack_id, rack_name, location_id) -> table comprenant les racks/armoires
une table location (location_id, location_name) -> table comprenant les différents sites

actuellement, dans mes requettes, je fais les relations manuellemenent avec "rack_id de la table serveur correspond à rack_id de la table racks"
et "location_id de la table racks correspond à location_id de la table location"

si tu vois le truc. (car je ne connais que cette technique.. je dois trouver des tutoriaux pour apprendre un peu mieux les bases relationelles :p)

je vais regarder comment fonctionne ce principe de clefs étrangères, merci pour l'info !