medi: NOW() als Update_Expression im MySQLI Update funktioniert nicht

Hallo,

stehe gerade vor einem Problem, was mir vorher noch nicht untergekommen ist, und weiß nicht weiter.

Folgendes:
* PHP Website + MySQL Datenbank
* DB Zugriff per MySQLI Extension

Wenn ich jetzt ein Update machen möchte, alá

  
mysqli_query("UPDATE table_xy  
SET time_now = NOW()")  
// time_now DATETIME default '0000-00-00 00:00:00'  

wird im Query nicht der aktuelle Datumsstempel eingefügt, sondern NOW(). Dieses Verhalten beobachte ich jedoch nur, wenn NOW() als Teil einer Update_Expression genutzt wird.

Als Teil einer Select_Expression oder einer Where_Condition funktioniert es ohne Probleme. Bei

  
mysqli_query("SELECT xy  
FROM table_xy  
WHERE time_now = 'NOW()'")  

wird auch wirklich der Datumsstempel alá 2009-29-06 12:00:00 ausgegeben.

Ich arbeite jetzt zum ersten Mal mit MySQLI, vorher nur mit "normalem" MySQL, und da hat NOW() überall funktioniert. Vielleicht sehe ich auch gerade den Wald vor lauter Bäumen nicht, aber ich bin ratlos.

Woran könnte es denn liegen?

Gruß
medi

  1. n'abend,

    mysqli_query("SELECT xy

    FROM table_xy
    WHERE time_now = 'NOW()'")

      
    warum setzt du die Funktion NOW() in Anführungszeichen? Wäre ich MySQL, würde ich dir sagen, dass der String "NOW()" kein gültiges Datum ist und die Ausführung der Abfrage verwehren.  
      
      
    weiterhin schönen abend...
    
    -- 
    #selfhtml hat ein Forum?  
      
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
    
    1. warum setzt du die Funktion NOW() in Anführungszeichen? Wäre ich MySQL, würde ich dir sagen, dass der String "NOW()" kein gültiges Datum ist und die Ausführung der Abfrage verwehren.

      mmh, das war jetzt nicht wirklich hilfreich...
      Und ja das weiß ich, die '' sind im Eifer des Gefechts reingerutscht.

      1. Hello,

        warum setzt du die Funktion NOW() in Anführungszeichen? Wäre ich MySQL, würde ich dir sagen, dass der String "NOW()" kein gültiges Datum ist und die Ausführung der Abfrage verwehren.

        mmh, das war jetzt nicht wirklich hilfreich...
        Und ja das weiß ich, die '' sind im Eifer des Gefechts reingerutscht.

        Sind sie in Deinem Projekt nicht eher ins Update-Statement reingerutscht aus Versehen, so wie sie in Deinem Post im Select-Statement gelandet sind?

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Sind sie in Deinem Projekt nicht eher ins Update-Statement reingerutscht aus Versehen, so wie sie in Deinem Post im Select-Statement gelandet sind?

          Nein sind sie nicht.

  2. Hello,

    Woran könnte es denn liegen?

    ?

    Schön, dass Du OS- und MySQL-Version sowie die Distribution, über die Du MySQL eventuell installiert hast, dazu gesagt hast. Da muss man nun gar nicht raten :-)

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Schön, dass Du OS- und MySQL-Version sowie die Distribution, über die Du MySQL eventuell installiert hast, dazu gesagt hast. Da muss man nun gar nicht raten :-)

      mmh wußte nicht das dies eine Rolle spielt...

      OS: WinXP SP3
      Installer: XAMPP
      PHP 5.2.9
      Apache/2.2.11
      MySQL 5.0.51a

      Fehlt was?

      1. Hello,

        Schön, dass Du OS- und MySQL-Version sowie die Distribution, über die Du MySQL eventuell installiert hast, dazu gesagt hast. Da muss man nun gar nicht raten :-)

        mmh wußte nicht das dies eine Rolle spielt...

        Naja, es passiert zwar äußerst selten, aber manchmal findet man ja doch noch einen Bug. Und der steckt nicht unbedingt in allen Distributionen oder Versionen

        OS: WinXP SP3
        Installer: XAMPP
        PHP 5.2.9
        Apache/2.2.11
        MySQL 5.0.51a

        auf dieser habe ich es gerade selber getestet, ob es da Ungewöhnliches gibt. Aber es klappt alles, wie vorgesehen.

        Zeig doch bitte nochmal Dein Create-Table-Statement dazu

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. auf dieser habe ich es gerade selber getestet, ob es da Ungewöhnliches gibt. Aber es klappt alles, wie vorgesehen.

          Zeig doch bitte nochmal Dein Create-Table-Statement dazu

            
          CREATE TABLE IF NOT EXISTS `tablexy` (  
            `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,  
            `Username` varchar(20) NOT NULL DEFAULT '',  
            `LastAccess` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',  
            PRIMARY KEY (`ID`),  
            KEY `Username` (`Username`),  
            KEY `LastAccess` (`LastAccess`),  
          ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;  
          
          

          Etwas gekürzt ;)

          Achso memcache 2.2.5 läuft auch noch auf dem Server, wenn es interessiert.

          1. n'abend,

            CREATE TABLE IF NOT EXISTS tablexy (
              ID int(10) unsigned NOT NULL AUTO_INCREMENT,
              Username varchar(20) NOT NULL DEFAULT '',
              LastAccess datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
              PRIMARY KEY (ID),
              KEY Username (Username),
              KEY LastAccess (LastAccess),
            ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;

              
            hast du es mal mit einer TIMESTAMP spalte versucht? da könntest du dir auch gleich das aktuelle datum bei jedem update reinschreiben lassen (per definition, ohne dein einwirken)...  
              
            Hast du es mal mit den "anderen" Funktionen versucht?  
              
            weiterhin schönen abend...
            
            -- 
            #selfhtml hat ein Forum?  
              
            sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
            
            1. n'abend,

              Wrong button, grmpf.

              Hast du es mal mit den "anderen" Funktionen versucht?

              Date/Time Funktionen in MSQL. Neben NOW() gibt es noch ne reihe anderer Funktionen, die dir helfen könnten.

              weiterhin schönen abend...

              --
              #selfhtml hat ein Forum?
              sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
              1. Hast du es mal mit den "anderen" Funktionen versucht?

                Date/Time Funktionen in MSQL. Neben NOW() gibt es noch ne reihe anderer Funktionen, die dir helfen könnten.

                Jap habe ich, ging nirgends.
                Naja Thema ist durch, vielen Dank für eure Hilfe.

                Gruß
                medi

                1. hi,

                  Hast du es mal mit den "anderen" Funktionen versucht?

                  Date/Time Funktionen in MSQL. Neben NOW() gibt es noch ne reihe anderer Funktionen, die dir helfen könnten.

                  Jap habe ich, ging nirgends.

                  Mit Timestamp könntest du dir das Manuelle Aktualisieren ersparen; warum es bei dir nicht funktionieren soll ist auf Anhieb nicht Nachvollziehbar.

                  mfg

                  --
                  --
          2. Hello,

            Zeig doch bitte nochmal Dein Create-Table-Statement dazu

            CREATE TABLE IF NOT EXISTS tablexy (
              ID int(10) unsigned NOT NULL AUTO_INCREMENT,
              Username varchar(20) NOT NULL DEFAULT '',
              LastAccess datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
              PRIMARY KEY (ID),
              KEY Username (Username),
              KEY LastAccess (LastAccess),
            ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;

            
            >   
            > Etwas gekürzt ;)  
            
            und Fehler reingebaut! Komma zuviel. :-)  
              
            ~~~sql
              
            CREATE TABLE IF NOT EXISTS `tablexy` (  
              `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,  
              `Username` varchar(20) NOT NULL DEFAULT '',  
              `LastAccess` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',  
              PRIMARY KEY (`ID`),  
              KEY `Username` (`Username`),  
              KEY `LastAccess` (`LastAccess`)  
            ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;  
            
            

            Bei mir funktioniert das Update-Statement

            update tablexy set LastAccess = now() where id = 15;

            einwandfrei. Da gibt es kein Gemecker.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
  3. hi,

    mysqli_query("UPDATE table_xy
    SET time_now = NOW()")
    // time_now DATETIME default '0000-00-00 00:00:00'

    
    > wird im Query nicht der aktuelle Datumsstempel eingefügt, sondern NOW(). Dieses Verhalten beobachte ich jedoch nur, wenn NOW() als Teil einer Update\_Expression genutzt wird.  
      
    Mal mit LIMIT versucht? Bei mir funktioniert  
      
    `$_db->query("UPDATE `cms_admin` SET `last_login` = NOW() LIMIT 1");`{:.language-php}  
      
    Tadellos.  
      
    mfg
    
    -- 
    \--
    
    1. Mal mit LIMIT versucht? Bei mir funktioniert

      $_db->query("UPDATE cms_adminSETlast_login = NOW() LIMIT 1");

      Keine Ahnung warum, aber das funktioniert. OK, werde mich daran halten.

      Vielen Dank

      Gruß
      medi

  4. Hi!

    Wenn ich jetzt ein Update machen möchte, alá
    mysqli_query("UPDATE table_xy SET time_now = NOW()")
    wird im Query nicht der aktuelle Datumsstempel eingefügt, sondern NOW(). Dieses Verhalten beobachte ich jedoch nur, wenn NOW() als Teil einer Update_Expression genutzt wird.

    Als Teil einer Select_Expression oder einer Where_Condition funktioniert es ohne Probleme. Bei
    mysqli_query("SELECT xy FROM table_xy WHERE time_now = 'NOW()'")
    wird auch wirklich der Datumsstempel alá 2009-29-06 12:00:00 ausgegeben.

    So wie du den Fehler beschreibst müssten die Anführungszeichen genau andersrum vorhanden beziehungsweise nicht vorhanden sein. Denn das obere Statement ist richtig, das untere zwar syntaktisch richtig, aber nicht in deinem Sinn.

    Lo!