Page 1 sur 1

Calcul dans bdd

Posté : 22 août 2012, 00:55
par seb59210
Bonjour,
tout merci pour toute aide que vous pourrait m'apporter.
Je suis en train de créer une page php permettant de visualiser combien de page sont imprimés chaque semaines.

Ma bdd est organisé comme suit : (table printer)
week | p1 | p2 | result | count
34 10 25 35 20
33 5 10 15 15

Donc en gros, le script récupère le numéro de semaine, le compteur total des imprimantes 1 et 2 puis insère le résultat dans result,
en soustrayant le chiffre result par le result de la semaine précédente, nous obtenons le nombre de page imprimées entre les deux semaines.

Voici mon code php :

Code : Tout sélectionner

<html> <head> <title> SNMP GET </title> </head> <body> <?php echo "Konica 1<br>"; $snmp_a4_p1 = snmpget("xx.xx.xx.xx", "public", "1.3.6.1.4.1.18334.1.1.1.5.7.2.4.1.5.1.3"); $snmp_a4_p1 = substr($snmp_a4_p1,8); $week = strftime("%U") ; echo "Total A4 = $snmp_a4_p1<br>"; $bdd = new PDO('mysql:host=localhost;dbname=green', 'root', ''); echo "Konica 2<br>"; $snmp_a4_p2 = snmpget("xx.xx.xx.xx", "public", "1.3.6.1.4.1.18334.1.1.1.5.7.2.4.1.5.1.3"); $snmp_a4_p2 = substr($snmp_a4_p2,8); $week = strftime("%U") ; $resultat = ($snmp_a4_p1 + $snmp_a4_p2); echo "Total A4 = $snmp_a4_p2<br>"; $req = $bdd->prepare('INSERT INTO printer (week, p1, p2, result) VALUES(:week, :p1, :p2, :result)'); $req->execute(array( 'week' => $week, 'p1' => $snmp_a4_p1, 'p2' => $snmp_a4_p2, 'result' => $resultat )); ?> </body> </html>
Ma question est donc, comment faire cette fameuse soustraction en utilisant le champ de la semaine d'avant. (J'avais pensé à prendre la variable week -1 afin de savoir sur quel ligne récupérer la valeur mais je ne trouve pas comment la mettre en variable php pour pouvoir faire la soustraction avec la variable resultat). Mais je n'y arrive pas...
Auriez-vous une autre idée ?

Merci d'avance pour toute aide ou renseignement,
Séb

Re: Calcul dans bdd

Posté : 22 août 2012, 06:49
par xTG
Il faut faire une requête de sélection avec comme condition week - 1 pour récupérer les valeurs souhaitées, faire le calcul puis l'insertion.

Re: Calcul dans bdd

Posté : 22 août 2012, 09:05
par Mazarini
Bonjour,

Je ne comprends pas comment tu gères tes numéros de semaine, en particulier le changement d'année. Ca me pose problème pour connaitre la semaine précédente.

Re: Calcul dans bdd

Posté : 22 août 2012, 09:26
par seb59210
Bonjour Mazarini,
En effet je n'avais pas du tout pensé à cette problématique... (ne pas frappez).
Comment est-il préférable de procéder ? Un champs année à part ou mettre dans le champ week le numéro de semaine suivi du numéro d'année ( par exemple 342012 ).

En tout cas merci beaucoup pour ton aide.

Re: Calcul dans bdd

Posté : 22 août 2012, 09:57
par Mazarini
Pour un problème de ce type, je choisirai une date. Par exemple le dimanche ou le lundi de la semaine (mais toujours le même).

La semaine précédente serait alors la date - 7 jours ce qui simplifie le problème : DATE_ADD('2006-05-00',INTERVAL 7 DAY)
(la flemme de chercher comment on enlève 7 jour)

Tu peux alors faire une jointure sur la table avec elle même en rapprochant les dates.

Re: Calcul dans bdd

Posté : 22 août 2012, 10:36
par seb59210
Salut xTG : En fait je ne sais pas comment faire pour récupérer la valeur du select pour la transmettre dans une variable et ensuite effectuer les actions de soustractions.

Code : Tout sélectionner

$week_ant = ($week - 1); $req1="SELECT * FROM printer WHERE week='".$week_ant."' "; $resultat = mysql_query($req1); echo "<CAPTION> Tableau !! </CAPTION>"; echo "<table border='1'>"; echo "<tr><th>Week</th><th>P1</th><th>P2</th><th>Total</th><th>Compteur</th></tr>"; while ($ligne = mysql_fetch_row($resultat)) { echo "<tr><td>$ligne[0]</td><td>$ligne[1]</td><td>$ligne[2]</td><td>$ligne[3]</td><td>$ligne[4]</td></tr>"; } echo "</table>";
Me montre bien les valeurs de la table mais je ne sais pas comment récupérer la valeur de result et l'attribuer à une variable $result

Mazarini:
Je pense garder le champ week avec le numéro de semaine et y rajouter un champ année, puisque ensuite je dois créer un histogramme et les numéro de semaine seront en abscisse.
Merci à vous

Re: Calcul dans bdd

Posté : 22 août 2012, 10:43
par xTG
$ligne[0] n'est-elle pas déjà une variable ? :)

