Der Coder^^: Version-Script

Hi,

ich bin am basteln und suche gerade ein Script, das die Version überprüft.
Es soll eine Datei von meinem Haupt-Server öffnet, wo die neueste Version-Zahl drin steht.

  1. ich bin am basteln und suche gerade ein Script, das die Version überprüft.
    Es soll eine Datei von meinem Haupt-Server öffnet, wo die neueste Version-Zahl drin steht.

    Feine Sache. Hast du schon was gefunden?

    1. Feine Sache. Hast du schon was gefunden?

      Ne, aber ich habe mir selbst was überlegt.

      $file = include_once ("http://www.xxx.de/update/update.php");

      $version = 1.0;

      if(!$file) {
      echo 'Version überprüfung könnte nicht durch geführt werden';

      } else {

      if($version == 2.0) {
      echo 'Du hast die neueste Version';
      } else {
      echo 'Du hast nicht die neueste Version';
      echo '</br>';
      echo 'Lade sie dir auf';
      echo $dl;
      echo 'runter';
      }
      }
      ?>
      Aber bei meinem Script bricht der immer ab.
      oder es kommt das:

      Warning: include_once() [function.include-once]: URL file-access is disabled in the server configuration in /usr/export/www/hosting/xxx/admin/admin_update.php on line 2

      Warning: include_once(http://www.xxx.de/update/update.php) [function.include-once]: failed to open stream: no suitable wrapper could be found in /usr/export/www/hosting/xxx/admin/admin_update.php on line 2

      Warning: include_once() [function.include]: Failed opening 'http://www.xxx.de/update/update.php' for inclusion (include_path='.:') in /usr/export/www/hosting/xxx/admin/admin_update.php on line 2
      Version überprüfung könnte nicht durch geführt werden

      1. Hallo,

        $file = include_once ("http://www.xxx.de/update/update.php");

        du hast offensichtlich ein Problem: Du willst eine Ressource von einem fremden Server einbinden, dein Hoster verbietet dir aber den Zugriff auf HTTP-Ressourcen mit den Dateifunktionen.

        $version = 1.0;

        if(!$file) {
        echo 'Version überprüfung könnte nicht durch geführt werden';

        } else {

        if($version == 2.0) {

        Denkfehler??
        Erst setzt du $version fest auf 1.0, dann fragst du auf 2.0 ab?

        echo 'Du hast die neueste Version';
        } else {
        echo 'Du hast nicht die neueste Version';
        echo '</br>';
        echo 'Lade sie dir auf';
        echo $dl;
        echo 'runter';

        Wo kommt $dl her?

        Warning: include_once() [function.include-once]: URL file-access is disabled in the server configuration in /usr/export/www/hosting/xxx/admin/admin_update.php on line 2

        Warning: include_once(http://www.xxx.de/update/update.php) [function.include-once]: failed to open stream: no suitable wrapper could be found in /usr/export/www/hosting/xxx/admin/admin_update.php on line 2

        Warning: include_once() [function.include]: Failed opening 'http://www.xxx.de/update/update.php' for inclusion (include_path='.:') in /usr/export/www/hosting/xxx/admin/admin_update.php on line 2

        Die erste Fehlermeldung sagt ja schon ziemlich genau, was Sache ist (ich hab's dir ja eingangs nochmal erklärt). Die anderen beiden sind nur Folgefehler.

        So long,
         Martin

        --
        Ich wollt', ich wär ein Teppich.
        Dann könnte ich morgens liegenbleiben.
        1. $dl kommt von der datei die er öffnen sollte und die Version 2.0 solle eingelich auch eine Variable sein.

      2. Hi Coder,

        $file = include_once ("http://www.xxx.de/update/update.php");

        STOP! Niemals so etwas machen!

        include_once() interpretiert den eingelesenen Text als PHP-Code. Auch wenn diese Website im Moment vielleicht nur eine Zahl "1.0" zurückgibt, könnte es sein, dass diese fremde Website mal gehackt wird und dann "<?php do_something(); ?>" zurückgibt und das würde dein Script dann ausführen. Somit stellt dieser Code eine große Sicherheitslücke dar, da sich (zumindest theoretisch) beliebiger Programmcode einschleusen lässt.

        Zusätzlich ist in aktuellen PHP-Versionen die Konfigurations-Option allow_url_include standardmäßig auf Off gesetzt, wodurch obiger Code nicht funktionieren wird.

        In diesem Fall würde ich dir raten, die Funktion file_get_contents() zu nutzen - dies funktioniert allerdings nur, wenn allow_url_foben auf On gesetzt ist, was standardmäßig jedoch der Fall ist. Sollte dir dein Provider auch dies deaktiviert haben, so bleibt dir lediglich die Möglichkeit mit fsockopen() eine Verbindung zum Zielserver zu öffnen und die HTTP-Kommunikation selbst durchzuführen. Es gibt z.B. mit Zend_Http_Client fertige Klassen, welche dir die Arbeit wesentlich erleichtern.

        Beispiele:

        // Verwendung von file_get_contents()  
        $latestVersion = file_get_contents('http://example.org/update.php');  
          
        // Verwendung von Zend_Http_Client  
        require_once('Zend/Http/Client.php');  
        $client = new Zend_Http_Client('http://example.org/update.php');  
        $latestVersion = $client->request();
        

        Viele Grüße,
          ~ Dennis.

        1. Hi Dennis,

          ich habe das jetzt so gemacht.
          <?php
          //Version-test.php
          $latestVersion = file_get_contents('http://xxx.de/update/update.php');
          $client = 1.0;

          if($client = $lastVersion)
          {
          echo 'geht';
          } else {
          echo 'geht nicht';
          }
          ?>

          <?php
          //update.php
          $lastVersion = 1.0;
          ?>
          Es kommt:
          Notice: Undefined variable: lastVersion in /data/apache/users/xxx/xxx/www/admin/admin_update.php on line 5
          geht nicht

          Was muss ich machen damit er die Variable erkennt?

          1. Hallo,

            <?php
            1  //Version-test.php
            2  $latestVersion = file_get_contents('http://xxx.de/update/update.php');
            3  $client = 1.0;
            4
            5  if($client = $lastVersion)

            Notice: Undefined variable: lastVersion in /data/apache/users/xxx/xxx/www/admin/admin_update.php on line 5

            hier willst du $client den aktuellen Wert von $lastVersion zuweisen[*], diese Variable ist aber nirgends vorher definiert worden. Die Ähnlichkeit mit $latestVersion ist zwar verblüffend, aber "ähnlich" reicht nicht.

            So long,
             Martin

            [*] Du möchtest vermutlich vergleichen, nicht zuweisen.

            --
            Wichtig ist, was hinten rauskommt.
              (Helmut Kohl, 16 Jahre deutsche Bundesbirne)
            1. <?php  
              //Version-test.php  
              $latestVersion = file_get_contents('http://xxx.de/update/update.php');  
              $client = 1.0;  
                
              if($client == $lastVersion)  
              {  
              echo 'geht';  
              } else {  
              echo 'geht nicht';  
              }  
              ?>  
                
              <?php  
              //update.php  
              $lastVersion = 1.0;  
              ?>  
              
              

              So das sollte ein Fehler beheben aber wie soll ich das jetzt machen?

              1. Hi Coder,

                //Version-test.php
                $latestVersion = file_get_contents('http://xxx.de/update/update.php');

                ^^^^^^
                Merk dir mal genau die Schreibweise, und dann…

                $client = 1.0;

                if($client == $lastVersion)

                ^^^^
                …schau mal hier.

                Fällt dir jetzt was auf? ;-)

                Abgesehen davon würde ich dir raten, am Anfang des Scriptes die Version als String zu notieren statt als Float, da die Rückgabe der abgerufenen Ressource ebenfalls ein String ist.

                $client = "1.0";

                So sollte das aussehen. (Beachte die Anführungszeichen drumrum.)

                Viele Grüße,
                  ~ Dennis.

                1.   
                  <?php  
                  $latestVersion = file_get_contents('http://example.de/update/update.php');  
                  $client =  "1.0";  
                    
                    
                  if($client == $latestVersion)  
                  {  
                  echo 'geht';  
                  } else {  
                  echo 'geht nicht';  
                  }  
                  ?>  
                    
                  <?php  
                  $latestVersion = 1.0;  
                  ?>  
                  
                  

                  es kommt jetzt:
                  geht nicht
                  was mache ich jetzt falsch?

                  1. Mahlzeit Der Coder^^,

                    if($client == $latestVersion)

                    [...]

                    was mache ich jetzt falsch?

                    Hast Du mal ne Glaskugel? Dann könnte ich es Dir sagen ... bist Du mal auf die Idee gekommen, einfach die Inhalte der beiden Variablen, die Du miteinander vergleichst, zur Kontrolle per echo auszugeben?

                    MfG,
                    EKKi

                    --
                    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                  2. $latestVersion = file_get_contents('http://example.de/update/update.php');

                    Ergibt nach deiner Aussage "2.0"

                    $client =  "1.0";
                    if($client == $latestVersion)

                    Also steht da "1.0 == 2.0"
                    Also ist doch klar, dass das "else" ausgeführt wird. Also wo dein Problem?

              2. Hallo,

                sorry - deinen wesentlichen Fehler habe ich vorher gar nicht wahrgenommen.

                <?php
                //Version-test.php
                $latestVersion = file_get_contents('http://xxx.de/update/update.php');

                Mal abgesehen davon, dass ich nicht weiß, was du bei einer von einem Niederländer bei Versatel gehosteten Erotikseite abfragen willst: Du bekommst mit dieser Anweisung nur den *Output* der update.php in deine Variable $latestVersion zugewiesen.
                Nebenbei bemerkt dämmert mir nun so langsam, dass du die Domain xxx.de nur als Platzhalter verwendest. Bitte, zum 761. Mal, liebe Leute: Verwendet für Beispiele bitte NUR DIE DAFÜR VORGESEHENEN DOMAINS example.com, example.org oder example.net, anstatt willkürlich ausgedachter Namen, die vielleicht wirklich existieren - wie in diesem Beispiel eine Pornoseite (was angesichts des "xxx" eigentlich naheliegend war)!

                Solltest du mit diesem Platzhalter aber tatsächlich deine eigene Domain meinen, dann ist mir schleierhaft, wieso du hier über das HTTP-Protokoll auf die Dateien zugreifst, anstatt direkt über das Dateisystem. Denn dadurch wird, wie ich oben schon andeutete, zwar der darin enthaltene PHP-Code ausgeführt, aber völlig losgelöst vom aufrufenden Script, da dieser Zugriff einen eigenständigen HTTP-Request darstellt.

                <?php
                //update.php
                $lastVersion = 1.0;
                ?>

                Wenn du dieses Miniscript nun wirklich als Datei includieren würdest, anstatt als HTTP-Ressource, dann würde die Variable $lastVersion auch im aufrufenden Scriptteil zur Verfügung stehen. So wie du es jetzt machst (also mit file_get_contents() über HTTP), müsste update.php die Versionsnummer *ausgeben*, so dass du sie im übergeordneten Script als Ergebnis von file_get_contents() abfragen kannst. Wenn du schließlich mit file_get_contents() direkt auf die Datei zugreifst, bekommst du als Ergebnis ihren *Inhalt*, ohne dass der noch irgendwie interpretiert wird.

                Ciao,
                 Martin

                --
                "Drogen machen gleichgültig."
                 - "Na und? Mir doch egal."
                1. Wenn du dieses Miniscript nun wirklich als Datei includieren würdest, anstatt als HTTP-Ressource, dann würde die Variable $lastVersion auch im aufrufenden Scriptteil zur Verfügung stehen. So wie du es jetzt machst (also mit file_get_contents() über HTTP), müsste update.php die Versionsnummer *ausgeben*, so dass du sie im übergeordneten Script als Ergebnis von file_get_contents() abfragen kannst. Wenn du schließlich mit file_get_contents() direkt auf die Datei zugreifst, bekommst du als Ergebnis ihren *Inhalt*, ohne dass der noch irgendwie interpretiert wird.

                  Wie includiere ich die das als Datei?
                  Oder wie mache ich das die Versionsnummer über HTTP ausgegeben wird?

                  1. Mahlzeit Der Coder^^,

                    Wie includiere ich die das als Datei?

                    Anscheinend gar nicht (die Erklärung findest Du hier).

                    Oder wie mache ich das die Versionsnummer über HTTP ausgegeben wird?

                    Z.B. mit der dafür von PHP vorgesehenen Funktionalität: echo

                    MfG,
                    EKKi

                    --
                    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                  2. Hallo

                    ... Wenn du schließlich mit file_get_contents() direkt auf die Datei zugreifst, bekommst du als Ergebnis ihren *Inhalt*, ohne dass der noch irgendwie interpretiert wird.

                    Wie includiere ich die das als Datei?

                    Noch mal von ganz vorne:

                    1. Du hast eine Textdatei, in der nichts anderes als eine Zeichenkette (String) mit einer Versionsnummer steht? Dann lade ihren Inhalt mit file_get_contents() als Zeichenkette in das Skript.

                    2. Die nämliche Textdatei liegt auf deinem eigenen Webspace/Server? Dann versuche nicht, sie per HTTP zu laden, sondern tue dies über das lokale Dateisystem des Webservers. Mit $_SERVER["DOCUMET_ROOT"] kannst du den lokalen Pfad des Servers zum Wurzelverzeichnis deiner Website ermitteln. Alle weiteren Verzeichnisse innerhalb der Seite, inklusive desjenigen, in dem die Textdatei liegt, sollten dir bekannt sein.

                    Der komplette Aufruf könnte demnach so aussehen:

                    $versionsnummer = file_get_contents($_SERVER["DOCUMET_ROOT"]."/pfad/innerhalb/der/seite/version.txt");

                    Oder wie mache ich das die Versionsnummer über HTTP ausgegeben wird?

                    Ich befürchte, du verstehst da was falsch. Alles, was vor der Übertragung der angeforderten (und in deinem Fall mit PHP generierten) Webseite (das ist der HTTP-Part) auf dem Server geschieht, hat nichts mit HTTP zu tun, sondern geschieht im dortigen lokalen Kontext.

                    Tschö, Auge

                    --
                    Die deutschen Interessen werden am Liechtenstein verteidigt.
                    Veranstaltungsdatenbank Vdb 0.2