[php] verschillende data uit strings halen *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • nzyme
  • Registratie: November 2001
  • Laatst online: 29-07 15:47
Het verhaal is deze:
ik laat een aangepast progje data schrijven naar een php file.
De data is een regel met daarop een ip en verschillende cijfers die traffic voorstellen.
De lijst met ips is NIET vooraf bekend en moet on-the-fly gemaakt worden, m.a.w. vandaag is het nog 5ips en morgen zijn het er 7 en volgende week 25.
De hoeveelheid data die erop een regel is (dus wat er aan data per ip is) is WEL een vaste waarde.

Deze code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$table = "##Total/76.9M/38.4M/38.4M/76.8M/90.2K/0/190.4K/0/0
#192.168.168.11/38.4M/15.9M/22.5M/38.4M/30.4K/0/95.2K/0/0
#192.168.168.12/38.4M/22.5M/15.9M/38.4M/4.7K/0/95.2K/0/0
#192.168.168.1/25.1K/25.1K/0/0/25.1K/0/0/0/0
#192.168.168.255/15.3K/15.3K/0/0/15.3K/0/0/0/0
#192.168.168.14/7.9K/811/7.1K/1.6K/6.3K/0/0/0/0
#192.168.168.2/6.6K/0/6.6K/0/6.6K/0/0/0/0
#192.168.168.15/1.9K/0/1.9K/0/1.9K/0/0/0/0
";

list($ip0, $ip00, $ip1, $ip2, $ip3, $ip4, $ip5, $ip6, $ip7, $ip8) = split('[#]', $table);

list($ip, $total, $received, $send, $tcp, $udp, $icmp, $http, $ftp, $p2p) = split('\\[/\]', $ip1);
list($ip, $total, $received, $send, $tcp, $udp, $icmp, $http, $ftp, $p2p) = split('\\[/\]', $ip2);


Voor 1 regel kan ik het wel, maar hoe moet ik het voorelkaar krijgen met meerdere vooraf onbekende ips?? en de namen moeten gelijk blijven van de vars binnen een list

Ik gok dat ik een array moet maken, maar de voorbeelden op php.net doen niet wat ik wil. Een foreach bij die ips gebruiken lijkt me ook een oplossing misschien?

vergeef me als het niet duidelijk is en dit is echt GEEN script request. Ik ben ff een duwtje in de goede richting nodig :)

| Hardcore - Terror |


Acties:
  • 0 Henk 'm!

  • JER00N
  • Registratie: Maart 2002
  • Niet online
Ik neem aan dat die var $table telkens verandert?
Wat je dan kan doen, is mbv explode("\n", $table) deze var in stukken hakken, zodat alle regels in een array worden gezet.

Acties:
  • 0 Henk 'm!

Verwijderd

bestand inlezen met file() en dan met loop-je er doorheen, en elke regel splitsen op '/'? Als dat bestand niet te veel regels gaat bevatten (+/-10K), dan kan dat prima.

//edit
ik zie nu pas dat je de data weg laat wegschrijven in het php script. Waarom doe je dat? Is het niet handiger om daar een apart data bestand voor te gebruiken wat los staat van je script?

[ Voor 40% gewijzigd door Verwijderd op 17-02-2004 19:56 ]


Acties:
  • 0 Henk 'm!

  • nzyme
  • Registratie: November 2001
  • Laatst online: 29-07 15:47
ik heb dus 1 regel met daarop alle info:
code:
1
2
3
4
5
6
7
8
9
$table = "#Total/76.9M/38.4M/38.4M/76.8M/90.2K/0/190.4K/0/0
#192.168.168.11/38.4M/15.9M/22.5M/38.4M/30.4K/0/95.2K/0/0
#192.168.168.12/38.4M/22.5M/15.9M/38.4M/4.7K/0/95.2K/0/0
#192.168.168.1/25.1K/25.1K/0/0/25.1K/0/0/0/0
#192.168.168.255/15.3K/15.3K/0/0/15.3K/0/0/0/0
#192.168.168.14/7.9K/811/7.1K/1.6K/6.3K/0/0/0/0
#192.168.168.2/6.6K/0/6.6K/0/6.6K/0/0/0/0
#192.168.168.15/1.9K/0/1.9K/0/1.9K/0/0/0/0
";


als splitter is eerst het '#' teken van belang en daarna moet er per uitkomst van de vorige split een tweede split gemaakt worden met het '/' teken.