Re: Calcul dans bdd

Posté : 22 août 2012, 11:21
par seb59210
Et bien, j'ai essayé avec un

Code : Tout sélectionner

echo "Total A4 = $ligne[0]<br>";
Mais, il ne m'affiche pas la variable. :-)

Re: Calcul dans bdd

Posté : 22 août 2012, 11:57
par Mazarini
Les arrays dans les chaines de caractères posent des problèmes

echo "Total A4 = ${ligne[0]}<br>";
ou
echo 'Total A4 = ',$ligne[0],'<br>';

Re: Calcul dans bdd

Posté : 27 août 2012, 09:22
par seb59210
Salut les gars,
It works !
Merci Mazarini pour l'infos sur les arrays je la tient précieusement sous le coude.
J'ai amélioré la bdd, puisque mon soucis était de selectionner la dernière entrée un champs mélangeant année+numéro de semaine n'aurait pas marché puisque la première semaine de l'an 2013 aurait donné 201301-1= 201300 et non 201252. J'utilise donc un champs id en auto increment et dans la requête je sélectionne la valeur la plus haute.

Bref, voici les champs:
id | | year | week | p1 | p2 | result | count
Et le code php pour ceux qui auraient besoin :

Code : Tout sélectionner

<html> <head> <title> SNMP GET </title> </head> <body> <?php // Recup des infos Printer 1 $snmp_a4_p1 = snmpget("xxx.xxx.xxx.xxx", "public", "1.3.6.1.4.1.18334.1.1.1.5.7.2.4.1.5.1.3"); $snmp_a4_p1 = substr($snmp_a4_p1,8); // Recup des infos Printer 2 $snmp_a4_p2 = snmpget("xxx.xxx.xxx.xxx", "public", "1.3.6.1.4.1.18334.1.1.1.5.7.2.4.1.5.1.3"); $snmp_a4_p2 = substr($snmp_a4_p2,8); $result = ($snmp_a4_p1 + $snmp_a4_p2); $year = strftime("%Y") ; $week = strftime("%U") ; $week_ant = ($week - 1); $connect = mysql_connect("localhost","root",""); mysql_select_db("green", $connect); $req = "SELECT * FROM printer WHERE id = (SELECT MAX(id) FROM printer)"; $resultat = mysql_query($req); echo "<CAPTION> Derni&egrave;re ligne </CAPTION>"; echo "<table border='1'>"; echo "<tr><th>id_Week</th><th>Year</th><th>Week</th><th>P1</th><th>P2</th><th>Total</th><th>Compteur</th></tr>"; while ($ligne = mysql_fetch_row($resultat)) { echo "<tr><td>$ligne[0]</td><td>$ligne[1]</td><td>$ligne[2]</td><td>$ligne[3]</td><td>$ligne[4]</td><td>$ligne[5]</td><td>$ligne[6]</td></tr>"; $result_old = ($ligne[5]); } echo "</table>"; $count = ($result - $result_old); echo "P1: $snmp_a4_p1<br>"; echo "P2: $snmp_a4_p2<br>"; echo "Week: $week<br>"; echo "Year: $year<br>"; echo "Week_Ant: $week_ant<br>"; echo "Total P1 + P1: $result<br>"; echo "Ancien Total: $result_old<br>"; echo "Compteur: $count<br>"; echo "Les infos sont dans la base !"; $bdd = new PDO('mysql:host=localhost;dbname=green', 'root', ''); $req = $bdd->prepare('INSERT INTO printer (year, week, p1, p2, result, count) VALUES(:year, :week, :p1, :p2, :result, :count)'); $req->execute(array( 'year' => $year, 'week' => $week, 'p1' => $snmp_a4_p1, 'p2' => $snmp_a4_p2, 'result' => $result, 'count' => $count )); ?> </body> </html>
Merci beaucoup pour votre aide
Et à très bientôt sur le site (je dois encore créer les stats... :-) )

Re: [RESOLU] Calcul dans bdd

Posté : 27 août 2012, 15:04
par moogli
salut,


question bête que se passe t'il le jour où tu ajout une (ou plusieurs imprimante ?)

tu devrais regarder un tuto sur la modélisation d'une base de donnée (par exemple sur le modèle entité - association de merise) afin de faire un truc carré qui ne te posera pas de soucis :)



@+

Re: [RESOLU] Calcul dans bdd

Posté : 27 août 2012, 19:06
par seb59210
Salut moogli,
comme indiqué dans mon premier post, le script additionne les compteurs des imprimantes p1 et p2 donc si je dois rajouter une nouvelle imprimante, bah il faut juste ajouter le champs p3 et l'inclure dans l'addition. Une autre question ? (je plaisante hein)

Yes, j'ai eu une heure de Modélisation de BDD mais pour une petite base comme celle-ci j'ai pas voulu trop m'embéter :-)

Re: [RESOLU] Calcul dans bdd

Posté : 27 août 2012, 19:18
par moogli
mais pour une petite base comme celle-ci j'ai pas voulu trop m'embéter :-)
ça commence petit, mais quand tu arrive sur ce type de projet qui finit avec 74 tables, dont certaine avec plus 400 champs, sans aucune relation tu fait moins le malin :)


@+