duk-nt: Browserweiche für mobil Geräte Probleme

Hallo zusammen,

wir sind gerade dabei eine neue Homepage zu entwickeln. Die soll auch auf mobilen Geräten super aussehen.
Haben uns für die Variante mit den verschiedenen CSS für "media=handheld" und "media=only screen and (max-device-width:480px)" entschieden, was auch teils super funktioniert, teils leider gar nicht (Härtefall: Vodafone Live!-Browser auf dem LG)

Problem: Die Mobilgeräte-CSSe werden missachtet, stattdessen wird die Screen-CSS gewählt und teilweise wie auf dem Monitor zu sehen dargestellt, teilweise auch "untereinandergepackt" mit Zeilenumbrüchen.

Jetzt haben wir den Versuch mit der Browserweiche hier aus selfHTML gewagt und um weitere User-Agents erweitert. Vodafone wird dabei immer noch nicht angesprochen.

Daher meine Frage: Könnte jemand von euch einen Blick auf die Sache werfen? Wir sind leider nicht die PHP-Profies, daher wäre es super, wenn da mal jemand drüberschaut!

Link zur Homepage

ausgelagertes PHP-Script:

<?php  
  
function check_mobile() {  
  $agents = array(  
    'Windows CE', 'Pocket', 'Mobile',  
    'Portable', 'Smartphone', 'SDA',  
    'PDA', 'Handheld', 'Symbian',  
    'WAP', 'Palm', 'Avantgo',  
    'cHTML', 'BlackBerry', 'Opera Mini',  
    'Nokia', 'Vodafone', 'T-Mobile',  
    'Android', 'PSP', 'LG',  
    'LGE'  
  );  
  
  // Prüfen der Browserkennung  
  for ($i=0; $i<count($agents); $i++) {  
    if(isset($_SERVER["HTTP_USER_AGENT"]) && strpos($_SERVER["HTTP_USER_AGENT"], $agents[$i]) !== false)  
      return true;  
  }  
  
  return false;  
}  
  
?>

Oder gibt es noch eine andere Alternative mobile Geräte auf ein seperates CSS zu verweisen?

Danke vorab,