Alles blijft in dit bestand omdat ik van C al helemaal nix weet (en daarmee ben ik in staat dit bestand te creeren)

| Hardcore - Terror |


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Je kunt meerdere malen splitsen, je splitst dus, de array die je dan krijgt doorloop je en ieder element splits je weer. Het splitsen kun je het beste met explode doen.

Acties:
  • 0 Henk 'm!

  • nzyme
  • Registratie: November 2001
  • Laatst online: 29-07 15:47
Dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?PHP
$table = "#Total/76.9M/38.4M/38.4M/76.8M/90.2K/0/190.4K/0/0
#192.168.168.11/38.4M/15.9M/22.5M/38.4M/30.4K/0/95.2K/0/0
#192.168.168.12/38.4M/22.5M/15.9M/38.4M/4.7K/0/95.2K/0/0
#192.168.168.1/25.1K/25.1K/0/0/25.1K/0/0/0/0
#192.168.168.255/15.3K/15.3K/0/0/15.3K/0/0/0/0
#192.168.168.14/7.9K/811/7.1K/1.6K/6.3K/0/0/0/0
#192.168.168.2/6.6K/0/6.6K/0/6.6K/0/0/0/0
#192.168.168.15/1.9K/0/1.9K/0/1.9K/0/0/0/0
";

$result_ips = explode('#', $table);
print"$result_ips[1]<br>";
print"$result_ips[2]<br>";

$result_traf = explode('/', $result_ips[1]);
print"$result_traf[1]<br>";
print"$result_traf[2]<br>";
?>

Geeft deze output:
code:
1
2
3
4
Total/76.9M/38.4M/38.4M/76.8M/90.2K/0/190.4K/0/0 
192.168.168.11/38.4M/15.9M/22.5M/38.4M/30.4K/0/95.2K/0/0 
76.9M
38.4M


En dat is geloof ik wat ik wil :D

Alleen hoe laat ik het tellen van de ips dynamisch ge-output krijgen??

ik bedoel: nu vertel ik in de code dat ie
code:
1
2
print"$result_ips[1]<br>";
print"$result_ips[2]<br>";

dit laat zien. Kan dit niet automatisch? Dus dat ik een regel code heb die dr voor gaat zorgen dat automatisch voor ieder ip een nieuwe regel komt?

[ Voor 24% gewijzigd door nzyme op 17-02-2004 22:07 ]

| Hardcore - Terror |


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Weet je wat ook leuk is:
PHP:
1
2
3
4
5
<?PHP
echo '<pre>';
print_r($result_traf);
echo '</pre>';
?>

