Ankündigung

Einklappen
Keine Ankündigung bisher.

komischer fehler beim DB abfragen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • komischer fehler beim DB abfragen

    hallo!

    ich habe einen ganz komischen fehler bei einer meiner DB-abfragen.

    erstmal soviel zur erklärung:

    ich habe eine Tabelle, in der stehen meine daten zu den Banneren auf meiner steite. diese sind durch das Feld type in horizontal(1) und Vertikal(2) unterteilt.
    über order by rand() frage ich dann mit untenstehender sql-abfrage meinen banner ab.

    hier erstmal die abfrage:

    Code:
    SELECT Ident AS BannerId, ImageName, BannerURL, RAND() AS zufall FROM h_admin_banner WHERE Type = '2' AND state = '20' AND ( (FromDate <= '2006-06-14' OR FromDate IS NULL) AND ToDate >= '2006-06-14' OR ToDate IS NULL ) AND ( ( FromTime < ToTime AND FromTime <= CURTIME() AND ToTime >= CURTIME() OR FromTime IS NULL OR ToTime IS NULL ) OR ( ( FromTime > ToTime AND (FromTime < CURTIME() AND '23:59:59' >=CURDATE()) OR (ToTime > CURTIME() AND '00:00:00' <= CURDATE()) ) OR FromTime IS NULL OR ToTime IS NULL ) ) ORDER BY zufall LIMIT 0,1;
    so nun zum problem:

    offline funktioniert alles super. wenn ich es aber auf meinen server spiele wird beim vertikalen banner immer nur der erste ausgelesen. an der abfrage liegt es nicht. lasse ich mir die agfrage ausgeben und frage diese über MySQL-Front auf dem server ab, so funktioniert alles und ich bekomme auch unterschidliche banner.
    jetzt dachte ich mir frag den vertikalen banner doch 2 mal ab und überschreibe die 1. abfrageergenisse. und siehe da auch dann funktionierts.

    kann mir jemand einen tipp geben warum das nicht bei der ersten abfrage funktioniert?

  • #2
    Kannst du diese Abfrag nicht auch mit BETWEEN lösen ???

    weil du hast hier sooo viele verglcihe die eigentlich nur versuchen einen Zeitraum zu beschreiben der von JETZT bis IRGENDWANN geht .. Kannst du das nicht einfach mittels timestamp lösen ... wäre meiner meinung nach einfacher .. da kannst dir die Zeitangaben sparen


    ...
    an der abfrage liegt es nicht. lasse ich mir die agfrage ausgeben und frage diese über MySQL-Front auf dem server ab, so funktioniert alles und ich bekomme auch unterschidliche banner.
    jetzt dachte ich mir frag den vertikalen banner doch 2 mal ab und überschreibe die 1. abfrageergenisse. und siehe da auch dann funktionierts.
    Tja ... so scheint es zu sein .. wird also eher am PHP Code als am Query zu leigen .. wenn du dir die Abfrage ausgeben lässt und diese dann meinetwegen in PHPMyAdmin eingibst und dann dort richtige Ergebnisse bringt.

    Also hilft uns dein SQL Code wenig ..

    Kommentar


    • #3
      also BETWEEN geht nicht so recht! die tabelle hat nunmal das datum von bis und die zeit von bis. und mit between ist es auch schlecht abzufragen ob eine zeitspanne über den tag hinaus geht. also zb von 22:00 bis 05:00.

      am php code kanns auch nicht direkt liegen! denn wenn ich die abfrage nach dem vertikalen banner 2 mal nacheinander ausführe geht ja alles! ich kann doch im sinne von sauberer programierung nicht eine "sinnlose" abfrage starten nur um ein gewolltets ergebnis zu haben!

      hier mal der abfragecode für die bannerrotaion

      PHP-Code:
      <?php

      class BannerRotation
          
      {

              function 
      getBanner($Type,$Gender=NULL)
              {
                  
      //abfragen des Banners $Type = H/V
                  
                  
      $where = array();
                  
      //where rendern
                  //H oder V banner
                  
      $where[] = " Type = '".$Type."' ";
                  
      $where[] = " state = '20' ";
                  if (
      $Gender != NULL)
                  {
                      
      //nur abfragen wenn user eingeloggt
                      
      $where[] = " (Gender='".$Gender."' OR Gender='0' OR Gender IS NULL) ";
                  }
                  
      //zeit rendern Datum    CUREDATE()
                  
      $where[] = " ( (FromDate <= '".date('Y-m-d')."' OR FromDate IS NULL)
                                 AND
                                 ToDate >= '"
      .date('Y-m-d')."' OR ToDate IS NULL ) ";
                  
      //normale zeitspanne an einem Tag
                  
      $where[] = " (
                                   ( FromTime < ToTime AND
                                     FromTime <= CURTIME() AND
                                     ToTime >= CURTIME() OR
                                     FromTime IS NULL OR
                                     ToTime IS NULL
                                   )
                                   OR
                                   (
                                      (
                                      FromTime > ToTime
                                      AND
                                      (FromTime < CURTIME() AND '23:59:59' >=CURDATE())
                                      OR
                                      (ToTime > CURTIME() AND '00:00:00' <= CURDATE())
                                      )
                                      OR
                                      FromTime IS NULL
                                      OR
                                      ToTime IS NULL
                                   )
                               )
                               "
      ;
                  
      $db getDBConnection();
                  
      $sql "SELECT Ident AS BannerId, ImageName, BannerURL, RAND() AS zufall
                          FROM h_admin_banner "
      ;
                  
      $sql .= "WHERE ".implode(" AND "$where);
                  
      $sql .= "ORDER BY zufall
                           LIMIT 0,1;"
      ;
                  
      //echo "<hr>".$sql."<hr>";
                  
      $result $db->Execute($sql) OR die('Error in BannerRotation->getBanner ->'.$Type.'<-');
                  if (
      $result->RecordCount() != 1)
                  {
                      
      //kein banner gefunden
                      
      return FALSE;
                  }
                  
      $this->BannerId $result->fields['BannerId'];
      echo 
      "##".$this->BannerId."##".$result->fields['zufall']."##
      "
      ;
                  
      $this->ImageName $result->fields['ImageName'];
                  
      $this->BannerURL $result->fields['BannerURL'];
                  return 
      TRUE;
              } 
      //ende getBanner
              
              
      function RenderHorizontalBanner($Gender)
              {
                  
      //vertikalen banner abfragen und mit bild und link rendern
                  
      if ($this->getBanner(1,$Gender) == TRUE)
                  {
                      
      $Banner '[url="'.$this->BannerURL.'"][img]/m/Banner/'.$this->ImageName.'[/img][/url]';
                      return 
      $Banner;
                  }
                  else
                  {
                      return 
      NULL;
                  }

              }
              
              function 
      RenderVertikalBanner($Gender)
              {
                  
      //horizontalen banner abfragen und mit bild und link rendern
                  
      if ($this->getBanner(2,$Gender) == TRUE)
                  {
                      
      $Banner '[url="'.$this->BannerURL.'"][img]/m/Banner/'.$this->ImageName.'[/img][/url]';
                      return 
      $Banner;
                  }
                  else
                  {
                      return 
      NULL;
                  }
              }
      }

      ?>
      und hier der codeausschnitt wo ich die 2 banner abfrage:



      PHP-Code:
      <?php

              $BannerRotation 
      = new BannerRotation();
      //banner abfragen
              
      $this->v_banner $BannerRotation->RenderVertikalBanner($user->getAttribute('Gender'));
              
      $this->h_banner $BannerRotation->RenderHorizontalBanner($user->getAttribute('Gender'));

      ?>
      das komische ist ja, wenn ich folgenden aufruf ein 2. mal starte geht alles wie gewollt!


      PHP-Code:
      <?php

              $this
      ->v_banner $BannerRotation->RenderVertikalBanner($user->getAttribute('Gender'));

      ?>
      irgendwelche ideen? oder tips?

      danke!

      Kommentar


      • #4
        das liegt an RAND() ... in mysql ist das keine 'echte' zufallsfunktion, und das ergebnis
        von SELECT-statements wird im query-cache gehalten, was relativ schnell erklärt,
        warum du auf ewig das gleiche banner bekommst.

        der probate weg:
        PHP-Code:
        <?php

        $num 
        $this -> _db -> getOne('SELECT COUNT(*) FROM banner WHERE ...');
        $rand rand(0$num); // random von php ausführen lassen
        // eine zeile holen, mit dem zufalls-limit aber immer eine andere position:
        // ... z.b. LIMIT 10, 1; LIMIT 16,1 ; LIMIT 32, 1; LIMIT 0,1;
        $whichBanner $this -> _db -> query('SELECT ... FROM ... WHERE ... LIMIT ' $rand ', 1');
        grüße
        axo

        Kommentar


        • #5
          sorry aber das ist nicht ganz zu friedenstellend! wenn ich es vorher zählen würde und dann abfrage, kann ich auch gleich die abfrage nach dem vertikalen banner 2 mal durchführen und ich komme auf das selbe ergebnis.

          was ich aber nicht verstehe ist, warum geht es nachdem ich es zum 1. mal abgefragt habe es beim 2. mal geht!

          und RAND() funktioniert ja soweit auch wie ich es haben will.

          ach und ich bekomme nicht ewig den selben sondern nur bei der ersten abfrage! danach funktioniert es ja alles!

          Kommentar

          Lädt...
          X