MfG duk-nt

  1. Wir sind leider nicht die PHP-Profies, daher wäre es super, wenn da mal jemand drüberschaut!

    foreach() anstatt for() wäre ein möglichkeit.

    $agents = array(
        'Windows CE', 'Pocket', 'Mobile',
        'Portable', 'Smartphone', 'SDA',
        'PDA', 'Handheld', 'Symbian',
        'WAP', 'Palm', 'Avantgo',
        'cHTML', 'BlackBerry', 'Opera Mini',
        'Nokia', 'Vodafone', 'T-Mobile',
        'Android', 'PSP', 'LG',
        'LGE'
      );

    Woher stammt diese Liste? Einfach mal LG und Vodafone reinpacken und "hoffen" dass das auch so irgendwie im HTTP_USER_AGENT steht?

    Oder gibt es noch eine andere Alternative mobile Geräte auf ein seperates CSS zu verweisen?

    Du kannst deinen Besucher per Hand wählen lassen, das ist aber sicher nicht in deinem Sinn.

    Nebst dessen gibt es noch kommerzielle Anbeiter die entsprechende Frameworks zur Verfügung stellen - diese sind sehr zuverlässig, aber meistens fürchterlich teuer.

    1. foreach() anstatt for() wäre ein möglichkeit.

      nope, bringt mir einen parsing-error

      Woher stammt diese Liste? Einfach mal LG und Vodafone reinpacken und "hoffen" dass das auch so irgendwie im HTTP_USER_AGENT steht?

      Nee nee, einfach so nicht: Die Liste stammt aus SelfHTML und die Liste wurde mit Begriffen von hier erweitert.

      Du kannst deinen Besucher per Hand wählen lassen, das ist aber sicher nicht in deinem Sinn.
      Nebst dessen gibt es noch kommerzielle Anbeiter die entsprechende Frameworks zur Verfügung stellen - diese sind sehr zuverlässig, aber meistens fürchterlich teuer.

      Das ist tatsächlich nicht in unserem Sinn :-)

      Ich habe bei einigen Versuchen festgestellt, dass z.B. Opera Mini das externe Script zwar ausliest, aber dann nicht wie vom Script befohlen auf das richtige CSS zugreift. Vielleicht hilft das weiter?

      1. foreach() anstatt for() wäre ein möglichkeit.

        nope, bringt mir einen parsing-error

        Mit der richtigen Syntax nicht - eine for-Schleife ist hier jedenfalls schlechter Stil.

        Woher stammt diese Liste? Einfach mal LG und Vodafone reinpacken und "hoffen" dass das auch so irgendwie im HTTP_USER_AGENT steht?

        Nee nee, einfach so nicht: Die Liste stammt aus SelfHTML und die Liste wurde mit Begriffen von hier erweitert.

        Und die von dir getesteten Telefone halten sich auch an diese Regeln?

        Das ist tatsächlich nicht in unserem Sinn :-)

        Ich habe bei einigen Versuchen festgestellt, dass z.B. Opera Mini das externe Script zwar ausliest, aber dann nicht wie vom Script befohlen auf das richtige CSS zugreift. Vielleicht hilft das weiter?

        Welchen User Agent sendet Opera Mini denn?

        1. foreach() anstatt for() wäre ein möglichkeit.

          nope, bringt mir einen parsing-error

          Mit der richtigen Syntax nicht - eine for-Schleife ist hier jedenfalls schlechter Stil.

          puh, ja, wie gesagt, der php-profi sind wir hier nicht gerade, ich bin mal davon ausgegangen dass mir SelfHTML mir gute, richtige Codes ausspuckt wie sonst auch..

          Woher stammt diese Liste? Einfach mal LG und Vodafone reinpacken und "hoffen" dass das auch so irgendwie im HTTP_USER_AGENT steht?

          Nee nee, einfach so nicht: Die Liste stammt aus SelfHTML und die Liste wurde mit Begriffen von hier erweitert.

          Und die von dir getesteten Telefone halten sich auch an diese Regeln?

          nein, tun sie nicht, sonst würde ich hier nicht mein Problem ins Forum posten

          Das ist tatsächlich nicht in unserem Sinn :-)

          Ich habe bei einigen Versuchen festgestellt, dass z.B. Opera Mini das externe Script zwar ausliest, aber dann nicht wie vom Script befohlen auf das richtige CSS zugreift. Vielleicht hilft das weiter?

          Welchen User Agent sendet Opera Mini denn?

          ich hoffe doch 'Opera Mini'? Wie gesagt, kein php-Profi und Code von hier genommen in der Annahme das alles korrekt ist.

          Wenn du was weißt was mir weiterhilft, dann antworte mir doch nicht mit Gegenfragen, ich versuche bereits mein Bestes, ich schreibe meine Probleme ja nicht grundlos hier ins Forum ;-) Ich bin auch sicher nicht faul, ich häng hier gerade nur einfach an diesem Problem und komme nicht weiter

          1. Und die von dir getesteten Telefone halten sich auch an diese Regeln?

            nein, tun sie nicht, sonst würde ich hier nicht mein Problem ins Forum posten

            Welchen User Agent sendet Opera Mini denn?

            ich hoffe doch 'Opera Mini'? Wie gesagt, kein php-Profi und Code von hier genommen in der Annahme das alles korrekt ist.

            Du wirst einsehen dass "Tun sie nicht" und "Ich hoffe doch" in einer Welt in der es nur 0 und 1 gibt nicht funktionierten.

            Wenn du was weißt was mir weiterhilft,

            Dir hilft die Analyse deines Problems weiter - eine konkrete Antwort kann aufgrund deiner Fragestellung und dem Informationsgehalt nicht gegeben werden.

            dann antworte mir doch nicht mit Gegenfragen,

            Du fragst ja nicht "Was ist 1x1?" worauf die Antwort klar 1 wäre, sondern "Warum ist mein Ergebnis nicht 1?" die zur Berechnung nötigen Faktoren fehlen aber. Und diese Faktoren versuche ich zu erfragen.

            ich versuche bereits mein Bestes, ich schreibe meine Probleme ja nicht grundlos hier ins Forum ;-)

            Das ist mir schon klar - und ich foppe dich auch nicht zum Zeitvertreib weil mir so langweilig ist.

            Ich bin auch sicher nicht faul, ich häng hier gerade nur einfach an diesem Problem und komme nicht weiter

            Ja, nur eben technisch wie du selbst sagst nicht sehr versiert ;)

            Also nochmal

            Welchen HTTP_USER_AGENT liefert das Gerät, welches du mit deiner Weiche ansprechen willst?

            Erst wenn das felsenfest klar ist, ist ein sinnvolles Weiterarbeiten möglich.

            1. Welchen HTTP_USER_AGENT liefert das Gerät, welches du mit deiner Weiche ansprechen willst?

              Erst wenn das felsenfest klar ist, ist ein sinnvolles Weiterarbeiten möglich.

              Zunächst Vielen Dank für die Hilfe. Bin halt noch ein Anfänger...
              Ich möchte einen Opera mini auf einem LG KP 500 ansprechen.

              Code-Anfang der Seite, welche die check_mobile.php aufruft http://www.kieferorthopaede-zahnspange.de/REDESIGN/index-php.php

              <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
              <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
              <head>
              <title> Gramma check_mobile test</title>
              <?php
              require('check_mobile.php');
              $style = '';
              if(check_mobile()) $style = 'handheld';
              ?>
              <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
              .............

              Habe nun entdeckt, dass das php gar nicht im Browser geladen wird: Dort sieht der Code dann so aus (IE8 und FF3.5):

              <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
              <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
              <head>
              <title> Gramma check_mobile test</title>
              <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
              .............

              Nun weiß ich also warum das nicht funktionieren kann.
              Habe auch gegoogelt aber keine Hilfe gefunden.
              Der Server unterstützt php.
              Ist der Doctype falsch? Habe allerhand ausprobiert ohne Wirkung.

              Was kann ich tun?

              HTTP_USER_AGENT
              LG-KP500 Teleca/WAP 2.0 MIDP-2.0/CLDC1.1

              Code in externer Datei check_mobile.php

              <title></title>
              <?php
              function check_mobile() {
                $agents = array(
                  'Windows CE', 'Pocket', 'Mobile',
                  'Portable', 'Smartphone', 'SDA',
                  'PDA', 'Handheld', 'Symbian',
                  'WAP', 'Palm', 'Avantgo',
                  'cHTML', 'BlackBerry', 'Opera Mini',
                  'Nokia', 'LG'
                );
                // Prüfen der Browserkennung
                for ($i=0; $i<count($agents); $i++) {
                  if(isset($_SERVER["HTTP_USER_AGENT"]) && strpos($_SERVER["HTTP_USER_AGENT"], $agents[$i]) !== false)
                    return true;
                }
                return false;
              }
              ?>

              Ich hoffe nun war ich ausführlich genung.

              1. HTTP_USER_AGENT
                LG-KP500 Teleca/WAP 2.0 MIDP-2.0/CLDC1.1

                Das ist hoffentlich der, den das Gerät tatsächlich anzeigt, nicht der den du irgnedwo in einer Sammlung im Internet gefunden hast.

                <title></title>
                <?php
                function check_mobile() {
                  $agents = array(
                    'Windows CE', 'Pocket', 'Mobile',
                    'Portable', 'Smartphone', 'SDA',
                    'PDA', 'Handheld', 'Symbian',
                    'WAP', 'Palm', 'Avantgo',
                    'cHTML', 'BlackBerry', 'Opera Mini',
                    'Nokia', 'LG'
                  );
                  // Prüfen der Browserkennung
                  for ($i=0; $i<count($agents); $i++) {
                    if(isset($_SERVER["HTTP_USER_AGENT"]) && strpos($_SERVER["HTTP_USER_AGENT"], $agents[$i]) !== false)
                      return true;
                  }
                  return false;
                }
                ?>

                Ich hoffe nun war ich ausführlich genung.

                Ja - und Aufgrund der genannten Faktoren sollte die Funktion true ergeben.

                Du kannst dich daran machen, dein Script zu zerlegen und alles einzeln ausprobieren um den Fehler zu finden:

                Was z.B. ergibt folgendes?

                var_dump(  
                  strpos('LG-KP500 Teleca/WAP 2.0 MIDP-2.0/CLDC1.1', 'LG');  
                );  
                  
                var_dump(  
                  strpos($_SERVER['HTTP_USER_AGENT'], 'LG');  
                );  
                  
                var_dump(  
                  $_SERVER['HTTP_USER_AGENT'];  
                );
                
                1. Wie du selbst sagst, PHP ist nicht deine Stärke, sonst wüsstest du ja, dass PHP immer auf dem SERVER ausgeführt wird und dann (hoffentlich) eine verständliche HTML-Antwort für den Browser im Client generiert wird ..

                  Von daher solltest du im Normalfall NIE PHP-Code in der angezeigten Seite finden, wenn da doch PHP drin auftaucht, dann deutet das auf Fehler hin (meist in Verbindung mit Anführungszeichen ...

                  zum eigentlichen Problem - es sollte doch nicht so schwer sein, wenn ihr schon wisst, welches Handy die Probleme macht, einfach den HTTP_USER_AGENT per echo auszugeben - egal wie verwurstet die Seite aussieht , diese Ausgabe kann man auch auf dem kleinsten Handy-Bildschirm gut lesbar ausgeben und dann das Script um eben diesen User-Agent erweitern (bzw Teilstrings wie eben 'LG'

                  1. Wie du selbst sagst, PHP ist nicht deine Stärke, sonst wüsstest du ja, dass PHP immer auf dem SERVER ausgeführt wird und dann (hoffentlich) eine verständliche HTML-Antwort für den Browser im Client generiert wird ..

                    PHP muss nicht zwangsläufig HTML ausliefern.

                    agent.php

                    <?php  
                      echo $_SERVER['HTTP_USER_AGENT'];  
                    ?>
                    

                    Und das am Mobiltelefon aufgerufen sollte als grundlegende Kontrollausgabe ausreichen,

                    Von daher solltest du im Normalfall NIE PHP-Code in der angezeigten Seite finden,

                    Warum sollte man das auch?

                    wenn da doch PHP drin auftaucht, dann deutet das auf Fehler hin (meist in Verbindung mit Anführungszeichen ...

                    Was haben Anführungszeichen damit zu tun, dass PHP nicht interpretiert wird?

                    zum eigentlichen Problem - es sollte doch nicht so schwer sein, wenn ihr schon wisst, welches Handy die Probleme macht, einfach den HTTP_USER_AGENT per echo auszugeben - egal wie verwurstet die Seite aussieht , diese Ausgabe kann man auch auf dem kleinsten Handy-Bildschirm gut lesbar ausgeben und dann das Script um eben diesen User-Agent erweitern (bzw Teilstrings wie eben 'LG'

                    Siehe oben - ein zusätzliches Testscript reicht hier völlig aus ohne die Live-Seite zu verwursten.

                    Kontrollausgaben mittels var_dump() schlug' ich bereits vor.

                  2. zum eigentlichen Problem - es sollte doch nicht so schwer sein, wenn ihr schon wisst, welches Handy die Probleme macht, einfach den HTTP_USER_AGENT per echo auszugeben - egal wie verwurstet die Seite aussieht , diese Ausgabe kann man auch auf dem kleinsten Handy-Bildschirm gut lesbar ausgeben und dann das Script um eben diesen User-Agent erweitern (bzw Teilstrings wie eben 'LG'

                    Das habe ich ja gemacht: und es funktioniert nicht.
                    User_Agent ist: HTTP_USER_AGENT
                    LG-KP500 Teleca/WAP 2.0 MIDP-2.0/CLDC1.1

                    Code in externer Datei check_mobile.php

                    <title></title>
                    <?php
                    function check_mobile() {
                      $agents = array(
                        'Windows CE', 'Pocket', 'Mobile',
                        'Portable', 'Smartphone', 'SDA',
                        'PDA', 'Handheld', 'Symbian',
                        'WAP', 'Palm', 'Avantgo',
                        'cHTML', 'BlackBerry', 'Opera Mini',
                        'Nokia', 'LG'
                      );
                      // Prüfen der Browserkennung
                      for ($i=0; $i<count($agents); $i++) {
                        if(isset($_SERVER["HTTP_USER_AGENT"]) && strpos($_SERVER["HTTP_USER_AGENT"], $agents[$i]) !== false)
                          return true;
                      }
                      return false;
                    }
                    ?>

                    LG und WAP sind enthalten.
                    Ich verstehe das alles viel zu wenig und
                    wünsche mir deshalb, dass mir jemand den Code anschaut und sagt wo der Fehler liegt und diesen korrigiert.
                    Falls das jemand kann bin ich auch gerne bereit den Aufwand zu bezahlen. In diesem Fall erbitte ich eine private E-Mail.

                    1. Dein Problem wird im PHP-Handbuch explizit beschrieben.
                      http://www.php.net/strpos

                      (Hinweis von mir: PHP findet den Suchbegriff im zu durchsuchenden String an Position 0).

                      1. Dein Problem wird im PHP-Handbuch explizit beschrieben.
                        http://www.php.net/strpos

                        (Hinweis von mir: PHP findet den Suchbegriff im zu durchsuchenden String an Position 0).

                        Ich checks nicht, und wenn ich das Handbuch lese verstehe ich nichts, ergo kann auch nix lernen und weiß gar nicht wo und wie was ändern. Wenn es mir keiner richtet geb ich's auf (ich such ja schon einen bezahlten Profi). Ich meine: Was muss explizit (und wie, an welcher Stelle am Code geändert werden, damit das MOBILE.css aufgerufen wird?
                        Schluchz

                      2. Dein Problem wird im PHP-Handbuch explizit beschrieben.
                        http://www.php.net/strpos

                        (Hinweis von mir: PHP findet den Suchbegriff im zu durchsuchenden String an Position 0).

                        Im Handbuch findet sich auch der Hinweis, warum das Unsinn ist:
                        http://www.php.net/manual/de/language.operators.comparison.php

                        0 ist ganz klar nicht dasselbe wie false

                    2. Falls das jemand kann bin ich auch gerne bereit den Aufwand zu bezahlen. In diesem Fall erbitte ich eine private E-Mail.

                      done