Sebastian: Counter mit MySQL

Hallo,

ich bin Anfänger in PHP und möchte einen Counter mittels PHP und einer MySQL-Datenbank erstellen.

Genauer gesagt: Ich habe hier ein Artikelsystem und möchte in jeder Artikelansicht einen Anzeige der Artikelviews einbinden.

Um das zu Lösen habe ich folgenden PHP-Code geschrieben:

[...]
  $sql = "select * from nacms_news where id='".$_GET['id']."'";
    $result = mysql_query($sql);
    $news = mysql_fetch_assoc($result);
    $id = $news['id'];
[...]
$user = mysql_query("SELECT Clicksun FROM nacms_news WHERE id = $id");
  $user+=1;
  echo"$user";
  mysql_query("UPDATE nacms_news SET Clicks = $user WHERE id = $id");
[...]

Außerde habe ich eine Tabelle mit folgenden Spalten:
id, timestamp, time, author, name, shorttext, text, newscat, picture,  scheduled, check, Feature, Clicks

Ich habe jetzt einige Zeilen Inhalt in diese Tabelle gemacht.

Irgendwie bekomme ich als Ausgabe der Zeile "echo"$user";" immer das selbe: 17. Egal wie oft und welchen Artikel ich auslese, immer bekomme ich 17 ausgegeben. Gespeichert wird diese Zahl dann an der richtigen Stelle. Auch wenn die Zahl 16 oder 17 gar nicht in der Spalte "Clicks" auftaucht, bekomme ich immer 17 angezeigt. Ich nehme daher an, dass die Zeile "$user = mysql_query("SELECT Clicksun FROM nacms_news WHERE id = $id");" fehlerhaft ist.

Ich würde mich sehr freuen, wenn einer von Euch mir helfen könnte!