[ Voor 31% gewijzigd door djluc op 17-02-2004 22:06 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Eerst explode je op alle #jes, dan neem de de eerste en explode je in een total array, de opvolgende explode je in een andere array (3D Array meen ik), dan kan je het uitlezen dmv b.v. een foreach.

ik ben er vanuit gegeaan dat er wel enters in zitten (in de string).
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$table = "#Total/76.9M/38.4M/38.4M/76.8M/90.2K/0/190.4K/0/0
#192.168.168.11/38.4M/15.9M/22.5M/38.4M/30.4K/0/95.2K/0/0
#192.168.168.12/38.4M/22.5M/15.9M/38.4M/4.7K/0/95.2K/0/0
#192.168.168.1/25.1K/25.1K/0/0/25.1K/0/0/0/0
#192.168.168.255/15.3K/15.3K/0/0/15.3K/0/0/0/0
#192.168.168.14/7.9K/811/7.1K/1.6K/6.3K/0/0/0/0
#192.168.168.2/6.6K/0/6.6K/0/6.6K/0/0/0/0
#192.168.168.15/1.9K/0/1.9K/0/1.9K/0/0/0/0
";

$arr1 = explode ("#",$table);
$ips = array();
for ($i=1; $i<=count($arr1); $i++) {
  $ips_tmp = $ips[$i];
  $ips[] = explode("/", $arr1[$i]);
}


Niet getest, maar ik verwacht dat je zoiets moet doen.

Acties:
  • 0 Henk 'm!

  • nzyme
  • Registratie: November 2001
  • Laatst online: 29-07 15:47
En hoe krijg ik daar een result te zien, een print"text"; ofzo?

aha:
code:
1
print"$arr1[2]";


geeft dit:
code:
1
192.168.168.11/38.4M/15.9M/22.5M/38.4M/30.4K/0/95.2K/0/0


ok, en hoe nu verder zodat ik niet die 2 hoef in te vullen maar zodat i alles laat zien ?
Dus :
code:
1
print"$arr1[1 tot en met 255]";

[ Voor 93% gewijzigd door nzyme op 17-02-2004 22:40 ]

| Hardcore - Terror |


Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
<?php
for ( $i = 1; $i < 256; $i++ )
{
   print $arr1[ $i ];
}
?>


Dan krijg je dus 255 elementen van $arr1 achter elkaar afgedrukt op een regel.
Meer info over de for loop

[ Voor 8% gewijzigd door Verwijderd op 17-02-2004 23:50 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Hellraizer schreef op 17 februari 2004 @ 22:11:
En hoe krijg ik daar een result te zien, een print"text"; ofzo?

aha:
code:
1
print"$arr1[2]";
het mag ook zonder aanhalingtekens, dus als
PHP:
1
print $arr1[2];
geeft dit:
code:
1
192.168.168.11/38.4M/15.9M/22.5M/38.4M/30.4K/0/95.2K/0/0


ok, en hoe nu verder zodat ik niet die 2 hoef in te vullen maar zodat i alles laat zien ?
Dus :
code:
1
print"$arr1[1 tot en met 255]";
je kan ook regel voor regel laten zien, dan kan je zelf nog een layout megeven.
PHP:
1
2
3
foreach ($arr1 as $val) {
  print_r ($val);
}

iedere waarde in $arr1 zal een array zijn met waardes er in (wegens de split op / ). Dit is handig als je dan zoiets doet ipv de print_r:
PHP:
1
echo "vanaf IP ". $val[0] ." is er al ". $val[1] ." via ". $val[2] ."per minut geblaat<br>";

Zo heb je dan van 0 (de 1e waarde) tot de 9 (10e waarde).

Acties:
  • 0 Henk 'm!

Verwijderd

Waarom maak je van de table-var niet gewoon een associatief array met het ip als key?

Lijkt me heel wat netter dan wat je nu aan het doen bent.

Acties:
  • 0 Henk 'm!

  • klokop
  • Registratie: Juli 2001
  • Laatst online: 16-09 19:21

klokop

swiekie swoeng

Ik denk dat laatste tip al wat te ver gaat voor TO...
Mijn uitleg voor de nieuweling:
stop IP's in een array, IP als 'key', data als 'value'
code:
1
2
3
('IP1'=>'data_van_IP1', 
 'IP2'=>'data_van_IP2',
 'IP3'=>'data_van_IP3')

of, nog lastiger, stop de IP's in een array, en de data in een array in die array
code:
1
2
3
('IP1'=>('data1_van_IP1','data2_van_IP1','data2_van_IP1'),
 'IP2'=>('data1_van_IP2','data2_van_IP2','data2_van_IP2'),
 'IP3'=>('data1_van_IP3','data2_van_IP3','data2_van_IP3'))

Snappie?
Lees de handleiding over arrays nog es door. En daarna nog een keer, en daarna nog een keer. Lastige materie.

[ Voor 25% gewijzigd door klokop op 18-02-2004 09:24 ]

"Passing silhouettes of strange illuminated mannequins"


Acties:
  • 0 Henk 'm!

  • nzyme
  • Registratie: November 2001
  • Laatst online: 29-07 15:47
goed, heb ff zitten kloten:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$table = "#Total/76.9M/38.4M/38.4M/76.8M/90.2K/0/190.4K/0/0
#192.168.168.11/38.4M/15.9M/22.5M/38.4M/30.4K/0/95.2K/0/0
#192.168.168.12/38.4M/22.5M/15.9M/38.4M/4.7K/0/95.2K/0/0
#192.168.168.1/25.1K/25.1K/0/0/25.1K/0/0/0/0
#192.168.168.255/15.3K/15.3K/0/0/15.3K/0/0/0/0
#192.168.168.14/7.9K/811/7.1K/1.6K/6.3K/0/0/0/0
#192.168.168.2/6.6K/0/6.6K/0/6.6K/0/0/0/0
#192.168.168.15/1.9K/0/1.9K/0/1.9K/0/0/0/0";


$hoi = explode('#', $table);
for ( $i = 1; $i <=count($hoi); $i++ )
{
   list($ip[], $total[], $received[], $send[]) = explode('/', $hoi[$i]);
   print "$ip[0]";
}

geeft:
code:
1
TotalTotalTotalTotalTotalTotalTotalTotalTotal


Waarom niet gewoon een keer Total maar negen?

Bij $ip[1] geeft i 8x 192.168.168.11
Bij $ip[2] geeft i 7x 192.168.168.12

<---edit--->
code:
1
2
3
4
5
6
7
8
print "<table border=1>";
$hoi = explode('#', $table);
for ( $i = 1; $i <=count($hoi); $i++ )
{
   list($ip[], $total[], $received[], $send[]) = explode('/', $hoi[$i]);
}
print "<tr><td>$ip[0]</td><td>$total[0]</td></tr>";
print "</table>";

en zo lukt het wel. 8)7

<---edit 2--->
en de code voor het weergeven waar het uiteindelijk natuurlijk ook omgaat:
code:
1
2
3
4
5
6
<?
for ( $i = 1; $i <=count($hoi); $i++ )
{
print "<tr><td align=right width=200 bgcolor=>$ip[$i]</td><td align=right width=100>$total[$i]</td><td align=right width=100>$received[$i]</td><td align=right width=100>$send[$i]</td></tr>";
}
?>


_/-\o_ Dank U GoT _/-\o_

[ Voor 50% gewijzigd door nzyme op 18-02-2004 16:27 ]

| Hardcore - Terror |


Acties:
  • 0 Henk 'm!

  • Jorick
  • Registratie: November 2001
  • Laatst online: 20-09 21:18
Het resultaat als ik unset toevoeg:

Total
192.168.168.11
192.168.168.12
192.168.168.1
192.168.168.255
192.168.168.14
192.168.168.2
192.168.168.15

PHP:
1
2
3
4
5
6
for ( $i = 1; $i <=count($hoi); $i++ )
{   
   list($ip[], $total[], $received[], $send[]) = explode('/', $hoi[$i]);
   print $ip[0]."<br>";
   unset($ip, $total, $received, $send);
}

Acties:
  • 0 Henk 'm!

  • Jorick
  • Registratie: November 2001
  • Laatst online: 20-09 21:18
|:( |:(

[ Voor 98% gewijzigd door Jorick op 18-02-2004 20:05 . Reden: duurde ff voordat ik deze fout door had ]


Acties:
  • 0 Henk 'm!

  • nzyme
  • Registratie: November 2001
  • Laatst online: 29-07 15:47
goed, het is nu zo dat het C progje heel mooi de data in $table zet en dat ik deze geweldig kan uitlezen in een tabel die ik zelf gemaakt heb. Echter, de data in $table moet nu naar een ander bestand geschreven worden en uiteindlijk ook daarvandaan gelezen worden.

Het hoofdprogje maakt zn eigen log aan (formaat snap ik de ballen van dus vandaar deze eigen php versie).
Een probleem, na 2 dagen wordt dit log gereset ofzo, iig ben ik steeds alle data kwijt die ouder is dan 2 dagen en de tellers beginnen dus weer overnieuw :(
Vandaar dat ik zelf wil loggen om zo de data zo lang als ik wil te houden.

Alleen hoe?

code:
1
2
3
4
5
6
7
8
$table = "##Total/22193584.0/11088407.0/11105177.0/22131518.0/62066.0/0/350282.0/0/0
#192.168.168.11/11079148.0/7351133.0/3728015.0/11065759.0/13389.0/0/175141.0/0/0
#192.168.168.12/11073039.0/3716696.0/7356343.0/11065759.0/7280.0/0/175141.0/0/0
#192.168.168.2/16770.0/0/16770.0/0/16770.0/0/0/0/0
#192.168.168.255/15763.0/15763.0/0/0/15763.0/0/0/0/0
#192.168.168.1/1024.0/4815.0/0/0/4815.0/0/0/0/0
#192.168.168.14/512.0/0/4049.0/0/4049.0/0/0/0/0
";


alle getallen zijn in bytes, deze nemen steeds maar toe en ineens (wanneer de 2 dagen omzijn) zijn ze weet vanaf de 0 aan het tellen.

De gehele $table moet naar mn eigen log gaan.
code:
1
2
3
4
5
$filename = "./trafdata.txt";
$file = fopen($filename, 'w+b');
$filedata = "$table";
fwrite($file, $filedata);
fclose($file);


en daarna als ik het script draai moeten de gegevens in trafdata.txt geupdate worden aan de hand van de gegevens in $table.

| Hardcore - Terror |


  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Je bedoelt dat de gegevens die in de file staan worden gewijzigd of moeten de gegevens die je daarna in de $table hebt staan worden toegevoegd aan de file (append) (fopen($filename, 'a+b')). In het eerste geval moet je de gegevens uitlezen en in een aparte variabele zetten zodat je de acties die je in je eerste post hebt staan kunt uitvoeren en dan kunt combineren met de nieuwe gegevens.

PHP:
1
2
3
4
5
6
7
for($a=0; $a<=count($hoi); $a++) {
  for($b=0; $b<=count($hoi); $b++) {  //hier de nieuwe gegevens of eerst de nieuwe gegevens toevoegen aan de file
    if ($ip[$a]==$ip[$b]) {  // ip adressen zijn gelijk
       // combineren gegevens
    }
  }
}

Hierbij moet de $hoi de gegevens van de file zijn en $ip heb je dan zelf aangemaakt met de code die je eerder gaf.

edit:

Zit stiekem een bug in de code als je de data alleen uit de file haalt, na de nieuwe gegevens daar te hebben toegevoegd, en daarna in de loop controleert :+

[ Voor 12% gewijzigd door Shadowman op 19-02-2004 18:22 ]


  • nzyme
  • Registratie: November 2001
  • Laatst online: 29-07 15:47
duz.....

ik heb nu deze code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$filename = "./trafdata.txt";
$update = "Wed Feb 18 18:17:47 2004";
$time = date("l F j H:i:s Y");
$start = "NA";
/** ** ** ** The current stats from our C program ** ** ** **/
$table_current = "##Total/2219358.0/11088407.0/11105177.0/22131518.0/62066.0/0/350282.0/0/0
#192.168.168.11/11079148.0/7351133.0/3728015.0/11065759.0/13389.0/0/175141.0/0/0
#192.168.168.12/11073039.0/3716696.0/7356343.0/11065759.0/7280.0/0/175141.0/0/0
#192.168.168.2/16770.0/0/16770.0/0/16770.0/0/0/0/0
#192.168.168.255/15763.0/15763.0/0/0/15763.0/0/0/0/0
#192.168.168.1/1024.0/4815.0/0/0/4815.0/0/0/0/0
#192.168.168.14/512.0/0/4049.0/0/4049.0/0/0/0/0";
$data_current = explode('#', $table_current);
for ( $i = 1; $i <=count($data_current); $i++ ){
list($ip_current[], $total_current[], $received_current[], $send_current[], $tcp_current[], $udp_current[], $icmp_current[], $http_current[], $ftp_current[], $p2p_current[]) = explode('/', $data_current[$i]);
}

/** ** ** ** The table with old stats from our log file ** ** ** **/
$table_old = file_get_contents($filename);
$data_old = explode('#', $table_old);
for ( $i = 1; $i <=count($data_old); $i++ ){
list($ip_old[], $total_old[], $received_old[], $send_old[], $tcp_old[], $udp_old[], $icmp_old[], $http_old[], $ftp_old[], $p2p_old[]) = explode('/', $data_old[$i]);
}

/** ** ** ** Create a new table with new stats ** ** ** **/
for ( $i = 1; $i <=count($data_current); $i++ );{
if ($total_current[$i] > $total_old[$i]);
$total_new[$i] = $total_current[$i] + $total_old[$i];
if ($total_current[$i] < $total_old[$i]);
$total_tmp[$i] = $total_current[$i] - $total_old[$i];
$total_new[$i] = $total_old[$i] + $total_tmp[$i];
print"$total_new[$i]";
}

/** ** ** ** Write the table to the logfile ** ** ** **/
$file = fopen($filename, 'w+b');
fputs($file, $table_current);
fclose($file);
/** ** ** ** Done ** ** ** **/


het resultaat is echter een leuke nul (0 dus)

ik heb de oude gegevens uit mn eigen log file gehaald (= $table_old) en ik heb de beschikking over de nieuwe gegevens die door het 'main' C progje in dit bestand gezet worden (= $table_current).
Deze gegevens moeten opgeteld worden en weer in dezelfde volgorde etc. terug gezet worden in mn log file. (= ./trafdata.txt)

8)7 Hoe laat ik de teller nu werken, want dat lukt me niet nl 8)7

| Hardcore - Terror |


  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Hellraizer schreef op 19 februari 2004 @ 16:09:
duz.....

ik heb nu deze code:
PHP:
1
2
3
4
5
6
7
8
9
10
/** ** ** ** Create a new table with new stats ** ** ** **/
for ( $i = 1; $i <=count($data_current); $i++ );  // <= hier dus een ;
{ // <= slaat op het codeblok hieronder en wordt niet door de forloop meegenomen
  if ($total_current[$i] > $total_old[$i]); // <= doet niks door de ;
  $total_new[$i] = $total_current[$i] + $total_old[$i];
  if ($total_current[$i] < $total_old[$i]); // <= idem
  $total_tmp[$i] = $total_current[$i] - $total_old[$i];
  $total_new[$i] = $total_old[$i] + $total_tmp[$i];
  print"$total_new[$i]";
}


het resultaat is echter een leuke nul (0 dus)
Als ik zo naar de code kijk zie ik dat er achter de for-statement en de if-statements een ; staat. Als je deze weghaalt zal het een stuk beter gaan ;)

offtopic:
Het is voor ons makkelijker om code te bekijken die een beetje is uitgelijnd. Verder gebeurt highliting met de "=php" optie bij de [code] te zetten ziet er dus zo uit [code=php]


edit:
[quote]Verwijderd schreef op 19 februari 2004 @ 18:45:
[...]

Mwoh wel meer dan dat ook.....
2 loops met dezelfde bounds gaan vergelijken kan efficienter ;)
Dan heb ik het nog niet eens gehad over het feit dat je weet ik hoe vaak $a gelijk hebt aan $b en dus de waarde die je vergelijkt in het $ip-array automatisch gelijk aan elkaar is.[/quote]
Was ook maar een stukje voorbeeld code: die vars in de loop waren alleen maar omdat ik er eerst vanuit ging om het als uit eenzelfde file te halen en daar sloeg die edit dus ook op. En het tweede gedeelte van je post: O-) Nooit aan gedacht :X

