Ankündigung

Einklappen
Keine Ankündigung bisher.

Falls IP schon vorhanden ist, nicht mehr einfügen.

Einklappen

Neue Werbung 2019

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

  • Falls IP schon vorhanden ist, nicht mehr einfügen.

    Hey Community, ich habe derzeit ein heikles Problem.
    Ich möchte das die IP einmal in die Datenbank in die Tabelle "blog_visitors" gespeichert wird, und das nur einmal am Tag. Mein jetziger Code ist nur:

    PHP-Code:
    <?php
    include "config.php";
    $mysqli->query("INSERT INTO `blog_visitors` (ip, date) VALUES ('".$_SERVER["REMOTE_ADDR"]."', '".time()."')");
    //Index Template laden
    $tpl->page("index");
    $tpl->display();
    ?>
    Mit freundlichen Grüßen,
    Juka


  • #2
    Ja. Und wie ist Dein Ansatz? Über das Problem wenigstens mal nachgedacht?
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Juka na offensichtlich musst du vor dem Speichern der IP in der Datenbank nachprüfen, ob sie dort "heute" schon gespeichert wurde... Was genau ist dein Problem?

      Das einzige was ich schon sehe ist, dass du wahrscheinlich vor einer Herausforderung stehen wirst, zu ermitteln, ob eine IP in der Tabelle "heute" gespeichert wurde. Vielleicht ist es für dich einfacher nicht mit time() einen Zeitstempel sondern sowas wie date('d-m-Y'), also wirklich das Datum, zu speichern, das macht dann den Vergleich trivial.

      Kommentar


      • #4
        http://www.php-einfach.de/codeschnipsel_6310.php

        Nutze ich seit 3 Jahren und ist mir bislang ein stets treuer Unterstützer beim (unerlaubten?) Speichern der Besucher - IP Adressen.

        Gruß

        Kommentar


        • #5
          Wird aber, wenn du eine aktuelle Version von PHP verwendest, nicht mehr lange ein treuer Begleiter sein. Abgesehen davon ist VARCHAR(15) für IP-Adressen Quatsch, @ zum Fehler Unterbinden ist schlechter Stil, ... Für so wenig Code sind eine ganze Menge Ungereimtheiten drinnen.

          Kommentar


          • #6
            Hallo Tropi,

            warum Quatsch, varchar 15 zu nehmen? Meinst Du wegen der Feldlänge 15 oder wegen dem Feldtyp varchar oder wegen beidem?
            Ich dachte vor einigen Jahren als ich zum ersten Mal hörte, dass die IPv4-Adressen bald alle belegt sind und auf längere IPv6-Adressen umgestiegen werden müsse, was das jetzt für einen Seitenbetreiber bedeutet. Die Feldlänge aller Tabellenspalten in denen IP-Adressen gespeichert wurden vergrößern, damit die längeren Dinger da reinpassen?

            Da ich gerade eine Seite neu erstelle, wollte ich mir nun dieses MySQLi aneignen. Leider komme ich damit überhaupt nicht zurecht. Dann gibt es da auch noch unterschiedliche Schreibweisen... Nachdem ich den ganzen Nachmittag mit dem Versuch, Tutorials zu lesen und zu verstehen verbracht habe, habe ich gerade versucht, das Script in MySQLi zu ändern:

            PHP-Code:
            if ($insert_ip $mysqli->query("SELECT * FROM counter_user WHERE ip = '$ip' AND timestamp >= '$max_timestamp_ip'")) {
                if (
            $insert_ip->num_rows != 1) {
                    
            $mysqli->query("INSERT INTO counter_user SET user = '$userlogin', ip = '$ip', hostname = '$hostname', referer = '$referer', timestamp = '$timestamp'");
                }
                
            $insert_ip->close();

            Das scheint wider Erwarten sogar zu klappen. Habe ich alles richtig gemacht?

            Einerseits heißt es immer, dieses MySQLi wäre sicherer, andererseits muss man offenbar doch noch nach wie vor alle nutzergenerierten Eingaben die durch die DB laufen mit einem "real_escape_string" versehen. Das konnte ich doch in MySQL genau so. Dann heißt es, man könnte irgendwelche prepared statements verwenden, womit die Performance besser wäre, aber ich wüsste nicht wie ich das jetzt in diesem Script anwenden soll.

            Danke fürs Lesen.

            Gruß

            Kommentar


            • #7
              Zitat von erdkröte Beitrag anzeigen
              Hallo Tropi,

              warum Quatsch, varchar 15 zu nehmen?

              Bessere Datenbanken haben dafür passende Datentypen.
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8
                Da muss ich akretschmer leider zustimmen, mysql ist hier wirklich schmerzhaft unterlegen.

                Gibt zwar auch andere, möglicherweise bessere Möglichkeiten eine Adresse zu speichern, aber nichts was nativ dafür gedacht wurde.


                Als Ansatz:
                http://databaseblog.myname.nl/2011/0...d-mariadb.html
                http://stackoverflow.com/a/5133610/2912456
                Zitat von nikosch
                Naja, anscheinend spricht die Steckdose kein HTTP. LOL

                Kommentar


                • #9
                  Ich würde es sowieso damit machen (bei MySQL, andere können es nicht alle):
                  http://dev.mysql.com/doc/refman/5.1/...duplicate.html

                  Zum Thema Sicherheit, schau mal hier: http://php-de.github.io/#security
                  Speziell "Kontextwechsel" und "SQL-Injection" mal zu dem Thema.

                  LG
                  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


                  • #10
                    Naja, ON DUPLICATE wird einen hier wohl kaum was bringen.

                    Es soll ja nichts geupdated werden, sondern einfach ignoriert werden. Man könnte aber, dass Feld date in zwei Felder splitten, in einen steht dann das Datum und im anderen die Zeit. Dann kann man einen UNIQUE index über ip und den Datum legen.

                    Kommentar


                    • #11
                      Zitat von akretschmer Beitrag anzeigen
                      Bessere Datenbanken haben dafür passende Datentypen.
                      Aber tut es denn meiner MySQL-Datenbank weh, wenn ich eine (noch) normale IP-Adresse im Format 123.123.123.123 mit Feldtyp varchar speichere? Meine hat bislang noch nicht geschrien... und hat bisher auch noch keine Daten verschluckt / ins Nichts geschleudert.


                      Ich habe gerade den interessanten Artikel über SQL Injections, der hier verlinkt wurde, gelesen. Darin steht, für mysqli solle man mysqli_real_escape_string($hallo) nehmen. Ich habe meine Seite nun mit $mysqli->real_escape_string($hallo), also ohne mysqli_ davor, erstellt. Gibt es da einen Unterschied?

                      Gruß

                      Kommentar


                      • #12
                        Zitat von erdkröte Beitrag anzeigen
                        Aber tut es denn meiner MySQL-Datenbank weh, wenn ich eine (noch) normale IP-Adresse im Format 123.123.123.123 mit Feldtyp varchar speichere? Meine hat bislang noch nicht geschrien... und hat bisher auch noch keine Daten verschluckt / ins Nichts geschleudert.
                        Code:
                        test=*# select '127.0.0.1'::text = '127.000.000.001'::text;
                         ?column?
                        ----------
                         f
                        (1 row)
                        
                        Time: 0,137 ms
                        test=*# select '127.0.0.1'::inet = '127.000.000.001'::inet;
                         ?column?
                        ----------
                         t
                        (1 row)
                        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                        Kommentar


                        • #13
                          Und kannst Du das bitte noch in Worte fassen (wenigstens deshalb, weil wir uns im Einsteiger-Bereich befinden)?

                          Danke.

                          Kommentar


                          • #14
                            Zitat von erdkröte Beitrag anzeigen
                            Und kannst Du das bitte noch in Worte fassen (wenigstens deshalb, weil wir uns im Einsteiger-Bereich befinden)?

                            Danke.
                            127.0.0.1 und 127.000.000.001 ist ein und dieselbe IP, nicht aber ein und derselbe String.
                            Mit richtigen Datentypen hast Du AUCH eine Validitätsprüfung, und Probleme wie dieser Vergleich werden KORREKT gelöst.
                            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                            Kommentar

                            Lädt...
                            X