Marco: Update einer Spalte

MySQL - 5.0.51a-24+lenny3

Hallo,
ich habe mir ein kleines Script gebastelt, wo mir angezigt wird, welcher Spieler einen neuen Rang erreicht hat. Das prüfen der Daten funktioniert, jedoch habe ich ein Problem mit dem Update der Daten. Wenn ein Spieler einen neuen Rang erreicht hat, soll das Datum sowie der neue Rang in der Datenbank gespeichert werden. Dafür habe ich 2 neue Spalten angelegt mrank und mtime.
mrank = neuer Rang, besteht aus eine zahl 0-21
mtime = Aktuelles Datum und Zeit

Mein Problem ist, das ich mehrere fast gleiche Daten habe.
Von jedem Spieler stehen immer 7 Datensätze drin, für jeden Tag 1 Datensatz.
Die ich nur vom timestamp und der Spieler ID unterscheiden kann.
Wenn ich das Update ausführe, werden in allen 7 Datensätze, der neue rang und das Datum gespeichert. Ich möchte aber gerne, das es nur im Aktuellem Tag gespeichert wird.(Aktuelle Timestamp) Dafür habe ich in der Where Klause die Aktuelle Timestamp mit angegeben. Trotzdem werden alle 7 Datensätze beschrieben. Was mache ich falsch?

So sieht mein Update Script aus:

$this->db->setQuery("UPDATE jos_bf2_leaderboard Set mrank = '".$array[4]."', mtime = '".$date."'  
    WHERE timestamp = '".$todday."' OR bf2id = '".$bid."'");

$todday = Aktuelle Timestamp
$bid = Spieler ID

Ich hoffe ihr könnt mir bei meinem kleinem Problem helfen.

Vielen Dank
mfg
Marco

  1. Moin!

    WHERE timestamp = '".$todday."' OR bf2id = '".$bid."'");[/code]

    Wo Timestamp heute oder ID = SpielerID.

    Ich nehme mal an in jedem Datensatz steht auch die SpielerID.

    --
    Vergesst Chuck Norris.
    Sponge Bob kann unter Wasser grillen!
    1. Hallo,

      Wo Timestamp heute oder ID = SpielerID.

      Mit AND habe ich es auch schon versucht. Da wird dann kein Datensatz gespeichert.

      Ich nehme mal an in jedem Datensatz steht auch die SpielerID.

      Ja, in jedem Datensatz steht die SpielderID sowie Timestamp.

      mfg Marco

      1. Moin!

        Wo Timestamp heute oder ID = SpielerID.
        Mit AND habe ich es auch schon versucht. Da wird dann kein Datensatz gespeichert.

        s.u.

        Ich nehme mal an in jedem Datensatz steht auch die SpielerID.
        Ja, in jedem Datensatz steht die SpielderID sowie Timestamp.

        Und deshalb musst du mit und verknuepfen. Bei or ist der timestamp, wie du ja siehst, irrelevant.

        Wenn es mit einer Und-Verknuepfung nicht klappt, dann weil beide Bedingungen niemals gemeinsam stimmen. Dass die ID ja gefunden wird, hast Du erfahren. Bleibt, nach Sherlock Holmes, noch der timestamp. Hast Du mal deinen Query ausgegeben und manuell geschaut, auf welchen Datensatz er passt?

        --
        Vergesst Chuck Norris.
        Sponge Bob kann unter Wasser grillen!
        1. Hallo,

          Wenn es mit einer Und-Verknuepfung nicht klappt, dann weil beide Bedingungen niemals gemeinsam stimmen. Dass die ID ja gefunden wird, hast Du erfahren. Bleibt, nach Sherlock Holmes, noch der timestamp. Hast Du mal deinen Query ausgegeben und manuell geschaut, auf welchen Datensatz er passt?

          Jein nicht so direkt. Im der Datenbank steht zb. 1291896301, das vergleiche ich ja mit meinem Timestamp:

          $todday = mktime(0,0,0,date("m"),date("d"),date("Y"));

          Wenn ich diesen ausgeben lasse, kommt der gleiche Timestamp bei raus, darum frage ich mich, warum das nicht funktioniert.

          mfg Marco

        2. Hallo,

          also ich habe jetzt alles kontrolliert. Ich speicher den Timestamp in der Datenbank mit:

          $timespamp = mktime(0,0,0,date("m"),date("d"),date("Y"));

          Dann steht dieser Timespamp drin: 1291935600

          Diesen möchte ich mit meinem Timestamp mit dem gleichen Code vergleichen.

          $todday = mktime(0,0,0,date("m"),date("d"),date("Y"));

          Die Ausgabe von $todday wäre auch: 1291935600

          Nur Warum gibt das keine Übereinstimmung.

          Der Timestamp in der DB ist int(10)
          Habe schon die Variable in integer umgewandelt, aber immer noch kein ergebniss.

          Ich hoffe ihr habt noch ein paar Tipps für mich.

          mfg

          Marco

          1. Moin!

            Hm. Klingt komisch. Mach doch mal folgendes: Lass dir den SQL-Query ausgeben und die 7 Datensaetze zu der ID anzeigen. Dann vergleiche Query und Datensaetze. Kannst Du das hier posten? Zusaetzlich mit der Struktur der Tabelle?

            --
            Vergesst Chuck Norris.
            Sponge Bob kann unter Wasser grillen!
  2. Hi!

    Wenn ein Spieler einen neuen Rang erreicht hat, soll das Datum sowie der neue Rang in der Datenbank gespeichert werden.
    mtime = Aktuelles Datum und Zeit

    Brauchst du wirklich die Zeitangabe? Ich dachte, du willst nur ein Datum festhalten.

    Von jedem Spieler stehen immer 7 Datensätze drin, für jeden Tag 1 Datensatz. Die ich nur vom timestamp und der Spieler ID unterscheiden kann.
    Wenn ich das Update ausführe, werden in allen 7 Datensätze, der neue rang und das Datum gespeichert.

    Wenn du nur einen Datensatz ändern willst, ist die Kombination von Spieler-ID UND Datum notwendig, um den betreffenden Datensatz zu finden.

    Ich möchte aber gerne, das es nur im Aktuellem Tag gespeichert wird.(Aktuelle Timestamp) Dafür habe ich in der Where Klause die Aktuelle Timestamp mit angegeben.

    Du kennst den Unterschied zwischen Unix-Timestamp, MySQL-Timestamp und einem Datum ohne Zeitangabe?

    Trotzdem werden alle 7 Datensätze beschrieben. Was mache ich falsch?
    So sieht mein Update Script aus:

    $this->db->setQuery("UPDATE jos_bf2_leaderboard Set mrank = '".$array[4]."', mtime = '".$date."'

    WHERE timestamp = '".$todday."' OR bf2id = '".$bid."'");

      
    [Zitat #1353](http://community.de.selfhtml.org/my/zitatesammlung/zitat1353). Wie lautet das SQL-Statement? So lässt sich nur sagen, dass OR garantiert nicht das ist, was du willst, denn die bf2id passt ja auf alle Datensätze des Spielers. Insofern ist es nicht verwunderlich, wenn alle 7 verändert werden.  
      
    
    > $todday = Aktuelle Timestamp  
      
    Wenn dein AND-Versuch keinen Datensatz liefert, wird das Problem wohl an unterschiedlichen Werten von deinem übergebenen Timestamp und dem Wert im DBMS liegen.  
      
      
    Lo!