[ Voor 25% gewijzigd door Shadowman op 19-02-2004 19:38 ]


Verwijderd

Shadowman schreef op 19 februari 2004 @ 10:18:
edit:

Zit stiekem een bug in de code als je de data alleen uit de file haalt, na de nieuwe gegevens daar te hebben toegevoegd, en daarna in de loop controleert :+
Mwoh wel meer dan dat ook.....
2 loops met dezelfde bounds gaan vergelijken kan efficienter ;)
Dan heb ik het nog niet eens gehad over het feit dat je weet ik hoe vaak $a gelijk hebt aan $b en dus de waarde die je vergelijkt in het $ip-array automatisch gelijk aan elkaar is.

  • nzyme
  • Registratie: November 2001
  • Laatst online: 29-07 15:47
Damn ! heb ff die ; weggehaald en ineens is dr een acceptabele output ! :Y)

Maar van die edit en die post hiervoor snap ik dus echt nix. Helaas.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
$filename = "./trafdata.txt";
$update = "Wed Feb 18 18:17:47 2004";
$time = date("l F j H:i:s Y");
$start = "NA";
/** ** ** ** The current stats from our C program ** ** ** **/
$table_current = "##Total/1024.0/11088407.0/11105177.0/22131518.0/62066.0/0/350282.0/0/0
#192.168.168.11/1024/7351133.0/3728015.0/11065759.0/13389.0/0/175141.0/0/0
#192.168.168.12/2048.0/3716696.0/7356343.0/11065759.0/7280.0/0/175141.0/0/0
#192.168.168.2/512.0/0/16770.0/0/16770.0/0/0/0/0
#192.168.168.255/4096.0/15763.0/0/0/15763.0/0/0/0/0
#192.168.168.1/4096.0/4815.0/0/0/4815.0/0/0/0/0
#192.168.168.14/2048.0/0/4049.0/0/4049.0/0/0/0/0";
$data_current = explode('#', $table_current);
for ( $i = 1; $i <=count($data_current); $i++ ){
list($ip_current[], $total_current[], $received_current[], $send_current[],
$tcp_current[], $udp_current[], $icmp_current[], $http_current[], $ftp_current[], 
$p2p_current[]) = explode('/', $data_current[$i]);
}

