MySQL macht käse

  • Hallo,
    ich habe folgendes problem:
    ich versuche ein voting-system zu machen, lese dazu die anzahle derer aus die abgestimmt haben, und die derer die dafür gestimmt haben und zähle, wenn man dann abstimme die erlsenen date auf, bzw ab. Alles super. Dann sende ich das ganze via

    PHP
    $sql="UPDATE animations SET voters='".$voters."' AND rank='".$rank."' WHERE name='".$ani."'";

    wenn jetzt also in der DB steht
    voters=2 und rank=1 und ich dann im script $sql ausgebe(dafür gestimmt) bekomme ich

    SQL
    UPDATE animations SET voters='3' AND rank='2' WHERE name='Test'

    soweti so gut. Aber egal was ich mache, in der datenbank steht nach dem query() immer
    voters=0 und rank=1.
    // EIDT:
    Und noch ein anderes problem nebenbei:
    In script 1 verwende ich

    PHP
    date("G:i");


    um die zeit zu bekommen und auf der gleichen seite wie problem 1 für das kommentare schreiben

    PHP
    $today_time=date("G:i");


    um die tageszeit zu bekommen und erhalte aber nich wie bei script 1 die tageszeit sondern den unix-zeitstempel....
    / EDIT
    Was mach ich denn falsch? Danke an alle die sich gedanken machen ;)

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

    Einmal editiert, zuletzt von Tobse (29. Oktober 2009 um 21:05)

  • Wegen MySQL: bist Du sicher, dass das Statement auch ohne Fehler abgesetzt wird? Ich würde mal raten die Spaltennamen in Backticks zu setzen um evtl. Probleme mit MySQL-eigenen, namensgleichen Funktionen zu umgehen. Also:

    SQL
    UPDATE animations SET `voters`='3' AND `rank`='2' WHERE `name`='Test'
    Zitat

    Und noch ein anderes problem nebenbei:

    Die 2 Ausschnitte reichen nicht. Eigentlich dürfte dort nicht der Unix-Zeitstempel kommen. Ich nehme an du hast irgendwas übersehen oder verwechselt.

  • Ok, ich mach das mit den backtiks mal und:
    hat sich nicht geändert.

    Das mit den beiden date() is so:
    ich hab folgenden fehler gemacht:
    date(G.i); anstatt date("G:i");

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Vorher hatten sie INT, aber mit VARCHAR und settype(); klapps auch nicht.
    Das ist der abfrage-block:


    ich hatte vorher SELECT voters, rank dann hab ich halt mal * probiert

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Im UPDATE-Statement hat "LIMIT" nichts zu suchen. Siehe auch Manual: http://dev.mysql.com/doc/refman/5.0/en/update.html

    Zitat


    UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

    Das LIMIT gibt im UPDATE Statement an wie viele Datensätze aktualisiert werden sollen und wenn man 1 angibt dann kann er die Suche nach dem ersten Treffer abbrechen und brauch nicht weiter zu suchen.
    Gernerell also sinnvoll.

    Gruß crAzywuLf :D

    Einmal editiert, zuletzt von crAzywuLf (30. Oktober 2009 um 08:48)

  • Oha. OK, ich schieb meinen Irrtum mal auf die Uhrzeit :D Aber danke für deine freundliche Korrektur (habs in der automatischen Benachrichtigung gelesen :rolleyes:).

    Weitere Weg um das Statement zu prüfen:
    Führ es mal so wie es in der Webseite erzeugt wird im phpmyadmin aus. Wenn dort nicht steht, dass mehr als 0 Datensätze betroffen sind stimmt irgendetwas an deiner Bedingung nicht. Das kannst Du dann prüfen indem Du es mal in ein SELECT umformst.

    Vorher:

    SQL
    UPDATE animations SET `voters`='3' AND `rank`='2' WHERE `name`='Test'

    Nachher:

    SQL
    SELECT * FROM animations WHERE `name`='Test'

    (natürlich dann das Statement mit den vielen converts aus deinem Quellcode verwenden)

  • Ich bin einfach in den PHP my admin gegangen, der es ja auch hinbekommen hat das zu ändern und hab seinen SQL-Befehl kopiert. xD.
    Und das Statement stimm soweit ich weis, man bekommt ja $voters und $rank aus der db. Auf jeden fall klapts selbst mit dem PHP-MyAdmin befehl nicht.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • $db->error; hab ich schon probiert, ist leer. Aber ich prüfe ja
    if ($db->query($sql)) {
    und es gibt true..
    Wie heisst der effect_rows syntax für objekte? (sorry für meine dummheit)

    P.S.
    error_reporting(E_ALL) uind co hab ich schon probiert um fehler im script zu suchen...

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Danke für den geheimtipp ;).
    Ich hab das problem gefunden: Ich hatte doch ein problem im script und die Tabelle hatte keinen Key. Mit diesem PHP-MyAdmin befel hatts geklappt:

    PHP
    $sql="UPDATE `ccforum_2`.`animations` SET `rank` = '".$rank."',
    `voters` = '".$voters."' WHERE CONVERT( `animations`.`name` USING utf8 ) = '".$ani."' LIMIT 1";

    vielen dank an alle die sich mühe gegeben haben.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!