BenCC: Probleme bei Identifierung von NN- und Opera-Browser

Hallo Leute,

habe da ein Script, welches Browserstatistik ermitteln soll. Eigentlich
funkt es, aber noch nicht ganz richtig.
Der Browser IE wird erkannt, aber nei NN und Opera bekomme ich das gleiche
Ergebnis wie bei IE. Das sollte aber nicht sein.
Hier das Script:

<html>
<head>
<title>Eine Web-Umfrage</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="white">
<p>Folgende Umfrageergebnisse wurden ermittelt:</p>
<?php
$user = $_SERVER['HTTP_USER_AGENT'];
$datei="ergebnis.txt";
$zeiger=fopen($datei,"r");
$umfrage=fread($zeiger,filesize($datei));
fclose($zeiger);
$werte=explode(",",$umfrage);

$explorer="MSIE";
$nav405=4.05;
$nav408=4.08;
$nav450=4.50;
$nav470=4.70;
$nav472=4.72;
$nav473=4.73;
$nav474=4.74;
$nav475=4.75;
$nav476=4.76;
$nav477=4.77;
$nav478=4.78;
$nav479=4.79;
$nav480=4.80;
$nav600=6.0;
$nav610=6.1;
$nav620=6.2;
$nav700=7.0;
$oper="opera";
if(eregi("^([[:alpha:]]*)$",$explorer,$user)) { $werte[0]++; }
elseif(eregi("^([[:digit:]]*).([[:digit:]]{2})$",$nav405, $user) || (eregi("^([[:digit:]]*).([[:digit:]]{2})$",$nav408, $user)) || (eregi("^([[:digit:]]*).([[:digit:]]{2})$",$nav450, $user)) || (eregi("^([[:digit:]]*).([[:digit:]]{2})$",$nav470, $user)) || (eregi("^([[:digit:]]*).([[:digit:]]{2})$",$nav472, $user)) || (eregi("^([[:digit:]]*).([[:digit:]]{2})$",$nav473, $user)) || (eregi("^([[:digit:]]*).([[:digit:]]{2})$",$nav474, $user)) || (eregi("^([[:digit:]]*).([[:digit:]]{2})$",$nav475, $user)) || (eregi("^([[:digit:]]*).([[:digit:]]{2})$",$nav476, $user)) || (eregi("^([[:digit:]]*).([[:digit:]]{2})$",$nav477, $user)) || (eregi("^([[:digit:]]*).([[:digit:]]{2})$",$nav478, $user)) || (eregi("^([[:digit:]]*).([[:digit:]]{2})$",$nav479, $user)) || (eregi("^([[:digit:]]*).([[:digit:]]{2})$",$nav480, $user)) !=
(eregi("^([[:alpha:]]*)$",$explorer,$user))) { $werte[1]++; }
elseif(eregi("^([[:digit:]]*).([[:digit:]]{1})$",$nav600 ,$user) || (eregi("^([[:digit:]]*).([[:digit:]]{1})$",$nav610, $user)) || (eregi("^([[:digit:]]*).([[:digit:]]{1})$",$nav620, $user)) || (eregi("^([[:digit:]]*).([[:digit:]]{1})$",$nav700, $user))) { $werte[2]++; }
elseif(eregi("^([[:alpha:]]*)$",$oper, $user)) { $werte[3]++; }
else { $werte[4]++; }
// Gesamtzahl aller Wahlvorgänge
$gesamt=$werte[0]+$werte[1]+$werte[2]+$werte[3]+$werte[4];
// Höchstlänge der Balken angeben
$laenge=400;
// Anteil von Balken 1 (Indexwert IE4_6!)
$laengeIE4_6=($werte[0]/$gesamt)*$laenge;
// Anteil von Balken 2 (Indexwert NN4x!)
$laengeNN4x=($werte[1]/$gesamt)*$laenge;
// Anteil von Balken 3 (Indexwert NN6x7!)
$laengeNN6x7=($werte[2]/$gesamt)*$laenge;
// Anteil von Balken 4 (Indexwert Opera)
$laengeOPER=($werte[3]/$gesamt)*$laenge;
// Anteil von Balken 5 (Indexwert OTHER!)
$laengeOTHER=($werte[4]/$gesamt)*$laenge;
// Werte auf ganze Zahlen runden
$laengeIE4_6=round($laengeIE4_6,0);
$laengeNN4x=round($laengeNN4x,0);
$laengeNN6x7=round($laengeNN6x7,0);
$laengeOPER=round($laengeOPER,0);
$laengeOTHER=round($laengeOTHER,0);

