Ankündigung

Einklappen
Keine Ankündigung bisher.

php-Datei arbeitet bei Aufruf über include nicht richtig

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Ich versuche nun, selber einen Counter zu programmieren. Die Frage ist aber, ob ich hier bei Bedarf überhaupt Hilfe bekomme, denn als Einsteiger bin ich weiß Gott nicht auf einem Level mit Code von Google, was ja aber - wenn ich das nicht falsch verstanden habe - Voraussetzung ist, damit man hier Hilfe bekommt. Naja, sei es drum, der aktuelle Code ist noch nicht lauffähig, höchstens eine Idee von Code, aber meine Frage von eben steht im Raum: Welche Kriterien muss ich bzw. mein Quellcode erfüllen, damit ich hier auf Unterstützung hoffen kann?

    Danke schonmal im Vorraus!

    PHP-Code:
    <?php

    // Belegen der Variablen
    $dbadress "";
    $dbname "";
    $dbusername "";
    $dbpassword "";

    $remoteaddr $_SERVER['REMOTE_ADDR']
    $tempvisit getdate()
    $nowvisit $tempvisit[0]

    /* Datenbankdesign:
    Eine Tabelle "counterdata" mit 3 Spalten: ID(autoincrement), IP-Adresse, DatumUhrzeitStempel
    Eine weitere Tabelle "visits" mit einer Spalte: ID(autoincrement)
    Erstere dient dem Ausschluss von IP-Adressen als neuer Besuch, falls der vergangene zu kurz zurückliegt.
    Zweitere wird immer um 1 erhöht, wenn die IP-Adresse des aktuellen Besuchers nach IP-Adress-Prüfung nicht in der Tabelle counterdata existiert. */

    /* TODOS
    Testumgebung (xampp) aufsetzen
    Testtabelle anlegen (Wie?)
    Autoincrement Handling recherchieren und einsetzen
    "There was an error running the query" - Zeilen verbessern für spätere Fehlersuche
    Umbau in Funktionen zum bequemen Aufruf einzelner Teile bei Bedarf
    TESTEN */

    // Verbindung zur Datenbank aufbauen
    dbconnection = new mysqli('$dbadress''$dbusername''$dbpassword''$dbname');
    if(
    $dbconnection->connect_errno 0){
        die(
    'Unable to connect to database [' $dbconnection->connect_error ']');
    }

    // Einträge älter als 1 Stunde löschen
    $deletetimestamp $nowvisit 3600
    $sql 
    '
        DELETE *
        FROM `counterdata`
        WHERE lastvisit <= '
    $deletetimestamp'
        '
    ;

    if(!
    $result $dbconnection->query($sql)){
        die(
    'There was an error running the query [' $dbconnection->error ']');
    }

    /* wird nicht mehr benötigt
    // Inhalt der Tabelle "counterdata" auslesen
    $sql = '
        SELECT id, ipaddr, lastvisit
        FROM `counterdata`
        ';

    if(!$result = $dbconnection->query($sql)){
        die('There was an error running the query [' . $dbconnection->error . ']');
    }

    // Überprüfung auf den Zeitstempel
    while($row = $result->fetch_assoc()){
        if(($nowvisit-$row['lastvisit'])>3600){
            // TODO: Eintrag älter als 1 Stunde -> Eintrag löschen
    }
    */

    // Aktualisierten Datensatz abrufen
    $sql '
        SELECT id, ipaddr, lastvisit
        FROM `counterdata`
        '
    ;

    if(!
    $result $dbconnection->query($sql)){
        die(
    'There was an error running the query [' $dbconnection->error ']');
    }

    // Überprüfung auf die IP-Adresse
    while($row $result->fetch_assoc()){
        if((
    $nowvisit-$row['ipaddr']=='$remoteaddr'){
            
    // TODO Aktuellen Zeitstempel setzen
            
    $sql '
            UPDATE counterdata
            SET lastvisit = '
    $nowvisit'
            WHERE ipaddr = '
    $remoteaddr'
            '
    ;

            if(!
    $result $dbconnection->query($sql)){
                die(
    'There was an error running the query [' $dbconnection->error ']');
            }
        } else {
            
    // Aktuelle IP-Adresse nicht vorhanden
            // Zeile in Datenbank hinzufügen und Counter erhöhen
            
    $dbinsert '
            INSERT INTO counterdata
                (
                    id,
                    ipaddr,
                    lastvisit
                )
            VALUES
                (
                    '',
                    '
    $remoteaddr',
                    '
    $nowvisit'
                )
            '
    ;

            if(!
    $result $dbconnection->query($dbinsert)){
                die(
    'There was an error running the query [' $dbconnection->error ']');
            }

            
    // Visits um 1 erhöhen

            
    $dbinsert '
            INSERT INTO visits
                (
                    id
                )
            VALUES
                (
                    '',
                )
            '
    ;

            if(!
    $result $dbconnection->query($sql)){
                die(
    'There was an error running the query [' $dbconnection->error ']');
            }
        }
    }

    // Datenbankverbindung schliessen
    $dbconnection->close();

    ?>
    Nachtrag - falls sich jemand den Quellcode bereits ansieht: Ich glaube, einmal auslesen reicht, wenn ich davor per delete und passenden Parametern die alten Zeilen lösche.

    Kommentar


    • #17
      Wenn du nur ermitteln möchtest welche IP bei dir schon mal war warum speicherst du nicht einfach diese IP auf dem Server.
      Bei jeden Besuch schaust du nach ob die IP schon gespeichert ist.

      Hier mal als Ansatz ein lauffähiges Beispiel mit einer PHP Cache Class:
      PHP-Code:
      <?php
      //erster Besuch einer Seite mit IP-Ident
      require '../../class/class.varcache.php';    //Klasse einbinden, Pfad anpassen

      //Instanz erstellen, Datei usercounter.dat zur Speicherung benutzen
      $cache = new varCache('usercounter.dat');

      $remoteaddr $_SERVER['REMOTE_ADDR'];

      //Sperre aktivieren, damit zwischen get() und set() kein anderes Script die Werte ändern kann
      $cache->lock();

      if(
      $cache->exists($remoteaddr)) {
        
      //IP vorhanden
        
      $datum $cache->get($remoteaddr);
        echo 
      'Hallo<br>Ein Besucher mit der IP '.$remoteaddr.' war das erste mal am '.date('d.m.Y H:i',strtotime($datum)).' hier.';
      }
      else { 
          echo 
      'Die IP '$remoteaddr ' ist neu!';
          
      //Daten speichern
          
      $cache->set($remoteaddr,date('Y-m-d H:i'));
      }
      //Sperre aufheben
      $cache->unlock();
      Die Nutzung einer Datenbank ist vom Grundsatz die bessere Lösung, wenn du doch mehr Informationen haben möchtest.

      Kommentar


      • #18
        Hi zusammen,

        Habe nun lauffähigen Code geschrieben. Leider bleibt meine Tabelle komplett leer. Eine Fehlermeldung erhalte ich aber nicht. Hat jemand eine Idee?
        Vielen Dank schonmal vorab!

        PS: Soll ich dafür ein neues Thema erstellen? Mit dem alten Inhalt hat das ja nichts mehr zu tun.

        PHP-Code:
        <?php

        // Belegen der Variablen
        $dbadress 'localhost';
        $dbname 'counter1';
        $dbusername 'Armin';
        $dbpassword 'popo123';

        $remoteaddr $_SERVER['REMOTE_ADDR'];
        $tempvisit getdate();
        $nowvisit $tempvisit[0];

        /* Datenbankdesign:
        Eine Tabelle "counterdata" mit 3 Spalten: ID(autoincrement), IP-Adresse, DatumUhrzeitStempel
        Eine weitere Tabelle "visits" mit einer Spalte: ID(autoincrement)
        Erstere dient dem Ausschluss von IP-Adressen als neuer Besuch, falls der vergangene zu kurz zurückliegt.
        Zweitere wird immer um 1 erhöht, wenn die IP-Adresse des aktuellen Besuchers nach IP-Adress-Prüfung nicht in der Tabelle counterdata existiert. */

        /* TODOS
        Autoincrement Handling recherchieren und einsetzen
        "There was an error running the query" - Zeilen verbessern für spätere Fehlersuche
        Umbau in Funktionen zum bequemen Aufruf einzelner Teile bei Bedarf
        TESTEN */

        // Verbindung zur Datenbank aufbauen
        $dbconnection = new mysqli($dbadress$dbusername$dbpassword$dbname);
        if(
        $dbconnection->connect_errno 0){
            die(
        'Unable to connect to database [' $dbconnection->connect_error ']');
        }

        // Einträge älter als 1 Stunde löschen
        $deletetimestamp $nowvisit 3600;
        $sql '
            DELETE
            FROM `counterdata`
            WHERE lastvisit <= '
        .$deletetimestamp.'
            '
        ;

        if(!
        $result $dbconnection->query($sql)){
            die(
        'There was an error running the query [' $dbconnection->error ']');
        }

        // Aktualisierten Datensatz abrufen
        $sql '
            SELECT id, ipaddr, lastvisit
            FROM `counterdata`
            '
        ;

        if(!
        $result $dbconnection->query($sql)){
            die(
        'There was an error running the query [' $dbconnection->error ']');
        }

        // Überprüfung auf die IP-Adresse
        while($row $result->fetch_assoc()){
            if(
        $nowvisit-$row['ipaddr']=='$remoteaddr'){
                
        // TODO Aktuellen Zeitstempel setzen
                
        $sql '
                UPDATE `counterdata`
                SET lastvisit = '
        .$nowvisit.'
                WHERE ipaddr = '
        .$remoteaddr.'
                '
        ;

                if(!
        $result $dbconnection->query($sql)){
                    die(
        'There was an error running the query [' $dbconnection->error ']');
                }
            } else {
                
        // Aktuelle IP-Adresse nicht vorhanden
                // Zeile in Datenbank hinzufügen und Counter erhöhen
                
        $dbinsert '
                INSERT INTO `counterdata`
                    (
                        ipaddr,
                        lastvisit
                    )
                VALUES
                    (
                        '
        .$remoteaddr.',
                        '
        .$nowvisit.'
                    )
                '
        ;

                if(!
        $result $dbconnection->query($dbinsert)){
                    die(
        'There was an error running the query [' $dbconnection->error ']');
                }

                
        // Visits um 1 erhöhen

                
        $dbinsert '
                INSERT INTO `visits`
                    (
                    )
                VALUES
                    (
                    )
                '
        ;

                if(!
        $result $dbconnection->query($sql)){
                    die(
        'There was an error running the query [' $dbconnection->error ']');
                }
            }
        }

        $result->free();

        // Aktuelle Counterzahl anzeigen
        $sql '
            SELECT id
            FROM `visits`
            '
        ;

        if(!
        $result $dbconnection->query($sql)){
            die(
        'There was an error running the query [' $dbconnection->error ']');
        }

        $currentcount $result->num_rows;

        // Datenbankverbindung schliessen
        $dbconnection->close();

        echo 
        'Counter: ' $currentcount;

        ?>
        So sieht meine Tabelle aus:
        Code:
        CREATE DATABASE counter1;
        
        CREATE TABLE counterdata (
        id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        ipaddr VARCHAR(30) NOT NULL,
        lastvisit TIMESTAMP NOT NULL
        );
        
        CREATE TABLE visits (
        id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY
        );
        
        ALTER TABLE `counterdata` CHANGE `lastvisit` `lastvisit` TIMESTAMP on update CURRENT_TIMESTAMP NULL DEFAULT NULL;

        Kommentar


        • #19
          Zitat von jspit Beitrag anzeigen
          Wenn du nur ermitteln möchtest welche IP bei dir schon mal war warum speicherst du nicht einfach diese IP auf dem Server.
          Bei jeden Besuch schaust du nach ob die IP schon gespeichert ist.

          [...]

          Die Nutzung einer Datenbank ist vom Grundsatz die bessere Lösung, wenn du doch mehr Informationen haben möchtest.
          Hi jspit, vielen Dank für die Idee mit dem Cache. Kann ich darauf von allen Stellen auf meiner Seite aus drauf zugreifen?
          Kann ich alte Einträge aus dem Cache löschen, ohne die neueren auch mit zu verwerfen?

          Der Counter soll am Ende mehrere Zwecke erfüllen:

          Besuch nach mehr als einer Stunde wird als neuer Besuch gewertet -> Aufzeichnung Besucher anhand der IP-Adresse
          IP-Adressen, die in der letzten Stunde auf der Hauptseite waren, bekommen einen div-Container nicht angezeigt.
          Zu diesem Zweck will ich den Code noch in Funktionen verschieben, aber erst, wenn er das tut, was er soll.

          Der aktuelle Code waren irgendwas zwischen 3,5 und 4,5 Stunden Arbeit, im Optimalfall krieg ich das zum Fliegen, damit die ganze Arbeit nicht umsonst war^^

          Kommentar


          • #20
            Zitat von Weisgarnix Beitrag anzeigen

            Der Counter soll am Ende mehrere Zwecke erfüllen:
            Wenn du mehr machen möchtest ist der Weg über eine Datenbank der bessere. Machbar ist das auch mit der Cacheklasse, doch die Datenbanklösung ist besser ausbaubar.
            Daher verfolge deinen Weg weiter!
            Ein Gedanke noch: Reicht nicht eine SQLite-DB für diese Zwecke?

            Was die Fragen zur Cache-Klasse betrifft, siehe obigen Link.

            Kommentar


            • #21
              SQLite wollte ich auch gerade empfehlen.

              Weiters noch ein Hinweis: Statt das hier immer und immer zu wiederholen:
              PHP-Code:
                // ...
                
              die('There was an error running the query [' $dbconnection->error ']');
                
              // ...
                
              die('There was an error running the query [' $dbconnection->error ']');
                
              // ...
                
              die('There was an error running the query [' $dbconnection->error ']');
                
              // ...
                
              die('There was an error running the query [' $dbconnection->error ']');
                
              // ... 
              Kannst du auch den zentralen Schalter von mysqli nutzen. Dann sparst du dir das oben alles und kannst an einer Stelle das für den produktiven Betrieb dann "stumm" Schalten. https://php-de.github.io/jumpto/sql/#zentral
              Dort auf php.net ist auch ein Beispiel dazu, wie du den Schalter nach dem Connect richtig nutzen kannst.

              LG
              The string "()()" is not palindrom but the String "())(" is.

              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #22
                Noch ein Hinweis am Rande: die IP-Adresse sollte nicht dafür genutzt werden um Nutzer zu identifizieren.
                [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                Kommentar


                • #23
                  Zitat von jspit Beitrag anzeigen
                  Wenn du mehr machen möchtest ist der Weg über eine Datenbank der bessere. Machbar ist das auch mit der Cacheklasse, doch die Datenbanklösung ist besser ausbaubar.
                  Daher verfolge deinen Weg weiter!
                  Ein Gedanke noch: Reicht nicht eine SQLite-DB für diese Zwecke?

                  Was die Fragen zur Cache-Klasse betrifft, siehe obigen Link.
                  Wenn ich den Code lauffähig habe und dazu komme, würde ich es vielleicht auf PDO umstellen, aber erst einmal möchte ich, dass er grundsätzlich lauffähig ist, da die Seite, für die ich die Aufrufe sehen und die Hauptseite sowieso bereits online sind oO^^
                  PDO müsste dann ja für mein Verständnis auf gegen eine SQLite-DB laufen können. Aber wie gesagt, stelle ich hinten an.

                  Zitat von hausl Beitrag anzeigen
                  [...]Kannst du auch den zentralen Schalter von mysqli nutzen.[...]
                  Verstehe ich das richtig, dass ich mir damit alle "die (...)" - Zeilen bei den query-Befehlen sparen kann und stattdessen nur einmal zentral ganz am Anfang über den FLAG der Funktion
                  PHP-Code:
                  mysqli_report(MYSQLI_REPORT_ALL); 
                  das alles erledigen kann, also auch das if selber bei der Abfrage wegfällt? Ich bin hier ja prozedural unterwegs, da finde ich nur einmalig den Befehl am Anfang des Codes.

                  Zitat von lottikarotti Beitrag anzeigen
                  Noch ein Hinweis am Rande: die IP-Adresse sollte nicht dafür genutzt werden um Nutzer zu identifizieren.
                  Wenn ich nicht irgend eine Vorgehensweise nicht bedacht habe, müsste ich dann aber auf Clientseite Daten zwischenspeichern, was ich nicht möchte, bisher kommt die Seite komplett ohne Cookies aus. Und der Counter ist mir auch rein auf IP-Basis für seine Zwecke ausreichend.

                  Kommentar


                  • #24
                    Verstehe ich das richtig,
                    Jein. Kurz gesagt: Connect, Connect prüfen, Error Mode setzen. Fertig.

                    Schau dir doch bitte das Beispiel an http://php.net/manual/de/mysqli-driv...-mode-examples steht alles in der Doku, das muss man hier hier alles nicht widerkauen. Dort steht alles nötige.

                    nd der Counter ist mir auch rein auf IP-Basis für seine Zwecke ausreichend.
                    Bedenke das zB alle Leute einer Firma warscheinlich die selbe externe IP haben werden. Ebenso daheim bei dir.. Alle Geräte der Familie im WLAN haben nach aussen die Selbe IP etc etc. Dh. du zählst dann in Wahrheit den "Internetanschluss" von jemanden aber nicht die tatsächlichen Zugriffe. Ist halt eine unschärfe. Und IPs sind auch manipulierbar. Opera zB hat schon gratis VPN mit an Board etc etc..
                    The string "()()" is not palindrom but the String "())(" is.

                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #25
                      Ok, habe beim connect das errorhandling aus dem Beispiel herangezogen. Und schon stehe ich vor der nächsten Hürde: Nun erhalte ich eine Fehlermeldung, werde aber auch mit Google nicht wirklich schlau draus. Wenn ich es richtig verstehe, erhalte ich die Fehlermeldung wegen fehlender Indizes. Ich weiß nicht, was das bedeuten soll

                      PHP-Code:
                      <?php

                      // Belegen der Variablen
                      $dbadress 'localhost';
                      $dbname 'counter1';
                      $dbusername 'Armin';
                      $dbpassword 'popo123';

                      $remoteaddr $_SERVER['REMOTE_ADDR'];
                      $tempvisit getdate();
                      $nowvisit $tempvisit[0];

                      // Reporting aktivieren / deaktivieren
                      // http://php.net/manual/de/mysqli-driver.report-mode.php
                      // ..._OFF, ..._ERROR, ..._STRICT, ..._INDEX, ..._ALL
                      mysqli_report(MYSQLI_REPORT_ALL);

                      /* Datenbankdesign:
                      Eine Tabelle "counterdata" mit 3 Spalten: ID(autoincrement), IP-Adresse, DatumUhrzeitStempel
                      Eine weitere Tabelle "visits" mit einer Spalte: ID(autoincrement)
                      Erstere dient dem Ausschluss von IP-Adressen als neuer Besuch, falls der vergangene zu kurz zurückliegt.
                      Zweitere wird immer um 1 erhöht, wenn die IP-Adresse des aktuellen Besuchers nach IP-Adress-Prüfung nicht in der Tabelle counterdata existiert. */

                      /* TODOS
                      Autoincrement Handling recherchieren und einsetzen
                      "There was an error running the query" - Zeilen verbessern für spätere Fehlersuche
                      Umbau in Funktionen zum bequemen Aufruf einzelner Teile bei Bedarf
                      TESTEN */

                      // Verbindung zur Datenbank aufbauen
                      $dbconnection mysqli_connect($dbadress$dbusername$dbpassword$dbname);
                      if (
                      mysqli_connect_errno()) {
                          
                      printf("Connect failed: %s\n"mysqli_connect_error());
                          exit();
                      }

                      // Einträge älter als 1 Stunde löschen
                      $deletetimestamp $nowvisit 3600;
                      $sql '
                          DELETE
                          FROM `counterdata`
                          WHERE lastvisit <= '
                      .$deletetimestamp.'
                          '
                      ;

                      $result $dbconnection->query($sql);

                      // Aktualisierten Datensatz abrufen
                      $sql '
                          SELECT id, ipaddr, lastvisit
                          FROM `counterdata`
                          '
                      ;

                      $result $dbconnection->query($sql);

                      // Überprüfung auf die IP-Adresse
                      while($row $result->fetch_assoc()){
                          if(
                      $nowvisit-$row['ipaddr']=='$remoteaddr'){
                              
                      // TODO Aktuellen Zeitstempel setzen
                              
                      $sql '
                              UPDATE `counterdata`
                              SET lastvisit = '
                      .$nowvisit.'
                              WHERE ipaddr = '
                      .$remoteaddr.'
                              '
                      ;

                              
                      $result $dbconnection->query($sql);
                          } else {
                              
                      // Aktuelle IP-Adresse nicht vorhanden
                              // Zeile in Datenbank hinzufügen und Counter erhöhen
                              
                      $dbinsert '
                              INSERT INTO `counterdata`
                                  (
                                      ipaddr,
                                      lastvisit
                                  )
                              VALUES
                                  (
                                      '
                      .$remoteaddr.',
                                      '
                      .$nowvisit.'
                                  )
                              '
                      ;

                              
                      $result $dbconnection->query($dbinsert);

                              
                      // Visits um 1 erhöhen

                              
                      $dbinsert '
                              INSERT INTO `visits`
                                  (
                                  )
                              VALUES
                                  (
                                  )
                              '
                      ;

                              
                      $result $dbconnection->query($sql);
                          }
                      }

                      $result->free();

                      // Aktuelle Counterzahl anzeigen
                      $sql '
                          SELECT id
                          FROM `visits`
                          '
                      ;

                      $result $dbconnection->query($sql);

                      $currentcount $result->num_rows;

                      $result->free();

                      // Datenbankverbindung schliessen
                      $dbconnection->close();

                      echo 
                      'Counter: ' $currentcount;

                      ?>
                      Code:
                      Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'No index used in query/prepared statement DELETE FROM `counterdata` WHERE lastvisit <= 1506497211 ' in C:\Users\asw\CloudStation\Programmierung\Web\xampp\htdocs\counter\index.php:45 Stack trace: #0 C:\Users\asw\CloudStation\Programmierung\Web\xampp\htdocs\counter\index.php(45): mysqli->query('\r\n DELETE\r\n ...') #1 {main} thrown in C:\Users\asw\CloudStation\Programmierung\Web\xampp\htdocs\counter\index.php on line 45
                      Hab ich es jetzt etwa erst falsch eingebaut oder stimmt was mit meiner Tabelle nicht? Meinen die mit Index die id-Spalte?

                      Kommentar


                      • #26
                        Setzt mal auf MYSQLI_REPORT_ERROR

                        https://stackoverflow.com/a/5580087
                        The string "()()" is not palindrom but the String "())(" is.

                        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                        PHP.de Wissenssammlung | Kein Support per PN

                        Kommentar


                        • #27
                          Vielen Dank, jetzt wird die Meldung nicht mehr angezeigt und es erscheint wieder der Counter. Also hab ichs doch richtig eingebaut und lies mir lediglich bisschen arg viel anzeigen mit dem _ALL. Die Tabelle bleibt aber weiterhin komplett unberührt, also funktioniert irgendetwas nicht Ich verstehs nicht, selbst wenn der DELETE zu viel - alles von mir aus - löscht, ich schreib doch danach was rein und les es aus, warum bleibt die Tabelle dann so leer?

                          PHP-Code:
                          <?php

                          // Belegen der Variablen
                          $dbadress 'localhost';
                          $dbname 'counter1';
                          $dbusername 'Armin';
                          $dbpassword 'popo123';

                          $remoteaddr $_SERVER['REMOTE_ADDR'];
                          $tempvisit getdate();
                          $nowvisit $tempvisit[0];

                          // Reporting aktivieren / deaktivieren
                          // http://php.net/manual/de/mysqli-driver.report-mode.php
                          // ..._OFF, ..._ERROR, ..._STRICT, ..._INDEX, ..._ALL
                          mysqli_report(MYSQLI_REPORT_ERROR);

                          /* Datenbankdesign:
                          Eine Tabelle "counterdata" mit 3 Spalten: ID(autoincrement), IP-Adresse, DatumUhrzeitStempel
                          Eine weitere Tabelle "visits" mit einer Spalte: ID(autoincrement)
                          Erstere dient dem Ausschluss von IP-Adressen als neuer Besuch, falls der vergangene zu kurz zurückliegt.
                          Zweitere wird immer um 1 erhöht, wenn die IP-Adresse des aktuellen Besuchers nach IP-Adress-Prüfung nicht in der Tabelle counterdata existiert. */

                          /* TODOS
                          Autoincrement Handling recherchieren und einsetzen
                          "There was an error running the query" - Zeilen verbessern für spätere Fehlersuche
                          Umbau in Funktionen zum bequemen Aufruf einzelner Teile bei Bedarf
                          TESTEN */

                          // Verbindung zur Datenbank aufbauen
                          $dbconnection mysqli_connect($dbadress$dbusername$dbpassword$dbname);
                          if (
                          mysqli_connect_errno()) {
                              
                          printf("Connect failed: %s\n"mysqli_connect_error());
                              exit();
                          }

                          // Einträge älter als 1 Stunde löschen
                          $deletetimestamp $nowvisit 3600;
                          $sql '
                              DELETE
                              FROM `counterdata`
                              WHERE lastvisit <= '
                          .$deletetimestamp.'
                              '
                          ;

                          echo 
                          'Abfrage Zeile 46: ' $sql "\n";
                          $result $dbconnection->query($sql);

                          // Aktualisierten Datensatz abrufen
                          $sql '
                              SELECT id, ipaddr, lastvisit
                              FROM `counterdata`
                              '
                          ;

                          echo 
                          'Abfrage Zeile 55: ' $sql "\n";
                          $result $dbconnection->query($sql);

                          // Überprüfung auf die IP-Adresse
                          while($row $result->fetch_assoc()){
                              if(
                          $nowvisit-$row['ipaddr']=='$remoteaddr'){
                                  
                          // TODO Aktuellen Zeitstempel setzen
                                  
                          $sql '
                                  UPDATE `counterdata`
                                  SET lastvisit = '
                          .$nowvisit.'
                                  WHERE ipaddr = '
                          .$remoteaddr.'
                                  '
                          ;

                                  echo 
                          'Abfrage Zeile 67: ' $sql "\n";
                                  
                          $result $dbconnection->query($sql);
                              } else {
                                  
                          // Aktuelle IP-Adresse nicht vorhanden
                                  // Zeile in Datenbank hinzufügen und Counter erhöhen
                                  
                          $sql '
                                  INSERT INTO `counterdata`
                                      (
                                          ipaddr,
                                          lastvisit
                                      )
                                  VALUES
                                      (
                                          '
                          .$remoteaddr.',
                                          '
                          .$nowvisit.'
                                      )
                                  '
                          ;

                                  echo 
                          'Abfrage Zeile 86: ' $sql "\n";
                                  
                          $result $dbconnection->query($sql);

                                  
                          // Visits um 1 erhöhen

                                  
                          $sql '
                                  INSERT INTO `visits`
                                      (
                                      )
                                  VALUES
                                      (
                                      )
                                  '
                          ;

                                  echo 
                          'Abfrage Zeile 100: ' $sql "\n";
                                  
                          $result $dbconnection->query($sql);
                              }
                          }

                          $result->free();

                          // Aktuelle Counterzahl anzeigen
                          $sql '
                              SELECT id
                              FROM `visits`
                              '
                          ;

                          $result $dbconnection->query($sql);

                          $currentcount $result->num_rows;

                          $result->free();

                          // Datenbankverbindung schliessen
                          $dbconnection->close();

                          echo 
                          'Counter: ' $currentcount;

                          ?>
                          Ausgabe:
                          Code:
                          Abfrage Zeile 46: DELETE FROM `counterdata` WHERE lastvisit <= 1506499077 Abfrage Zeile 55: SELECT id, ipaddr, lastvisit FROM `counterdata` Counter: 0

                          Kommentar


                          • #28
                            Du brauchst einen Index besser Primary key zum Löschen.
                            http://www.datenbanken-verstehen.de/...aerschluessel/

                            Kommentar


                            • #29
                              Oh. Dann war ich wohl zu voreilig, als ich mein Auslesen der Tabelle und zeilenweises Abarbeiten auf der Suche nach "abgelaufenen Einträgen" gelöscht und direkt durch den delete-Befehl ersetzt hab. Dann programmier ich die Schleife wieder rein und lass über die id-Spalte löschen, das ist der primary key. Ist das eine sinnvolle Vorgehensweise?
                              *Edit* Oder kann ich mir per SELECT id, lastvisit FROM counterdata WHERE lastvisit <= '.$deletetimestamp.' das Ergebnis direkt irgendwie auf DELETE setzen?

                              Kommentar


                              • #30
                                Zitat von Weisgarnix Beitrag anzeigen
                                PDO müsste dann ja für mein Verständnis auf gegen eine SQLite-DB laufen können. Aber wie gesagt, stelle ich hinten an.
                                Warum willst du es hinten an stellen und nicht gleich richtig machen?
                                Mit PDO + SQLite wird vieles einfacher. Du aktualisierst beim hochzählen des Counters immer das Datum und hast so den letzten Zugriff. Durch ein einfachen Datumsvergleich entscheidest du ob du dein Banner anzeigst.

                                Wenn du das dann noch in eine Klasse packst, könnte das in etwa so aussehen:
                                PHP-Code:
                                require 'class.sqlitecounter.php';    //Klasse einbinden

                                $userKey $_SERVER['REMOTE_ADDR'];

                                $counter = new sqliteCounter();

                                $date $counter->getDate($userKey);  //Datum der letzten Aktualisierung
                                if($date === false){
                                  echo 
                                'Hallo dein erster Besuch?';
                                }
                                else {
                                  echo 
                                'counter: '.$counter->getCounter($userKey).'<br>';
                                  echo 
                                'letzter Besuch: '.$date.'<br>';
                                }
                                //counter eins hochzählen und Datum aktualisieren
                                $counter->incCounter($userKey); 
                                Die Klasse nutzt einen userKey zur Identifzierung. Hier im Beispiel ist es die IP, mit allen bereits genannten Nachteilen.
                                Kombiniert man z.B. die IP mit einer Browserfingerprint, ist die Nutzeridentifikation schon etwas besser.

                                Die Klasse hier ist auf die Schnelle zusammengetippelt, nur kurz getestet und hat sicher noch Verbesserungspotential(Fehlerbehandlung..).
                                Sie ist als Basis für eigene Bedürfnisse zu verstehen:
                                PHP-Code:
                                <?PHP
                                /**
                                * @license http://opensource.org/licenses/MIT
                                * @version 1.1
                                * @date: 2017-09-27
                                * Copyright © 20117, Peter Junk (alias jspit). All Rights Reserved.
                                */

                                class sqliteCounter
                                {
                                  private 
                                $db;

                                  
                                /**
                                   * Create a new instance
                                   * @param string $path and filename
                                   */
                                  
                                public function __construct($sqliteFileName "")
                                  {
                                    if(
                                $sqliteFileName == ""$sqliteFileName 'counter.sqlite';
                                    
                                $dsn ='sqlite:'.$sqliteFileName;
                                    
                                $options = array(
                                      
                                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                                      
                                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
                                    
                                );
                                    
                                $db = new PDO($dsnnullnull,$options);

                                    
                                $sql "CREATE TABLE IF NOT EXISTS ipcounter (
                                      ipkey VARCHAR(128) PRIMARY KEY  NOT NULL ,
                                      counter INTEGER NOT NULL DEFAULT 0,
                                      date DATETIME NOT NULL
                                    )"
                                ;
                                    
                                $db->exec($sql);

                                    
                                $this->db $db;
                                  }

                                  
                                /**
                                   * increment the counter and set date
                                   * @return true if ok, false if error
                                   * @param string ipkey
                                   */
                                  
                                public function incCounter($ipkey)
                                  {
                                    
                                $counter $this->getCounter($ipkey);
                                    if(
                                $counter 1) {
                                      
                                //new
                                      
                                $sql "INSERT INTO ipcounter
                                        (ipkey,counter,date)
                                      VALUES
                                        (:ipkey,:counter,:date)"
                                ;
                                      
                                $param = array(
                                        
                                'ipkey' => $ipkey,
                                        
                                'counter' => 1,
                                        
                                'date' => date('Y-m-d H:i:s')
                                      );
                                    }
                                    else {
                                      
                                //update
                                      
                                $sql "UPDATE ipcounter SET
                                        counter = counter+1,
                                        date = :date
                                      WHERE ipkey = :ipkey"
                                ;
                                      
                                $param = array(
                                        
                                'ipkey' => $ipkey,
                                        
                                'date' => date('Y-m-d H:i:s')
                                      );
                                    }
                                    
                                $stmt $this->db->prepare($sql);
                                    
                                $r $stmt->execute($param);
                                    return 
                                $r;
                                  }

                                  
                                /**
                                   * get the counter from ipkey
                                   * @return counter as integer if ok or false if error
                                   * @param string ipkey or null for all
                                   */
                                  
                                public function getCounter($ipkey null)
                                  {
                                    
                                $sql "SELECT SUM(counter) AS countersum FROM ipcounter";
                                    if(
                                $ipkey === null) {
                                      
                                $param = array();
                                    }
                                    else {
                                      
                                $sql .= " WHERE ipkey = :ipkey";
                                      
                                $param = array('ipkey' => $ipkey);
                                    }
                                    
                                $stmt $this->db->prepare($sql);
                                    
                                $stmt->execute($param);
                                    
                                $row $stmt->fetch();
                                    return 
                                $row ? (int)$row->countersum false;
                                  }

                                  
                                /**
                                   * get the counter from ipkey
                                   * @return date as string if ok or false if error
                                   * @param string ipkey
                                   */
                                  
                                public function getDate($ipkey)
                                  {
                                    
                                $sql "SELECT date FROM ipcounter WHERE ipkey = :ipkey";
                                    
                                $stmt $this->db->prepare($sql);
                                    
                                $param = array('ipkey' => $ipkey);
                                    
                                $stmt->execute($param);
                                    
                                $row $stmt->fetch();
                                    return 
                                $row $row->date false;
                                  }

                                  
                                /**
                                   * delete all records where date older then age
                                   * @return true if ok
                                   * @param age a relative DateTime
                                   */
                                  
                                public function delete($age "1 Hour")
                                  {
                                    
                                $sql "DELETE FROM ipcounter WHERE date < :limitDate";
                                    
                                $stmt $this->db->prepare($sql);
                                    
                                $param = array('limitDate' => date_create('-'.$age)->format('Y-m-d H:i:s'));
                                    
                                $r $stmt->execute($param);
                                    return 
                                $r;
                                  }


                                }

                                Kommentar

                                Lädt...
                                X