Konstanza: Vergleichen und Wert erhöhren

Hallo,

folgende Frage stellt sich. Ich habe eine Quelldatei aus der ich mehrmals täglich Werte auslese und in eine Datenbank schreibe.
Nun ist mir aufgefallen das es vorkommt das zwischen verschiedenen Auslesevorgängen Werte häufiger auftreten.
Anstatt sie nun einfach in die Datenbank zu übertragen möchte ich nun vorher prüfen ob sie schon in der Datenbank existieren und für den Fall das den Datenbankwert "haufigkeit" +1 setzen (sprich den existierenden Wert + die Zahl 1).

Hier mein bisheriger Quelltext, vielleicht hat jemand eine Idee.

  
include("db.php");  
$hauefigkeit = "1";  
$quelle = @file('test.html');  
$data = implode ("", $quelle);  
preg_match_all("|<li><a href(.*)</a></li>|Uism",$data, $items, PREG_PATTERN_ORDER);  
    if (count($items[1])==0) {  
    preg_match_all("|<item .*>(.*)</item>|Uism",$data, $items, PREG_PATTERN_ORDER);  
    }  
    for ($i=0; $i<count($items[1]); $i++) {  
    preg_match_all("|<span>(.*)</span>|Uism",$items[1][$i], $regs, PREG_PATTERN_ORDER);  
    $ausgabe= $regs[1][0];  
    echo $ausgabe;  
    $eintrag = "INSERT INTO test (keyword, haeufigkeit) VALUES ('$regs[1][0]', '$hauefigkeit')";  
 $eintragen = mysql_query($eintrag);  
  
    }  
  
?>  

  1. Hi,

    Nun ist mir aufgefallen das es vorkommt das zwischen verschiedenen Auslesevorgängen Werte häufiger auftreten.
    Anstatt sie nun einfach in die Datenbank zu übertragen möchte ich nun vorher prüfen ob sie schon in der Datenbank existieren und für den Fall das den Datenbankwert "haufigkeit" +1 setzen (sprich den existierenden Wert + die Zahl 1).

    Dann frage vorher ab, ob es zum Wert schon einen Eintrag gibt.
    Wenn ja, erhoehe dessen Haeufigkeit um eins, wenn nicht, dann fuege ihn neu mit Haeufigkeit 1 ein.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
  2. Hello,

    zur Aufgabenstellung könnte diese Siete passen:

    http://dev.mysql.com/doc/refman/5.1/en/replace.html

    MySQL bietet einen REPLACE Befehl an aber auch die alternative
    Möglichkeit:    INSERT ... ON DUPLICATE KEY UPDATE.

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo,

      zur Aufgabenstellung könnte diese Siete passen:

      http://dev.mysql.com/doc/refman/5.1/en/replace.html

      wieso? Ich kann mir hier keine sinnvolle Anwendung von REPLACE vorstellen, ...

      MySQL bietet [...] aber auch die alternative
      Möglichkeit:    INSERT ... ON DUPLICATE KEY UPDATE.

      ... das passt hingegen genau (erstes Beispiel).

      Freundliche Grüße

      Vinzenz

      1. Hello,

        MySQL bietet [...] aber auch die alternative
        Möglichkeit:    INSERT ... ON DUPLICATE KEY UPDATE.

        ... das passt hingegen genau (erstes Beispiel).

        habe ich was anderes behauptet?

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo,

          MySQL bietet [...] aber auch die alternative
          Möglichkeit:    INSERT ... ON DUPLICATE KEY UPDATE.

          ... das passt hingegen genau (erstes Beispiel).

          habe ich was anderes behauptet?

          ich hätte aus Deinem Posting geschlossen, dass Konstanza REPLACE verwenden sollte, schließlich hast Du dies im Gegensatz zu INSERT ... ON DUPLICATE KEY UPDATE verlinkt. REPLACE halte ich jedoch für den Anwendungsfall für völlig ungeeignet - ich hätte daher REPLACE überhaupt nicht erwähnt und erst recht keinen Link auf die Seite gesetzt. Ich fand Deinen Beitrag daher ein klein wenig irreführend und ich habe ihn zielführend ergänzt.

          Freundliche Grüße

          Vinzenz

          1. Hello,

            ich hätte aus Deinem Posting geschlossen, dass Konstanza REPLACE verwenden sollte, schließlich hast Du dies im Gegensatz zu INSERT ... ON DUPLICATE KEY UPDATE verlinkt. REPLACE halte ich jedoch für den Anwendungsfall für völlig ungeeignet - ich hätte daher REPLACE überhaupt nicht erwähnt und erst recht keinen Link auf die Seite gesetzt. Ich fand Deinen Beitrag daher ein klein wenig irreführend und ich habe ihn zielführend ergänzt.

            Ja, sorry, irreführen wollte ich natürlich niemanden.
            Aber wenn man die verlinkte Seite durchliest, kommt kan ja an die von mir erwähnte Stelle.
            So war es auch gemeint.

            Also nochmal zur Klarstellung http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

            INSERT INTO table (a,b,c) VALUES (1,2,3)
              ON DUPLICATE KEY UPDATE c=c+1;

            Das ist auf jeden Fall die passende Lösung.

            Erst in der Datenbank mot Select zu suchen, um dann alternativ ein Update oder ein Insert vorzunehmen ist jedenfalls keine gute Lösung, weil man meistens ein Zeitdifferenz-Problem ("TOCTOU") baut damit.

            Liebe Grüße aus Syburg bei Dortmund

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hallo,

              leider ist mein Englisch nicht ausreichend um das zu verstehen. Auch die Google Übersetzung bringt mich nicht wirklich weiter.

              Muss ich zuerst die Abfrage über
                $abfrage = "SELECT * FROM test WHERE name LIKE
                '$ausgabe'";
              prüfen und dann den Befehl ausführen???

              Ich bin als Laie hoffnungslos überfragt...

              1. Hallo,

                leider ist mein Englisch nicht ausreichend um das zu verstehen. Auch die Google Übersetzung bringt mich nicht wirklich weiter.

                wie wäre es mit dem leicht zu findenden deutschen Handbuch der Version 5.1 (das ich ungern verlinke, da die Version 5.0 derzeit die aktuelle Version ist und das deutsche Handbuch nicht so ausführlich ist wie die Originalversion - und leider gelegentlich Fehler enthält).

                Muss ich zuerst die Abfrage über
                  $abfrage = "SELECT * FROM test WHERE name LIKE
                  '$ausgabe'";
                prüfen und dann den Befehl ausführen???

                wie Tom und ich beide ausgeführt haben, ist dies nicht nötig - ja überhaupt nicht empfehlenswert. Einfach

                INSERT ...
                ON DUPLICATE KEY UPDATE

                verwenden.

                Freundliche Grüße

                Vinzenz