Bis dann!
Basti

  1. Hallo Basti

    Bin auch noch Anfänger, aber vielleicht kann ich trotzdem helfen. Wie wärs mit:

    $user = mysql_query( "SELECT Clicksun FROM nacms_news WHERE id = '$id'" );

    Gruss
    Chris

  2. Hallo,

    [...]
      $sql = "select * from nacms_news where id='".$_GET['id']."'";
        $result = mysql_query($sql);
        $news = mysql_fetch_assoc($result);
        $id = $news['id'];
    [...]
    $user = mysql_query("SELECT Clicksun FROM nacms_news WHERE id = $id");
      $user+=1;
      echo"$user";
      mysql_query("UPDATE nacms_news SET Clicks = $user WHERE id = $id");
    [...]

    Ich wundere mich über deinen Programmierstil.
    Einmal verwendest du

    $sql = "select * from nacms_news where id='".$_GET['id']."'";
        $result = mysql_query($sql);

    dann

    $user = mysql_query("SELECT Clicksun FROM nacms_news WHERE id = $id");

    Warum nicht beide male den Query-String extra _oder_ in der Funktion?
    Dann schreibst du den String einmal "select... where id='".$_GET['id']."'" und einmal "SELECT... WHERE id = $id".
    Irgendwas stimmt da doch nicht. Dann solltest du die $_GET-Variable vorher escapen. mysql_real_escape_string()

    Grüße, Matze

    1. Hallo Matze,

      danke für deine Hilfe.

      Habe jetzt:

      $userv = "SELECT Clicks FROM nacms_news WHERE id = '$id'";
          $userv2 = mysql_query($userv);
          $userv3 = mysql_fetch_assoc($userv2);
       $user = $userv3['Clicks'];
        $user+=1;
        echo"$user";
        mysql_query("UPDATE nacms_news SET Clicks = $user WHERE id = $id");

      und das klappt! Danke!

      Bis dann!
      Basti

      1. echo $begrüßung;

        Du solltest dir unbedingt einige Dinge zum sicheren Programmieren zu Herzen nehmen.

        Habe jetzt:

        $userv = "SELECT Clicks FROM nacms_news WHERE id = '$id'";
            $userv2 = mysql_query($userv);

        Eine Datenbankabfrage mit mysql_query() kann fehlschlagen. In dem Fall liefert diese Funktion ein false. Dies will aber die nachfolgende Funktion

        $userv3 = mysql_fetch_assoc($userv2);

        nicht als Argument haben und beschwert sich dann mit einer Fehlermeldung. Es ist deshalb wichtig, Fehlerfälle zu berücksichtigen und darauf zu reagieren, statt einfach zu versuchen weiterzuarbeiten.
        (Das oft gesehene "or die(...)" ist zwar schnell eigefügt, aber keinesfalls benutzerfreundlich.)

        Im Ausgangsposting war noch dieses Konstrukt zu sehen:

        $sql = "select * from nacms_news where id='".$_GET['id']."'";

        So etwas ist grundsätzlich eine Sicherheitslücke. Du lässt Benutzereingaben ungeprüft und unbehandelt in eine Datenbankabfrage einfließen bzw. verlässt dich auf PHPs rudimentäre aber nicht ausreichend sicher arbeitene Sicherheitskonzepte wie Magic Quotes. Nimm einmal an, jemand übergibt als Wert für id etwas mit einem ' drin. Dieser Fall ist zwar nicht von dir vorgesehen und tritt sicher bei normaler Bedienung auch nicht auf, aber trotzdem lässt er sich ausnutzen.
        SELECT ... WHERE id='4'2' ist nur ein Syntaxfehler.
        SELECT ... WHERE id='' OR 1 --' ist eine Manipulation. Bei datenverändernden SQL-Statements kann sich das negativ auf deinen restlichen Datenbestand auswirken.

        Deswegen bekamst du den Hinweis auf mysql_real_escape_string(), den du aber anscheinend nicht berücksichtigt hast. Anwendungsbeispiele findest du auf der verlinkten Handbuch-Seite und in Massen, wenn du eine Suchmaschine (z.B. die dieses Forums) dazu befragst.

        echo "$verabschiedung $name";

      2. Hallo,

        $userv = "SELECT Clicks FROM nacms_news WHERE id = '$id'";
            $userv2 = mysql_query($userv);
            $userv3 = mysql_fetch_assoc($userv2);
        $user = $userv3['Clicks'];
          $user+=1;
          echo"$user";
          mysql_query("UPDATE nacms_news SET Clicks = $user WHERE id = $id");

        Das wollte ich zwar nicht erreichen aber ok. Setz bitte die Variablen ($id) im Query-String in einfache Anführungszeichen '$id'.
        Dann solltest du deine Vorgehensweise vereinheitlichen.
        $userv = "SELECT...";
        $userv2 = mysql_query($userv);
        $userv3 = mysql_fetch_assoc($userv2);

        geht auch so:

        $userv = mysql_fetch_assoc(mysql_query("SELECT WHERE id = '".$id."'"));

        Hier hast du es ja auch so gemacht

        $user = mysql_query("SELECT Clicksun FROM nacms_news WHERE id = $id");

        Nur das du $id in Anführungszeichen setzen solltest.

        Allerdings verarbeitest du danach $user nicht richtig.

        $user+=1;
          echo"$user";

        Hast du vielleicht ein mysql_fetch... vergessen?

        Grüße, Matze

  3. Moin!

    Genauer gesagt: Ich habe hier ein Artikelsystem und möchte in jeder Artikelansicht einen Anzeige der Artikelviews einbinden.

    Dein Counter zählt falsch.

    Du liest mit PHP den Zählerstand aus.
    Addierst mit PHP 1 dazu.
    Schreibst das Resultat wieder in die Datenbank.

    Wenn zwei User parallel auf den Zähler zugreifen, passiert folgendes:

    User 1 liest den Zählerstand aus, z.B. "17".
    User 2 liest den Zählerstand aus, ebenfalls "17".
    User 1 addiert 1 dazu: "18".
    User 2 addiert 1 dazu: Auch "18".
    User 1 schreibt den Zähler in die Datenbank: "18"
    User 2 schreibt den Zähler in die Datenbank: Auch "18".

    Korrekt wäre aber gewesen, dass am Ende "19" in der Datenbank steht.

    Der Grund:

    $user+=1;
      echo"$user";
      mysql_query("UPDATE nacms_news SET Clicks = $user WHERE id = $id");

    Wenn du an dieser Stelle das PHP-Rechnen sein läßt, und es in der Datenbank machst, hast du keine Probleme:

    mysql_query("UPDATE nacms_news SET Clicks = Clicks + 1 WHERE id = $id");

    - Sven Rautenberg

    --
    "Love your nation - respect the others."