$neuerinhalt= implode(",",$werte);
$schreiben=fopen($datei,"w");
fwrite($schreiben,$neuerinhalt);
fclose($schreiben);
?>
<p>Bisher <?php echo $gesamt; ?> Teilnehmer</i> <br>
So sieht das Ergebnis aus:</p>
<table border="0">
<tr>
 <td><b>Internet Explorer 4.x/5.x/6</b></td>
 <td> </td><td width="<?php echo $laengeIE4_6; ?>px" bgcolor="red"> </td>
 <td> <?php echo $werte[0];?></i></td>
</tr></table><table>
<tr>
 <td><b>Netscape Navigator 4.x</b></td>
 <td> </td><td width="<?php echo $laengeNN4x; ?>px" bgcolor="yellow"> </td>
 <td> <?php echo $werte[1];?></i></td>
</tr></table><table>
<tr>
 <td><b>Netscape Navigator 6.x/7</b></td>
 <td> </td><td width="<?php echo $laengeNN6x7; ?>px" bgcolor="green"> </td>
 <td> <?php echo $werte[2];?></i></td>
</tr></table><table>
<tr>
 <td><b>Opera</b></td>
 <td> </td><td width="<?php echo $laengeOPER; ?>px" bgcolor="blue"> </td>
 <td> <?php echo $werte[3];?></i></td>
</tr></table><table>
<tr>
 <td><b>Andere Browser</b></td>
 <td> </td><td width="<?php echo $laengeOTHER; ?>px" bgcolor="magenta"> </td>
 <td> <?php echo $werte[4];?></i></td>
</tr>
</table>
</body>
</html>

Hat jemand einen Tipp?
Danke.

mfg
BenCC

  1. Hallo, Benedikt,

    ich kann den Fehler nicht finden, da ich nicht einmal durchblicke, wie du die Abfragen vonimmst, weil mich dieses absolut unübersichtliche Codemonster überrumpelt:

    if(eregi("^([[:alpha:]]*)$",$explorer,$user)) { $werte[0]++; }
    elseif

    usw.

    Was ist überhaupt der Sinn davon? eregi() benötigt folgende Argumente:
    eregi ( string Suchmuster,  string Zeichenkette [, array regs])
    eregi ( "^([[:alpha:]]*)$", $explorer,          $user         )

    Das passt doch gar nicht. Das Suchmuster ist "MSIE" ($explorer), die zu durchsuchende Zeichenkette ist $user, folglich brauchst du diese Regulären Ausdrücke nicht, sondern eher substr_count() (oder strpos() oder strstr()).

    if (substr_count($user, $explorer)>0) {
     $werte[0]++
    } else [
     if (substr_count($user, $nav405)>0) {
      ...

    Das Verschachteln ist jedoch suboptimal, siehe http://www.dclp-faq.de/q-stil-waechter.html.
    Wenn du schon reguläre Ausdrücke verwendest, dann bitte Perl-kompatible Reguläre Ausdrücke (PREG, http://www.php.net/manual/de/ref.pcre.php). So könntest du dir übrigens die dutzenden Abfragen für Mozilla 4.05-7.0 sparen, die Ausdrücke wären z.B. ~4.(\d){2}~, ~6.\d~ und ~7.\d~. Die bräuchtest du dann nur einmal mit preg_match() anzuwenden.

    Grüße,
    Mathias
    (Fehler vorbehalten. :))