/** ** ** ** The table with old stats from our log file ** ** ** **/
$table_old = file_get_contents($filename);
$data_old = explode('#', $table_old);
for ( $i = 1; $i <=count($data_old); $i++ ){
list($ip_old[], $total_old[], $received_old[], $send_old[], $tcp_old[], $udp_old[],
$icmp_old[], $http_old[], $ftp_old[], $p2p_old[]) = explode('/', $data_old[$i]);
}

/** ** ** ** Create a new table with new stats ** ** ** **/
for ( $i = 1; $i <=count($data_current); $i++ ){
if ($total_current[$i] > $total_old[$i])
$total_new[$i] = $total_current[$i] + $total_old[$i];
if ($total_current[$i] < $total_old[$i])
$total_tmp[$i] = $total_current[$i] - $total_old[$i];
$total_new[$i] = $total_old[$i] + $total_tmp[$i];
print"$total_new[$i]<br>";
}

/** ** ** ** Write the new table to the logfile ** ** ** **/
$file = fopen($filename, 'w+b');
fputs($file, $table_current);
fclose($file);
/** ** ** ** Done ** ** ** **/

output:
code:
1
2
3
4
5
6
7
8
9
1024
1024
2048
512
4096
4096
2048
0
0


Het rekenen wil dus nog niet en ook worden er 2 nullen weergegeven :?
Kan het rekenwerk niet sneller trouwes? Het lijkt er op dat op de manier die ik hier probeer voor alle 10 de zaken (tcp udp http etc) een nieuw stukje code moet maken. Moet toch makkelijker kunnen toch?

