php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 14.06.2006, 08:56  
Erfahrener Benutzer
 
Registriert seit: 27.08.2007
Beiträge: 391
jens76 befindet sich auf einem aufstrebenden Ast
Standard 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?
jens76 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 14.06.2006, 09:34  
Erfahrener Benutzer
 
Registriert seit: 23.08.2007
Beiträge: 1.510
M3g4Star befindet sich auf einem aufstrebenden Ast
Standard

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


Zitat:
...
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 ..
M3g4Star ist offline  
Alt 14.06.2006, 09:53  
Erfahrener Benutzer
 
Registriert seit: 27.08.2007
Beiträge: 391
jens76 befindet sich auf einem aufstrebenden Ast
Standard

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!
jens76 ist offline  
Alt 14.06.2006, 10:31  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
axo ist offline  
Alt 14.06.2006, 10:53  
Erfahrener Benutzer
 
Registriert seit: 27.08.2007
Beiträge: 391
jens76 befindet sich auf einem aufstrebenden Ast
Standard

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!
jens76 ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] komischer safe mode fehler PHP-Fortgeschrittene 7 21.05.2012 14:26
Komischer Fehler mit key() GSJLink PHP Tipps 2008 2 27.05.2008 15:50
Komischer Fehler Slein PHP Tipps 2008 5 21.04.2008 12:03
komischer Fehler im <marquee> MaxDittmann HTML, Usability und Barrierefreiheit 3 01.10.2007 15:51
komischer fehler rbs_phoenix PHP Tipps 2007 4 13.01.2007 17:17
Uploads -> komischer fehler brian johnson PHP Tipps 2006 2 02.12.2006 19:44
Komischer Fehler ... Verzeichnis-Überprüfung PHP Tipps 2005-2 11 07.10.2005 00:28
[Erledigt] Komischer Fehler, entfernen von Slashes geht nicht PHP Tipps 2005-2 3 14.07.2005 21:22
Komischer Fehler! PHP Tipps 2005-2 19 19.06.2005 17:24
Fehlermeldung - aber kein fehler... Tschuu HTML, Usability und Barrierefreiheit 16 14.03.2005 15:56
Übergabe Variablen sehr komischer Fehler PHP-Fortgeschrittene 6 16.11.2004 16:28
Komischer Fehler oder Normal ? Apche 2.0 Xampp versioin nilsfeld Server, Hosting und Workstations 6 12.11.2004 20:10
Komischer Fehler oder Normal ? Apche 2.0 Xampp versioin nilsfeld Server, Hosting und Workstations 0 11.11.2004 15:27
[Erledigt] mysql fehler PHP Tipps 2004 2 03.11.2004 00:32
array_push nur in begrenzter Anzahl ausführen ? PHP Tipps 2004 2 07.09.2004 09:05

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
$sql .= \' where \' . implode

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:02 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.