Banner_rotatie - Af en toe geen waarde

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Hugo Zonderland

Hugo Zonderland

04/12/2008 10:58:00
Quote Anchor link
Hallo mede PHP'ers

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
    }
}
?>


En hieronder het aanroepen en het verwerken van de data. En het plaatsen van de banner.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>
?>

Gewijzigd op 01/01/1970 01:00:00 door Hugo Zonderland
 
PHP hulp

PHP hulp

16/05/2024 06:49:54
 
- SanThe -

- SanThe -

04/12/2008 11:07:00
Quote Anchor link
$max_waarde=mysql_num_rows($get_banners)+2;

Gokje .... +2 ???
 
Dennis Mertens

Dennis Mertens

04/12/2008 11:09:00
Quote Anchor link
Handig om
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php bovenaan de code te zetten voor de mooie highlight.
 
Hugo Zonderland

Hugo Zonderland

04/12/2008 11:17:00
Quote Anchor link
SanThe schreef op 04.12.2008 11:07:
$max_waarde=mysql_num_rows($get_banners)+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.
 
Dennis Mertens

Dennis Mertens

04/12/2008 11:20:00
Quote Anchor link
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.
 
- SanThe -

- SanThe -

04/12/2008 11:21:00
Quote Anchor link
Maar dan moet hier wel -1 bij staan:
$banner_nr=mt_rand(1, $max_waarde);

Dus
$banner_nr=mt_rand(1, $max_waarde -1);
 
Hugo Zonderland

Hugo Zonderland

04/12/2008 11:38:00
Quote Anchor link
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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<html>
src="<?php print $banner_details[2]; ?>"
</html>


of
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<html
src=<?php print "".banner_details[2].""; ?>
</html>



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);


Ook als ik dit test maakt dit geen verschil. Dit is inpricipe het zelfde als
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$max_waarde
=mysql_num_rows($get_banners)+1;
?>
Gewijzigd op 01/01/1970 01:00:00 door Hugo Zonderland
 
- SanThe -

- SanThe -

04/12/2008 11:43:00
Quote Anchor link
Zet dit bovenin je script.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);

// rest
?>
 
Dennis Mertens

Dennis Mertens

04/12/2008 11:44:00
Quote Anchor link
Hugo Zonderland schreef op 04.12.2008 11:38:
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
Owja?

Dat is knap.

1: HTML wil je dat je dubbele quotes gebruikt geen enkele.
2:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php print "".$var.""; ?>

Betekent geef alleen de waarde van $var op het scherm weer, geen quotes. Dus het maakt wel uit.
 
- SanThe -

- SanThe -

04/12/2008 11:46:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php print "".$var.""; ?>

Dit is onzin. Het heeft geen zin om een 'lege' string te printen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php print $var; ?>
 
Dennis Mertens

Dennis Mertens

04/12/2008 11:57:00
Quote Anchor link
Exactly what I tried to say but you wouldn't listen :(
Gewijzigd op 01/01/1970 01:00:00 door Dennis Mertens
 
Hugo Zonderland

Hugo Zonderland

04/12/2008 11:59:00
Quote Anchor link
Maar goed, bedankt voor de input. Maar het gaat me even niet om het HTML gedeelte.
 
Hugo Zonderland

Hugo Zonderland

04/12/2008 14:10:00
Quote Anchor link
SanThe schreef op 04.12.2008 11:43:
Zet dit bovenin je script.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);

// rest
?>


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
 
Hugo Zonderland

Hugo Zonderland

05/12/2008 12:59:00
Quote Anchor link
Oke ik ben inmiddels aan het testen geslagen op een andere manier.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
        }
?>


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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<php
$banner_nr=mt_rand(0, $max_waarde);
?>



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)
PHP script in nieuw venster Selecteer het PHP script
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).


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
 
Hugo Zonderland

Hugo Zonderland

06/12/2008 18:58:00
Quote Anchor link
Schijnbaar heeft niemand een oplossing of een idee o.O
 
- SanThe -

- SanThe -

06/12/2008 19:19:00
Quote Anchor link
Ik geloog nog steeds dat het ergens zit in het gebruik van $max_waarde.

Edit: Bijvoorbeeld dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
        }

?>

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 -
 
Hugo Zonderland

Hugo Zonderland

07/12/2008 12:02:00
Quote Anchor link
The San, een 3 post geleden heb ik al aangegeven dat ik dit had aangepast:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
        }
?>


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
 
Maarten Slenter

Maarten Slenter

07/12/2008 13:27:00
Quote Anchor link
miss ligt het probleem in het feit dat er lege rijen voorkomen in je database, voeg dit eens ff toen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo '<pre>'.print_r($banner_array, true).'</pre>';
?>

, 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;)
 
Hugo Zonderland

Hugo Zonderland

07/12/2008 14:10:00
Quote Anchor link
Afbeelding

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
 
Eddy E

Eddy E

07/12/2008 14:17:00
Quote Anchor link
Waarom doe je niet gewoon dit?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT banner_id, RAND() AS random
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.
 
Hugo Zonderland

Hugo Zonderland

07/12/2008 14:42:00
Quote Anchor link
Eddy,

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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.