[ Voor 112% gewijzigd door nzyme op 19-02-2004 21:37 ]

| Hardcore - Terror |


  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Een klein beetje standaard debugging:
Als je de variabelen weergeeft bij de laatste print (en dus alle variabelen die je hebt gebruikt), dan geeft dat waarschijnlijk wel aan waarom het fout gaat of in elk geval weer wat de waarden op dat moment zijn.

offtopic:
Die edit van mij en die reactie van Niels Klomp gingen over een stukje code dat ik had gemaakt en sloeg dus niet op jou code ;) (Die code die ik hier had gemaakt dus)

Acties:
  • 0 Henk 'm!

  • nzyme
  • Registratie: November 2001
  • Laatst online: 29-07 15:47
ff aant het proberen geweest met het reken gebeuren:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/** ** ** ** Create a new table with new stats ** ** ** **/
if ($total_current[1] == $total_old[0]){
$total_new[1] = $total_old[0];}
else {
    if ($total_current[1] > $total_old[0]){
        $total_new[1] = $total_old[0] + $total_current[1];
    }
    else {
        if ($total_current[1] < $total_old[0]) {
        $total_new_tmp[1] = $total_old[0] - $total_current[1];
        $total_new[1] = $total_old[0] + $total_new_tmp[1];
        }
    }
}
print"$total_old[0]<br>";
print"$total_current[1]<br>";
print"$total_new[1]<br>";

