Banner_rotatie - Af en toe geen waarde
Ik ben bezig met mijn studie PHP. Hiermee ben ik eens een banner_rotatie systeem aan het maken die object georienteerd is. Dit slechts om het wat meer onder de knie te krijgen.
Ik krijg netjes uit 1 functie een waarde wat gelijk staat aan een banner ID, die weer gekozen wordt uit een query van de aanwezige, actieve banners. Alleen af en toe krijg ik dus geen waarde terug waardoor de pagina in zijn geheel niet laad.
Weet iemand hier een oplossing voor?
Ik zal hieronder even de stukken code plaatsen:
De classes.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
class banner_rotatie {
public function banner_id() {
$get_banners=mysql_query("SELECT banner_id FROM banner_rotatie WHERE banner_active=1")or die(mysql_error());
/* -------------
Bevat alleen maar banner_id's die actief zijn.
Eerst even kijken hoeveel waarden we in de array hebben staan.
-------------- */
$max_waarde=mysql_num_rows($get_banners)+2;
for ($i=1; $i!=$max_waarde; $i++){
$banner_array[$i]=mysql_fetch_row($get_banners);
}
/* -------------
We tellen het aantal ID's zodat we random kunnen maken tussen 0 en het aantal banner_id's
------------ */
$banner_nr=mt_rand(1, $max_waarde);
/* ---------
De banner overzetten naar $banner_id[0].
deze krijgt een array waarde dus de [0] is nodig.
------------ */
$banner_id=$banner_array[$banner_nr];
if (empty($get_banners)) {
$banner_id=1;
return $banner_id[0];
} else {
return $banner_id[0];
}
}
public function banner_details($banner_id) {
$get_banner=mysql_query("SELECT banner_clickcount, banner_file, banner_url FROM banner_rotatie WHERE banner_id='".$banner_id."'")or die(mysql_error());
$banner_details=mysql_fetch_array($get_banner, MYSQL_BOTH)or die(mysql_error());
return $banner_details;
}
}?>
class banner_rotatie {
public function banner_id() {
$get_banners=mysql_query("SELECT banner_id FROM banner_rotatie WHERE banner_active=1")or die(mysql_error());
/* -------------
Bevat alleen maar banner_id's die actief zijn.
Eerst even kijken hoeveel waarden we in de array hebben staan.
-------------- */
$max_waarde=mysql_num_rows($get_banners)+2;
for ($i=1; $i!=$max_waarde; $i++){
$banner_array[$i]=mysql_fetch_row($get_banners);
}
/* -------------
We tellen het aantal ID's zodat we random kunnen maken tussen 0 en het aantal banner_id's
------------ */
$banner_nr=mt_rand(1, $max_waarde);
/* ---------
De banner overzetten naar $banner_id[0].
deze krijgt een array waarde dus de [0] is nodig.
------------ */
$banner_id=$banner_array[$banner_nr];
if (empty($get_banners)) {
$banner_id=1;
return $banner_id[0];
} else {
return $banner_id[0];
}
}
public function banner_details($banner_id) {
$get_banner=mysql_query("SELECT banner_clickcount, banner_file, banner_url FROM banner_rotatie WHERE banner_id='".$banner_id."'")or die(mysql_error());
$banner_details=mysql_fetch_array($get_banner, MYSQL_BOTH)or die(mysql_error());
return $banner_details;
}
}?>
En hieronder het aanroepen en het verwerken van de data. En het plaatsen van de banner.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
include ('config.php');
include ('function.php');
/* ----------------- functie aanroepen voor een nieuwe banner: */
$banner = new banner_rotatie();
/* ----------------- We halen maar eens een banner_detail op: */
$banner_id[0] = $banner->banner_id();
/* ----------------- We hebben een detail die geven we mee aan de query: */
$banner_details = $banner->banner_details($banner_id[0]);
/* -----------------
$banner_details is een array
[0]=clickcount
[1]=banner bestand
[2]=url waar de banner naar toe moet linken
print ''.$banner_details[0].'<br>';
print ''.$banner_details[1].'<br>';
print ''.$banner_details[2].'<br>';
----------------- */
print ''.$banner_id[0].'<br>';
if (empty($banner_details[1])) {
$banner_details[1]='banner\energy_lan_banner.gif';
}
if (!file_exists($banner_details[1])) {
$banner_details[1]='banner\energy_lan_banner.gif';
}
$_SESSION['url']=$banner_details[2];
?>
<table width="100%" border="1" style="border-collapse:collapse;">
<tr>
<td colspan="2" align="center"><a href="click_out.php?id=<?php print $banner_id[0]; ?>"><img src=<?php print "".$banner_details[1].""; ?> /></a></td>
</tr>
?>
include ('config.php');
include ('function.php');
/* ----------------- functie aanroepen voor een nieuwe banner: */
$banner = new banner_rotatie();
/* ----------------- We halen maar eens een banner_detail op: */
$banner_id[0] = $banner->banner_id();
/* ----------------- We hebben een detail die geven we mee aan de query: */
$banner_details = $banner->banner_details($banner_id[0]);
/* -----------------
$banner_details is een array
[0]=clickcount
[1]=banner bestand
[2]=url waar de banner naar toe moet linken
print ''.$banner_details[0].'<br>';
print ''.$banner_details[1].'<br>';
print ''.$banner_details[2].'<br>';
----------------- */
print ''.$banner_id[0].'<br>';
if (empty($banner_details[1])) {
$banner_details[1]='banner\energy_lan_banner.gif';
}
if (!file_exists($banner_details[1])) {
$banner_details[1]='banner\energy_lan_banner.gif';
}
$_SESSION['url']=$banner_details[2];
?>
<table width="100%" border="1" style="border-collapse:collapse;">
<tr>
<td colspan="2" align="center"><a href="click_out.php?id=<?php print $banner_id[0]; ?>"><img src=<?php print "".$banner_details[1].""; ?> /></a></td>
</tr>
?>
Gewijzigd op 01/01/1970 01:00:00 door Hugo Zonderland
Gokje .... +2 ???
SanThe schreef op 04.12.2008 11:07:
$max_waarde=mysql_num_rows($get_banners)+2;
Gokje .... +2 ???
Gokje .... +2 ???
De array die wordt opgehaald begint bij [1] ipv 0. De waardes verschuiven vooraan een achter dus 1 wat dus 2 maakt.
Maar dit heb ik vooraf ook al getest. Dit lost het probleem niet op.
Maar toch bedankt voor de input.
Je gooit maar met variabele etc. Daarnaast heb je bij de HTML img tag geen quotes op de src. En heb je in PHP bij print "". en ."" die weg kunnen.
$banner_nr=mt_rand(1, $max_waarde);
Dus
$banner_nr=mt_rand(1, $max_waarde -1);
Dennis Mertens schreef op 04.12.2008 11:20:
Je gooit maar met variabele etc. Daarnaast heb je bij de HTML img tag geen quotes op de src. En heb je in PHP bij print "". en ."" die weg kunnen.
Volgens helpt dit niet veel, aangezien de src in HTML tussen dubble of enkele quotes "moet" staan is de output nu: "banner/voorbeeld.jpeg" Dus of ik nu
of
plaats maakt dit geen verschil. De output is het zelfde.
SanThe schreef op 04.12.2008 11:21:
Maar dan moet hier wel -1 bij staan:
$banner_nr=mt_rand(1, $max_waarde);
Dus
$banner_nr=mt_rand(1, $max_waarde -1);
$banner_nr=mt_rand(1, $max_waarde);
Dus
$banner_nr=mt_rand(1, $max_waarde -1);
Ook als ik dit test maakt dit geen verschil. Dit is inpricipe het zelfde als
Gewijzigd op 01/01/1970 01:00:00 door Hugo Zonderland
Hugo Zonderland schreef op 04.12.2008 11:38:
Owja?Volgens helpt dit niet veel, aangezien de src in HTML tussen dubble of enkele quotes "moet" staan is de output nu: "banner/voorbeeld.jpeg" Dus of ik nu
Dat is knap.
1: HTML wil je dat je dubbele quotes gebruikt geen enkele.
2:
Betekent geef alleen de waarde van $var op het scherm weer, geen quotes. Dus het maakt wel uit.
Dit is onzin. Het heeft geen zin om een 'lege' string te printen.
Gewijzigd op 01/01/1970 01:00:00 door Dennis Mertens
Maar goed, bedankt voor de input. Maar het gaat me even niet om het HTML gedeelte.
SanThe schreef op 04.12.2008 11:43:
Zet dit bovenin je script.
Getest, helaas zelf dan nog geen resultaten.
Ik krijg ook geen fout meldingen op het scherm helemaal geen output. Ook als ik in Chrome oid de element inspecter gebruik dan staat er alleen een body en thats it.
Gewijzigd op 01/01/1970 01:00:00 door Hugo Zonderland
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$max_waarde=mysql_num_rows($get_banners)-1;
for ($i=0; $i!=$max_waarde; $i++){
$banner_array[$i]=mysql_fetch_row($get_banners);
} ?>
$max_waarde=mysql_num_rows($get_banners)-1;
for ($i=0; $i!=$max_waarde; $i++){
$banner_array[$i]=mysql_fetch_row($get_banners);
} ?>
Denk even met mij mee:
De $max_waarde is niet nodig om met 2 te worden verhoogd. Laat $i beginnen op 0. Ik tel de rijen die ik terug krijg uit de database en trek daar 1 vanaf. $max_waarden, het aantal staat nu gelijk aan de lokatie van de waarden in de array.
OP welke plek in de Array de banner_id kan ik dus bepalen vanaf 0 tot max_waarde(-1). Want inprincipe is $max_waarde het aantal rijen die uit de SQL komen. Zijn er 5.
Even een voorbeeldje:
Ik heb 5 banners
$max_waarde=tellen van aantal rijen = 5 - 1 = 4
$max_waarde = 4
$banner_nr=mt_rand(0, 4); dus:
0, 1, 2, 3, 4 = 5 waarden!
Banner_nr, de waarde is de array_locatie van waar welke banner_id staat:
stel $banenr_nr=2
Dan wordt de output: $banner_id=$banner_array[2] = 3e waarde.
Dat is dan bijvoorbeeld $banner_id 4. De rest van het script draait.
Maar wat gebeurt er als $banner_nr 0 is?
PHP ziet 0 als niets, wordt de variabele dus niet gevult?
----
Goed als ik bovenstaande aanpas en test in het script krijg ik een fout melding.
Code (php)
1
Notice: Undefined offset: 4 in C:\Users\Administrator\Sites\DEV\EnergyLAN\banner_rotatie\function.php on line 31
Ik google even op Undefined offset.
http://www.webmasterworld.com/forum88/5417.htm:
saying that the offset is undefined is basically saying that in the array you mention, for that particular 'key' of the array (the part in the [] or [][][]...) it hasn't been set - there's no value for that key, just like you have unset variables.
* php is pretty smart when flipping around data types when it comes to ints, strings, floats, etc., but it's not smart enough with the string 'one' to go searching for $array['one'] when you create an int in your for loop. It'll be looking for $array[1]. If you've got an $array['1'], this would probably do the trick (not sure - php is dynamically typed, but I'm not sure how this behavior goes with arrays).
* php is pretty smart when flipping around data types when it comes to ints, strings, floats, etc., but it's not smart enough with the string 'one' to go searching for $array['one'] when you create an int in your for loop. It'll be looking for $array[1]. If you've got an $array['1'], this would probably do the trick (not sure - php is dynamically typed, but I'm not sure how this behavior goes with arrays).
Met andere woorden ik moet $banner_array=array(); en dan pas vullen? Want ik weet even zo 1, 2 ,3 niet hoe ik dit probleem kan oplossen. Moet ik quotes gaan gebruiken?
Gewijzigd op 01/01/1970 01:00:00 door Hugo Zonderland
Schijnbaar heeft niemand een oplossing of een idee o.O
Edit: Bijvoorbeeld dit:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$max_waarde=mysql_num_rows($get_banners)+2;
for ($i=1; $i!=$max_waarde; $i++){
$banner_array[$i]=mysql_fetch_row($get_banners);
}
?>
$max_waarde=mysql_num_rows($get_banners)+2;
for ($i=1; $i!=$max_waarde; $i++){
$banner_array[$i]=mysql_fetch_row($get_banners);
}
?>
Stel je vindt 5 resultaten dan loopt jouw for() van 1 tot en met 6.
Gewijzigd op 01/01/1970 01:00:00 door - SanThe -
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$max_waarde=mysql_num_rows($get_banners)-1;
for ($i=0; $i!=$max_waarde; $i++){
$banner_array[$i]=mysql_fetch_row($get_banners);
} ?>
$max_waarde=mysql_num_rows($get_banners)-1;
for ($i=0; $i!=$max_waarde; $i++){
$banner_array[$i]=mysql_fetch_row($get_banners);
} ?>
De rijen worden geteld: 1-5(bij 5 banners) Dat staat gelijk aan de array lokaties. 5-1 is 4
Dus $banner_array maakt dus aan:
[0][1][2][3][4]. Want max_waarde is 5-1=4
Maar dit lost het nog niet op. Maar toch bedankt voor de reactie.
Gewijzigd op 01/01/1970 01:00:00 door Hugo Zonderland
, net achter dat stukje waar jij die $banner_array aanmaakt.
Dat zal een 'overzichtje' geven van hoe je array eruit ziet, en dan kun je dus nakijken welke keys er bestaan, welke waardes die keys hebben etc.
Btw, maak je 'if statement' bij de for loop eens wat duidelijker.
Jij zegt nu "Als $i niet gelijk is aan $max_waarde, ga door".
Maak daar eens van "Als $i kleiner is of gelijk aan $max_waarde, ga door" (ook wel bekend als $i <= $max_waarde)
Dat is:
1. Duidelijker, het gaat er tenslotte om dat je $i kleiner is dan de hoogste waarde, of gelijk aan die hoogste waarde (lijkt me toch dat je dan nodig zal hebben:P)
2. 'Veiliger', als $max_waarde -1 zou zijn (wat dus gebeurt als jij geen rijen terug krijgt op je mooie query'tje), dan gaat die for loop van jou oneindig door (of iig tot de server zegt het is genoeg of onderuit knalt)
Ik denk dat als jij je for loopje aanpast dat je dan miss ook 'de verloren key' terug krijgt;)
De database is niet leeg. Ik kan hem ook nog zo maken dat als $max_waarde 0 of -1 is, dat hij standaart 1 waarde terug geef die altijd goed is. Een standaart banner.
Ik ga nu even testen met de aangepaste for loop.
EDIT:
De aangepaste for loop lost het probleem niet op.
Toch bedankt voor het meedenken.
Gewijzigd op 01/01/1970 01:00:00 door Hugo Zonderland
Code (php)
1
2
3
4
5
2
3
4
5
SELECT banner_id, RAND() AS random
FROM banner_rotatie
WHERE banner_active=1
LIMIT 0,1
ORDER BY random DESC
FROM banner_rotatie
WHERE banner_active=1
LIMIT 0,1
ORDER BY random DESC
Verkrijgt gewoon 1 random-altijd-bestaande-en-random rij.
Hoef je niets te tellen en is waarschijnlijk nog sneller ook.
Dit is inderdaad een betere methode. Na deze toe gepast te hebben is dit de oplossing waar ik naar opzoek was!
Ik heb alleen een aanpassing moeten maken. Ik moest het LIMIT gedeelte weghalen anders dan haalt hij 1 ID op en die kan niet worden gesorteerd op laagste en hoogste. Dus ik haal gewoon alle ID's op en sorteer hem dan op de hoogste random.
Er zit nog een klein foutje in het script. Maar dat is niet van toepassing op het ophalen van de banner en is te
ondervangen.
Ik wil toch iedereen hartelijk bedanken voor zijn/haar input! Alleen vraag ik me wel af waarom het bij mij methode, die theoretisch gezien goed is het niet wou werken.
Gewijzigd op 01/01/1970 01:00:00 door Hugo Zonderland