input: UPDATE unbekannten Datensatz mit folgendem Inhalt: "INHALT

So in etwa müsste das auf Deutsch heißen. Weiß jemand von euch das passende SQL-Statement?

Also. Es handelt sich um folgendes Problem:
Ich möchte einen Counter bauen, der alles mögliche aufzeichnet.
Nun möchte ich nicht bei jedem Aufruf des Counter für jeden Eintrag gleich 2 SQL-Aufrufe machen (könnte evtl. zu lange dauern) sondern stattdessen gleich beides mit einem Query. Das müsste dann so aussehen:
UPDATE Browser_TAB SET HITS = HITS + 1 WHERE BROWSER = $HTTP_USER_AGENT;

Aber was ist nun wenn der entsprechende Eintrag noch nicht existiert?
Dürfte ja eigentlich nichts passieren (Habs schändlicherweise noch nicht probiert ...). Also wie mache ich es, dass das Skript auch bei noch nicht "bekannten" Browsern einen neuen Eintrag anlegt?

input

  1. Moin!

    Aber was ist nun wenn der entsprechende Eintrag noch nicht existiert?
    Dürfte ja eigentlich nichts passieren (Habs schändlicherweise noch nicht probiert ...). Also wie mache ich es, dass das Skript auch bei noch nicht "bekannten" Browsern einen neuen Eintrag anlegt?

    Du kannst statt UPDATE oder INSERT auch REPLACE benutzen. Dieser Befehl erfordert allerdings, dass die Spalte, nach deren Inhalt sich entscheidet, ob es den Eintrag schon gibt (und UPDATE gemacht wird) oder nicht (und dann INSERT gemacht wird) als unique definieren.

    Ich würde meinen, dass sich ein Counter als Aufgabe sowie ein User-Agent-String als Unterscheidungskriterium für solch einen Ansatz nun absolut überhaupt nicht eignen. Erstens gibt es wahnsinnig viele verschiedene User-Agents. Das bedeutet, dass du ziemlich schnell ziemlich viele verschiedene Einträge in der Datenbank hast - was wiederum bedeutet, dass die Datenbank immer länger suchen muss, um festzustellen, ob ein neuer Eintrag denn nun wirklich neu ist oder ob es ihn schon gibt. Gefällt mir nicht.

    Wesentlich besser wäre es, wenn du beim Counter einfach nur protokollierst: User-Agent, Datum, sonstige Daten - fertig. Alles immer als INSERT.

    Bei der Auswertung kannst du dann zuschlagen. Die Auswertung läuft nur sehr selten, verglichen mit dem Counter, da schadet also etwas mehr Rechenaufwand nicht so sehr.

    Du kriegst die Information, welche User-Agents wie häufig vom Counter gezählt wurden, z.B. über diesen Query:

    SELECT count(user-agent), user-agent FROM tabelle GROUP BY user-agent

    - Sven Rautenberg

    --
    "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
    1. Gut. Darüber hatte ich auch schon nachgedacht. Außerdem könnte ich dann auch Kombinationsmöglichkeiten (Browser, Bildschirmauflösung, evtl. Fehler) noch im Nachhinein auswerten. Aber ist es auf die Dauer wirklich empfehlenswert eine solche Datenbank-Tabelle anzulegen? Über welchen Zeitraum sollte man die Tabellen erstrecken (1 Monat, 1 Jahr) um nicht zu lange Listen zu erhalten? Ich hatte geplant den Counter auf jeder Seite einzubauen, um so alle Seiten mitzuerfassen. Ist es da nun empfehlenswert wirklich bei jedem Hit ein INSERT zu machen oder sollte ich lieber nur bei jedem VISIT einen Eintrag machen und die HITS gesondert auswerten, bzw. erfassen?

      Danke für eure hilfreichen Tipps!!

      input

      1. Moin!

        Aber ist es auf die Dauer wirklich empfehlenswert eine solche Datenbank-Tabelle anzulegen? Über welchen Zeitraum sollte man die Tabellen erstrecken (1 Monat, 1 Jahr) um nicht zu lange Listen zu erhalten? Ich hatte geplant den Counter auf jeder Seite einzubauen, um so alle Seiten mitzuerfassen. Ist es da nun empfehlenswert wirklich bei jedem Hit ein INSERT zu machen oder sollte ich lieber nur bei jedem VISIT einen Eintrag machen und die HITS gesondert auswerten, bzw. erfassen?

        Die Datenmenge, die sich ansammeln wird, ist primär von der Bekanntheit und Beliebtheit deiner Website abhängig.

        Allerdings frage ich mich was ganz anderes: Hast du keine Logfiles? Würde ich ja für vollkommen unwahrscheinlich halten, dass du eine Datenbank hast, aber keinen Zugriff auf die Logfiles. In denen stünde ggf. nämlich schon drin, was du hier erfassen willst - und daraus Statistiken zu generieren ist dann auch nur noch ein kleiner Schritt.

        Außerdem: Wie willst du einen HIT von einem VISIT unterscheiden? Das ginge, wenn überhaupt (denn alle Methoden, das zu erreichen, haben immer auch Nachteile), nur durch Lesevorgänge in der Datenbank. Sowas sollte IMO dem Auswerteskript vorbehalten bleiben.

        - Sven Rautenberg

        --
        "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
        1. Also HIT von VISIT wollte ich per Cookie unterscheiden. Also: falls Cookie (hält ne halbe stunde) schon gesetzt, dann zähl nur als HIT sonst auch als VISIT.