output: (ook na enkele keren refreshen, geen veranderingen)
code:
1
2
3
10
10.0 
10

Het progje update de $table_current:
$total_current wordt nu geen 10 maar 15

output: (1x refresh)
code:
1
2
3
10
15.0
25

output: (nog 1x refresh)
code:
1
2
3
25
15.0
35

output: (en nog 1x refresh)
code:
1
2
3
35
15.0
55


Ik moet dus een of andere update check maken denk ik |:(

Het C progje is verantwoordelijk voor de $table_current en alle gegevens die daar dus bij horen. De update van deze string gebeurt echter slechts om de 2.5min. Daar moet dus rekening mee gehouden worden. M.a.w. wanneer ik de page refresh moet i niet door blijven tellen ofzo.

We gaan weer verder proberen :Z
offtopic:
@ Mod:
bedankt voor de betere topic titel

[ Voor 113% gewijzigd door nzyme op 20-02-2004 12:11 ]

| Hardcore - Terror |


Acties:
  • 0 Henk 'm!

  • nzyme
  • Registratie: November 2001
  • Laatst online: 29-07 15:47
misschien kan ik hier iets mee....
PHP:
1
2
$update = date ("l F d Y H:i:s", filemtime(__FILE__));
$time = date("l F d Y H:i:s");


eerst maar s aant werk. Ben nu wel weer lang genoeg aant kloten geweest :O

8)7

| Hardcore - Terror |

Pagina: 1