Tyler Durden: PHP Session Variable als array

Hallo zusammen,

ich möchte ein kleines Votingsystem in eine Website einbauen. Damit jeder User nur 1 mal voten kann, soll zuerst eine Session gestartet werden. Nun wenn der User die Stimme abgibt, dann wird ein Array $vote registriert und er kehrt zur Auswahl zurück.

So weit so gut. Nun kann der User einen anderen Artikel auswählen und auch dort eine Stimme abgeben.
Leider kriege ich das ganze aber nicht so ganz hin, denn beim nächsten Aufruf des Artikels verhält sich das ganze, als hätte er nie für den Artikel eine Stimme abgegeben.

hier mein Code von der 1 Wahlseite:

  
session_register($voted);  
$voted = array($n => 1);

Bei der nächsten Auswahl wird überprüft, ob für den Artikel n schon eine Stimme abgegeben wurde:

  
if($voted[$n]) == 1)  
	{ "Votingergebnis"}  
else  
       { "Votingauswahl" }  

Besten Dank für eure Hilfe.

  1. Hallo!

    ich möchte ein kleines Votingsystem in eine Website einbauen. Damit jeder User nur 1 mal voten kann, soll zuerst eine Session gestartet werden. Nun wenn der User die Stimme abgibt, dann wird ein Array $vote registriert und er kehrt zur Auswahl zurück.

    So weit so gut. Nun kann der User einen anderen Artikel auswählen und auch dort eine Stimme abgeben.
    Leider kriege ich das ganze aber nicht so ganz hin, denn beim nächsten Aufruf des Artikels verhält sich das ganze, als hätte er nie für den Artikel eine Stimme abgegeben.

    Also mal ganz abgesehen von deinem Code-Beispiel, wirst du das (imho) auf diese Art & Weise nie hinbekommen. Denn was nutzt dir die Erfassung eines Users anhand einer Session? Schon alleine wenn ich mehrere verschiedene Browser (IE, FF, Opera, Chrome, etc.) verwende, könnte ich demnach x-mal für einen Artikel stimmen.

    Hier hilft imho nur eine Benutzer bezogene Erfassung, d.h. du musst erstmal *den* Benutzer eindeutig erfassen (z.B. indem sich dieser per Benutzername + Passwort vorher einloggen muss, um Abstimmen zu können).

    Und dann musst du nur noch festhalten (bspw. in einer DB), welcher User für welchen Artikel bereits seine Stimme abgegeben hat - fertig!

    Gruß Gunther

    1. Hallo Gunther,

      das mit den verschiedenen Browsern ist mir schon klar. Das ganze soll aber so unkompliziert wie möglich bleiben. D.h. kein Benutzerregistrierung o.ä. Das ganze ist nicht auf meinem Mist gewachsen. Es ist ein Kumpel von mir, der das so will.

      Ist das  ganze mit der Session und dem Array überhaupt möglich?

      Hallo!

      »» ich möchte ein kleines Votingsystem in eine Website einbauen. Damit jeder User nur 1 mal voten kann, soll zuerst eine Session gestartet werden. Nun wenn der User die Stimme abgibt, dann wird ein Array $vote registriert und er kehrt zur Auswahl zurück.
      »»
      »» So weit so gut. Nun kann der User einen anderen Artikel auswählen und auch dort eine Stimme abgeben.
      »» Leider kriege ich das ganze aber nicht so ganz hin, denn beim nächsten Aufruf des Artikels verhält sich das ganze, als hätte er nie für den Artikel eine Stimme abgegeben.
      Also mal ganz abgesehen von deinem Code-Beispiel, wirst du das (imho) auf diese Art & Weise nie hinbekommen. Denn was nutzt dir die Erfassung eines Users anhand einer Session? Schon alleine wenn ich mehrere verschiedene Browser (IE, FF, Opera, Chrome, etc.) verwende, könnte ich demnach x-mal für einen Artikel stimmen.

      Hier hilft imho nur eine Benutzer bezogene Erfassung, d.h. du musst erstmal *den* Benutzer eindeutig erfassen (z.B. indem sich dieser per Benutzername + Passwort vorher einloggen muss, um Abstimmen zu können).

      Und dann musst du nur noch festhalten (bspw. in einer DB), welcher User für welchen Artikel bereits seine Stimme abgegeben hat - fertig!

      Gruß Gunther

      1. Hallo!

        das mit den verschiedenen Browsern ist mir schon klar. Das ganze soll aber so unkompliziert wie möglich bleiben. D.h. kein Benutzerregistrierung o.ä.

        Also mit anderen Worten, völlig nutzlos!

        Das ganze ist nicht auf meinem Mist gewachsen. Es ist ein Kumpel von mir, der das so will.

        Na dann ...!
        Mit diesem Totschlagargument kann man natürlich jeden Mist rechtfertigen.

        Ist das  ganze mit der Session und dem Array überhaupt möglich?

        Möglich schon, wobei du dir auch noch überlegen solltest, wie und wann du ggf. Einträge in dem Array wieder löschst, da es ansonsten immer größer wird. Nur ist imho jede Codezeile dafür eine zuviel, da es völlig nutzlos ist.

        Da würde ich (, wenn man schon nur halbe Sachen machen will) ja noch eher auf Cookies setzen.

        Gruß Gunther

        1. 你好 Gunther,

          Mit diesem Totschlagargument kann man natürlich jeden Mist rechtfertigen.

          Es ist nicht so als müsste der OP hier _irgendwas_ rechtfertigen.

          再见,
           克里斯蒂安

          1. 你好 Christian,

            »» Mit diesem Totschlagargument kann man natürlich jeden Mist rechtfertigen.

            Es ist nicht so als müsste der OP hier _irgendwas_ rechtfertigen.

            das sehe ich etwas anders. ;-)

            Er kann zwar im Endeffekt machen was er will, aber Jeder, der hier nach Rat & Tat fragt, sollte sein Vorhaben auch schon in irgendeiner Weise "rechtfertigen" können, zumal wenn es wie hier offensichtlich wenig effektiv ist.

            Bewußt wider besseren Wissens zu handeln, halte ich zudem für "grob fahrlässig".

            Kann aber auch nur sein, dass ich in der Beziehung etwas hyper sensibel bin, denn solche Argumente hört man ja bis heute für Tabellen-Layouts und den Einsatz von Frames (beides, wo es nicht angebracht ist).

            Gruß Gunther

            1. 你好 Gunther,

              Es ist nicht so als müsste der OP hier _irgendwas_ rechtfertigen.
              das sehe ich etwas anders. ;-)

              Mit welchem Recht nimmst du dir heraus, dass sich der OP dir Gegenüber zu rechtfertigen hat? Bist du ihm vorgesetzt?

              Er kann zwar im Endeffekt machen was er will, aber Jeder, der hier nach Rat & Tat fragt, sollte sein Vorhaben auch schon in irgendeiner Weise "rechtfertigen" können, zumal wenn es wie hier offensichtlich wenig effektiv ist.

              Nein, sicher nicht. Der OP muss gar nichts rechtfertigen. Selbstverständlich steht es dir frei, nicht auf seine Frage einzugehen oder sein Vorgehen (konstruktiv) kritisch zu hinterfragen. Aber eine Rechtfertigung? Wohl kaum.

              Kann aber auch nur sein, dass ich in der Beziehung etwas hyper sensibel bin, denn solche Argumente hört man ja bis heute für Tabellen-Layouts und den Einsatz von Frames (beides, wo es nicht angebracht ist).

              Ich denke, du solltest dir mehr Gelassenheit zulegen. Tabellenlayouts und Frames sind nichts, wovor man Angst haben müsste, sie sind auch nichts böses. Nur eine Technik.

              再见,
               克里斯蒂安

              1. 你好 Christian!

                »» > Es ist nicht so als müsste der OP hier _irgendwas_ rechtfertigen.
                »» das sehe ich etwas anders. ;-)

                Mit welchem Recht nimmst du dir heraus, dass sich der OP dir Gegenüber zu rechtfertigen hat? Bist du ihm vorgesetzt?

                Nein, und ich nehme mir nicht mehr und nicht weniger heraus, als jeder andere auch hier. Wenn ich anhand einer Frage von jemandem den Eindruck habe, dass sein Vorhaben/ seine Zielsetzung so nicht funktioniert, dann hinterfrage ich den Grund des Vorhabens, bzw. nach dem Grund, warum man trotz genannter Alternativen auf dem ursprünglichen Vorhaben beharrt.

                Davon mache ich nämlich für mich abhängig, ob ich darauf noch weiter antworte (also Zeit darin investiere), oder nicht.

                »» Er kann zwar im Endeffekt machen was er will, aber Jeder, der hier nach Rat & Tat fragt, sollte sein Vorhaben auch schon in irgendeiner Weise "rechtfertigen" können, zumal wenn es wie hier offensichtlich wenig effektiv ist.

                Nein, sicher nicht. Der OP muss gar nichts rechtfertigen. Selbstverständlich steht es dir frei, nicht auf seine Frage einzugehen oder sein Vorgehen (konstruktiv) kritisch zu hinterfragen. Aber eine Rechtfertigung? Wohl kaum.

                Ja, wir können jetzt auch anfangen, jedes "Wort" auf die Gold-Waage zu legen!
                Du weißt mit Sicherheit, was ich meine. Und ich bin bei deiner Formulierung geblieben (man beachte die Anführungsstriche!).

                »» Kann aber auch nur sein, dass ich in der Beziehung etwas hyper sensibel bin, denn solche Argumente hört man ja bis heute für Tabellen-Layouts und den Einsatz von Frames (beides, wo es nicht angebracht ist).

                Ich denke, du solltest dir mehr Gelassenheit zulegen.

                Ja - wo gibt's die denn zu kaufen?

                Tabellenlayouts und Frames sind nichts, wovor man Angst haben müsste, sie sind auch nichts böses. Nur eine Technik.

                Das ist mir wohl auch bekannt, und Angst habe ich davor auch keine.
                Du wärst bestimmt der Erste, der einem Newbie erklären würde, wie er sein Homapage-Layout/-Design mittels solcher Techniken realisieren kann, oder?

                Schade! Ich bin bislang immer davon ausgegangen, dass einer der wesentlichen Vorzüge dieses Forums der war, dass man hier u.a. auch über Sinn & Unsinn eines Vorhabens aufgeklärt wird, und einem ggf. "bessere" Alternativen genannt werden.

                Wenn es hier "nur" noch um das bloße "Hinrotzen" von ein paar Codezeilen geht, dann ...!

                Und überhaupt - haben dich meine Beiträge so "aufgeregt", dass du nicht umhinkamst, darauf zu antworten?

                Ich habe hier ja wohl in keinster Weise jemanden persönlich angegriffen. Dem OP steht es ja genauso frei, einfach nicht auf meine Beiträge zu antworten und sie schlicht zu ignorieren. Allerdings bin ich der Auffassung, dass sie mehr zum Thema beigetragen haben, als deine Äußerungen hier.

                Gruß Gunther

                1. 你好 Gunther,

                  Mit welchem Recht nimmst du dir heraus, dass sich der OP dir Gegenüber zu rechtfertigen hat? Bist du ihm vorgesetzt?
                  Nein, und ich nehme mir nicht mehr und nicht weniger heraus, als jeder andere auch hier.

                  Ich habe bisher noch keinen Beitrag gelesen, der eine Rechtfertigung gefordert hat. Aber du kannst mich gerne aufklären.

                  Wenn ich anhand einer Frage von jemandem den Eindruck habe, dass sein Vorhaben/ seine Zielsetzung so nicht funktioniert, dann hinterfrage ich den Grund des Vorhabens, bzw. nach dem Grund, warum man trotz genannter Alternativen auf dem ursprünglichen Vorhaben beharrt.

                  Nun, das ist etwas völlig anderes als eine Rechtfertigung zu fordern.

                  Nein, sicher nicht. Der OP muss gar nichts rechtfertigen. Selbstverständlich steht es dir frei, nicht auf seine Frage einzugehen oder sein Vorgehen (konstruktiv) kritisch zu hinterfragen. Aber eine Rechtfertigung? Wohl kaum.
                  Ja, wir können jetzt auch anfangen, jedes "Wort" auf die Gold-Waage zu legen!

                  Ich hatte nicht vor, deine Wort auf die Goldwaage zu legen. Bei mir ist angekommen, was ich angesprochen habe. Wenn du es anders gemeint hast, hat sich das ja erledigt.

                  Du wärst bestimmt der Erste, der einem Newbie erklären würde, wie er sein Homapage-Layout/-Design mittels solcher Techniken realisieren kann, oder?

                  Ich würde so eine Frage nicht beantworten – nicht mein Fachgebiet.

                  Schade! Ich bin bislang immer davon ausgegangen, dass einer der wesentlichen Vorzüge dieses Forums der war, dass man hier u.a. auch über Sinn & Unsinn eines Vorhabens aufgeklärt wird, und einem ggf. "bessere" Alternativen genannt werden.

                  Ich wiederhole mich: es besteht ein Unterschied dazwischen, eine Rechtfertigung zu fordern oder eine bessere Alternative vorzustellen bzw. ein Vorhaben zu hinterfragen.

                  Und überhaupt - haben dich meine Beiträge so "aufgeregt", dass du nicht umhinkamst, darauf zu antworten?

                  Nein, sie haben mich nicht aufgeregt. Ich fand es nur notwendig, darauf einzugehen.

                  Allerdings bin ich der Auffassung, dass sie mehr zum Thema beigetragen haben, als deine Äußerungen hier.

                  Ich hatte nicht die Absicht, etwas zum Thema beizutragen.

                  再见,
                   克里斯蒂安

                  1. echo $begrüßung;

                    » > Mit welchem Recht nimmst du dir heraus, dass sich der OP dir Gegenüber zu rechtfertigen hat? Bist du ihm vorgesetzt?
                    » Nein, und ich nehme mir nicht mehr und nicht weniger heraus, als jeder andere auch hier.
                    Ich habe bisher noch keinen Beitrag gelesen, der eine Rechtfertigung gefordert hat. Aber du kannst mich gerne aufklären.

                    Mir scheint, du hast das Wort rechtfertigen zu sehr in einen falschen Hals bekommen. Gunter hat keine Rechtfertigung gefordert. Nur du hast anscheinend in seiner Aussage

                    Mit diesem Totschlagargument kann man natürlich jeden Mist rechtfertigen.

                    eine Aufforderung herausgelesen und hast dich daran hochgezogen. Und dann ergab ein Wort das andere ...

                    • Themenwechsel -

                    Ich hatte nicht die Absicht, etwas zum Thema beizutragen.

                    Apropos beitragen. Dein Beitrag in Form der Forumssoftware ist ja unbestritten. Leider hat beim letzten Update wieder ein Zitatzeichen-Bug den Weg dahinein gefunden. Wenn ich mich recht erinnere, war er schonmal (vor der langen Zeit der Abstinenz) aufgetaucht und damals beseitigt worden. Vermutlich ist es nun ein Wiederholungstäter. Wenn jemand andere Zitatzeichen konfiguriert hat (meine Vermutung), sind diese teilweise bei älteren Zitaten zu sehen, statt derjenigen, die sich der Anwortende selbst konfiguriert hat. Normalerweise müssten die ja vollständig ausgetauscht werden gegen die, die sich der Antwortende konfiguriert hat. Es ist nur ein Schönheitsfehler. Wenn dir eine Rechtfertigung™ einfällt, dies nicht korrigieren zu $modalverb, dann lass ihn drin.

                    echo "$verabschiedung $name";

                    1. 你好 dedlfix,

                      Ich hatte nicht die Absicht, etwas zum Thema beizutragen.

                      Apropos beitragen. Dein Beitrag in Form der Forumssoftware ist ja unbestritten. Leider hat beim letzten Update wieder ein Zitatzeichen-Bug den Weg dahinein gefunden. Wenn ich mich recht erinnere, war er schonmal (vor der langen Zeit der Abstinenz) aufgetaucht und damals beseitigt worden.

                      Das weiß ich nicht. Allerdings kann ich dir sagen, dass der Fehler behoben ist in Version 3.4.15, die hier allerdings noch nicht installiert wurde. Wann das gemacht wird? Weiss nicht, frag Christian Seiler :)

                      Vermutlich ist es nun ein Wiederholungstäter. Wenn jemand andere Zitatzeichen konfiguriert hat (meine Vermutung), sind diese teilweise bei älteren Zitaten zu sehen, statt derjenigen, die sich der Anwortende selbst konfiguriert hat. Normalerweise müssten die ja vollständig ausgetauscht werden gegen die, die sich der Antwortende konfiguriert hat. Es ist nur ein Schönheitsfehler.

                      Das Problem lag in der Überarbeitung des Posting-Parsers, bei der ich einen Logik-Fehler eingebaut hatte: ich habe immer nur eine Ebene des Zitatzeichens ersetzt. Den Fehler hat Alexander Nitsch behoben, mir war er bis Dato gar nicht aufgefallen :)

                      再见,
                       克里斯蒂安

        2. @Gunther:

          Wenn dir das ganze so nutzlos erscheint und du dich über meine Frage aufregst, dann schreib doch einfach nicht zurück. Ich habe nicht nach dem
          Sinn der Sache gefragt, sondern einfach ob es mölich ist. Ist dir aufgefallen, dass du nie eine Antwort, sondern nur Bewesserwisser Anmerkungen gemacht hast?
          Es gibt User hier, welche einfach eine gescheite Antwort hinschreiben und dazu vielleicht noch eine konstruktive Kritik hinzufügen. (Danke ChrisB) Du hast leider keines von beidem hinbekommen.

          1. @Tyler:

            Wenn dir das ganze so nutzlos erscheint und du dich über meine Frage aufregst, dann schreib doch einfach nicht zurück. Ich habe nicht nach dem
            Sinn der Sache gefragt, sondern einfach ob es mölich ist.

            Dazu hast du doch auch mehr als eine positive Antwort (u.a. *auch* von mir bekommen).
            Trotzdem wirst du ja wohl gestatten, dass man darauf hinweist, dass etwas keinen Sinn macht, weil die Intention, die dahintersteckt, nicht erreicht wird/ werden kann.

            Ist dir aufgefallen, dass du nie eine Antwort, sondern nur Bewesserwisser Anmerkungen gemacht hast?

            Sorry, aber dann kannst du entweder nicht richtig lesen, oder du verstehst meine Anmerkungen nicht. Ich habe dir gleich als erstes eine imho bessere Alternative aufgezeigt. Diese hast du rundweg abgelehnt. Daraufhin habe dir noch eine zweite Alternative genannt (Cookies) und dich darauf hingewiesen, dass du bei deiner Array-Variante evt. auch noch an das Löschen von Einträgen denken solltest.

            Es gibt User hier, welche einfach eine gescheite Antwort hinschreiben und dazu vielleicht noch eine konstruktive Kritik hinzufügen. (Danke ChrisB) Du hast leider keines von beidem hinbekommen.

            Schon OK!
            Tut mir echt leid, dass du deine kostbare Zeit mit dem Lesen meiner völlig nutzlosen Beiträge vergeuden musstest, und diese nicht stattdessen schon auf die Umsetzung deines Vorhabens verwenden konntest.

            Ich werde in Zukunft auch nicht mehr auf irgendeine deiner Fragen antworten - versprochen.

            Gruß Gunther

      2. Hello,

        das mit den verschiedenen Browsern ist mir schon klar. Das ganze soll aber so unkompliziert wie möglich bleiben. D.h. kein Benutzerregistrierung o.ä. Das ganze ist nicht auf meinem Mist gewachsen. Es ist ein Kumpel von mir, der das so will.

        Ist das  ganze mit der Session und dem Array überhaupt möglich?

        Eine Session ist immer auf eine Sitzung bezogen. Das wäre nämlich so ungefähr die deutsche Übersetzung für das Wort. 'Sitzung' bedeutet in diesem Falle, dass nach dem Spülen nichts mehr da sein sollte *äh*, nach dem Schließen des Browsers die Benutzerbezogenen Daten verschwunden sind.

        Du kannst jetzt eine Krücke bauen, die dir für diese niedirgen Anforderungen erstmal ein Stückchen weiter hilft. Das ist kein zuverlässiges und kein ordentliches Verfahren, warum, das magst Du hier bitte im Archiv nachlesen. Aber für die Praxis reicht es hier vermutlich aus:
        Baue Dir eine "IP-Sperre".

        Das bedeutet, dass Du in einer Datei, die durch alle User erreichbar ist, ein Array für die Abstimmungen aufbaust in der Form:

        $_abstimmungen = array();
           $_abstimmungen['name_der_abstimmung'] = array();
           $_abstimmungen['name_der_abstimmung']['IP_des_clients'] = time();

        anstelle von time() könntest Du natürlich auch hinschreiben, wie der Typ gestimmt hat
        Das ist aber günstiger, das Array dann noch zu erweitern

        $_abstimmungen['name_der_abstimmung']['moeglichkeit_1']['IP_des_clients'] = time();
           $_abstimmungen['name_der_abstimmung']['moeglichkeit_2']['IP_des_clients'] = time();
           $_abstimmungen['name_der_abstimmung']['moeglichkeit_3']['IP_des_clients'] = time();

        Der Vorteil dieser Aufteilung lkieget darin, dass man später für die Auswertung nur die Eintragungen in der "Spalte" $_abstimmungen['name_der_abstimmung']['moeglichkeit_3']
        zählen muss mit dem Befehl count()

        http://de3.php.net/manual/en/function.count.php

        Dieses Array kannst Du dann serialisieren mit

        http://de3.php.net/manual/en/function.serialize.php

        und mit

        $fh = fopen( 'pfad_und_name_der_abstimmungsdatei', 'rb+' );
           if ($fh)
           {
               if ( flock( $fh, LOCK_EX )
               {
                   $dateiinhalt = auslesen($fh);     ## Funktion auslesen() musst Du selber schreiben
                   $_abstimmungen = unserialize($dateiinhalt);

        ## wenn Du willst, hier noch prüfen, wenn schon abgestimmt war,
                   ## oder einfach letzte Meinung überschreiben oder hinzufügen:

        $_abstimmungen['name_der_abstimmung']['IP_des_clients'] = time();

        ## Array wieder serialisieren
                   $dateiinhalt = serialize($_abstimmungen);

        ## Dateizeiger an den Anfang der Datei zurück setzen
                   fseek($fh, 0, SEEK_SET);

        ## Dateiinhalt zurückschreiben
                   fwrite($fh, $dateiinhalt);

        ## und Länge der Datei auf neue Arraylänge kürzen, was entfallen kann
                   ## wenn das array immer nur größer werden kann
                   # ftruncate($fh, strlen($dateiinhalt));
               }

        ## und Datei schließen, damit die Inhalte tatsächlich geschrieben werden
               ## und die Datei für den nächsten Wähler freigegeben wird
               flocse($fh);
           }

        http://de3.php.net/manual/en/function.fopen.php
           http://de3.php.net/manual/en/function.flock.php
           http://de3.php.net/manual/en/function.fseek.php
           http://de3.php.net/manual/en/function.fclose.php

        Mit diesen Informationen solltest Du nun zum Ziel kommen. Spenden nehme ich gerne entgegen ;-)

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  2. Hi,

    session_register($voted);

    Dass du diese Funktion nicht mehr benutzen sollst - und was stattdessen - das kannst du im Manual nachlesen.

    $voted = array($n => 1);[/code]

    Hiermit überschreibst du, wenn du das für verschiedene $n aufrufst, immer das Array wieder mit einem neuen, das genau ein Element enthält. Ein zuvor abgelegter Wert geht also an dieser Stelle jedes Mal wieder verloren.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hi,

      »» session_register($voted);

      Dass du diese Funktion nicht mehr benutzen sollst - und was stattdessen - das kannst du im Manual nachlesen.

      »» $voted = array($n => 1);[/code]

      Hiermit überschreibst du, wenn du das für verschiedene $n aufrufst, immer das Array wieder mit einem neuen, das genau ein Element enthält. Ein zuvor abgelegter Wert geht also an dieser Stelle jedes Mal wieder verloren.

      MfG ChrisB

      Hallo Chris,

      wie sieht denn der Code aus, damit ich die vorherigen array-Werte nicht überschreibe??

      1. Hi,

        bitte zitiere vernünftig, nicht einfach alles.

        wie sieht denn der Code aus, damit ich die vorherigen array-Werte nicht überschreibe??

        Du fügst einfach neue Elemente ans Ende das Arrays an - dafür gibt es eine spezielle Schreibweise,
        $arrya[] = $neuesElement
        sowie auch spezielle Funktionen (kannst du bei Interesse selber im Handbuch nachlesen, die simple Schreibweise tut's aber im Allgemeinen auch).

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.