[PHP] Probleem met IF functie

Pagina: 1
Acties:
  • 213 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Hee,

Ik zit al een hele tijd met het volgende probleem. Ik heb een script geschreven die controleert of mijn internetradio/server aanstaat. Zo ja, dan wordt vervolgens het aantal luisteraars gecontroleert. Wanneer dit het aantal 10 heeft bereikt dan moet de status van de server veranderen in Full (in het oranje). Dat laatste wil dus niet lukken en ik ben er toch al enkele weken, zo niet maanden mee bezig.

Hieronder de volledige 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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php

error_reporting(0);

function getcontent($server, $port, $file)
{
   $cont = "";
   $ip = gethostbyname($server);
   $fp = fsockopen($ip, $port, $errno, $errstr, 3);
        if (!$fp) {
        $status = "<font color=\"red\">Offline</font>";
        } else {
        $com = "GET $file HTTP/1.0\r\nAccept: */*\r\nAccept-Language: de-ch\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Windows NT 5.0)\r\nHost: $server:$port\r\nConnection: Keep-Alive\r\n\r\n";
        fputs($fp, $com);
        while (!feof($fp))
       {
           $cont .= fread($fp, 500);
       }
       fclose($fp);
       $cont = substr($cont, strpos($cont, "\r\n\r\n") + 4);
       return $cont;
   }
}

$scip = "shoutcast.stx.nl";
$scport = "8000";
$basecontent = getcontent($scip, $scport, "/7.html");
$pieces = explode(",", $basecontent);
$songs = "1089";
$maxlisteners = 10;
$maintenance = false;

// Check if the server is currently broadcasting
if ($maintenance) {
    $status    = "<font color=\"red\">Server is in maintenance. Please come back later!</font>";
    $songs    = "";
}
elseif ($pieces[1] == "1") {
    if ($pieces[0] == $maxlisteners) {
        $status    = "<font color=\"orange\">Server is full, try again later!</font>";
    }
    else {
        $status    = "<font color=\"green\">Online</font>";
    }
}
else {
    $status    = "<font color=\"red\">Offline</font>";
    $songs    = "";
}

?>
<html>
<head>
<SCRIPT LANGUAGE=JAVASCRIPT>
<!-- hide
function go() { 
    window.location.href="index.php"
}
-->
</SCRIPT>
</head>
<body onLoad="setTimeout('go()',30000)">

<div style="width: 100px; float: left;">Server is<br />Listeners<br />Listener peak<br />Max listeners<br />Bitrate (kbps)<br />Number of songs<br />Current Song</div>

<div style="width: auto; margin-left: 100px;">
: <? echo $status; ?><br />
: <? echo $pieces[0]; ?><br />
: <? echo $pieces[2]; ?><br />
: <? echo $pieces[3]; ?><br />
: <? echo $pieces[5]; ?><br />
: <? echo $songs; ?><br />
: <? echo $pieces[6]; ?>
</div>
</body>
</html>

De pieces worden door een explode van een html file aangemaakt. Wanneer ik gewoon alleen <? echo $pieces[0]; ?> doe dan komt er netjes de waarde van de aanwezige luisteraars te staan.
Waarom werkt de IF functie dan niet en wordt de status niet oranje?!?

De pieces worden dus uit het volgende adres gehaald: http://shoutcast.stx.nl:8000/7.html
Hierbij is de 1e waarde de aantal luisteraars, 2e online/offline, 3e listeners peak, 4e max luisteraars, 5e geen idee, 6e de bitrate en de laatste het nummer wat momenteel afgespeeld wordt.

Nog even voor de duidelijkheid, ik zorg voor het testen uiteraard dat het aantal aanwezige luisteraars gelijk is met de $maxlisteners.

Verder had ik nog een andere vraag. Ik heb op me site 3 scripts staan die één voor één verbinding maken met me thuisserver waarop de muziek uitgezonden wordt. Is het beter om dit te combineren door 1 php bestand maken met daarin de connectie en deze dan bij de 3 scripts te includen, of gaat dat niet lukken?

[ Voor 47% gewijzigd door Creepy op 03-10-2006 17:19 ]


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

Waarom zet je aanhalingstekens rond de getallen?

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Druk eens exact de inhoud van pieces af. Daarmee bedoel ik dat je iets doet als:

PHP:
1
echo " pieces = [". $pieces[0] ."]";


Het zou namelijk best kunnen zijn dat de string die je krijgt nog een berg spaties en newlines heeft. Als je dit vervolgens met een getal zou gaan vergelijken dan levert dit false op.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Johnny schreef op dinsdag 03 oktober 2006 @ 16:33:
Waarom zet je aanhalingstekens rond de getallen?
Dat moet toch niet uitmaken?

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Je haalt integers en strings door elkaar. Met het plaatsen van quotes wordt je variabele een string. Een string vergelijken met een integer geeft altijd false terug.
Waarom gebruik je trouwens integers (0 of 1) terwijl een boolean ook goed is:?
PHP:
1
2
$maxlisteners = 10; 
$maintenance = true;


@iedereen die de quotes niet is opgevallen ( O-) ) mind de kleur van de syntax highlighter. Strings -> rood. Integers -> Paars/roze ;)

[ Voor 18% gewijzigd door mithras op 03-10-2006 16:37 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Owh, dat was me nog neit eens zo opgevallen :X... Als je " om getallen heen zet zijn het geen getallen meer maar strings. Misschien handig om je eens in datatypen te verdiepen ;).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • ReseTTim
  • Registratie: Juni 2000
  • Laatst online: 20-09 16:23

ReseTTim

Chocolate addicted

waarschijnlijk wel.. want met "" is het een string en zonder is het een integer..

spuit 1011

Mijn profiel - Te koop: Overzicht van spullen..


Acties:
  • 0 Henk 'm!

Verwijderd

even een "general advice", als je wil weten waar of je if-statements worden uitgevoerd, kun je beter iets gebruiken wat dit signaleerd. Zelf gebruik ik altijd die($var) met als $var, de "check" variabele van de if statement, in jouw geval bijvoorbeeld $pieces[1]. Wat staat er eigenlijk in $pieces[1], dat is me namelijk onduidelijk, er vanuitgaande dat $pieces[0] het aantal gebruikers ligt!

Acties:
  • 0 Henk 'm!

  • SinergyX
  • Registratie: November 2001
  • Laatst online: 18:12

SinergyX

____(>^^(>0o)>____

Gebruik ipv $maxlisteners = "10"; eens $maxlisteners = 10;

@resettim, maar een 'integer' 1 is toch gelijk aan een 'string' 1 in php code? (ook al is het dirty :P)

[ Voor 47% gewijzigd door SinergyX op 03-10-2006 16:38 ]

Nog 1 keertje.. het is SinergyX, niet SynergyX
Im as excited to be here as a 42 gnome warlock who rolled on a green pair of cloth boots but was given a epic staff of uber awsome noob pwning by accident.


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Mithras86 schreef op dinsdag 03 oktober 2006 @ 16:35:
Je haalt integers en strings door elkaar. Met het plaatsen van quotes wordt je variabele een string. Een string vergelijken met een integer geeft altijd false terug.
Dat is alleen zo als je === gebruikt, bij == wordt er niet gekeken naar de types van de variabelen, enkel naar de inhoud (eventueel geconverteerd naar het juiste type).

Acties:
  • 0 Henk 'm!

Verwijderd

ReseTTim schreef op dinsdag 03 oktober 2006 @ 16:36:
[...]


waarschijnlijk wel.. want met "" is het een string en zonder is het een integer..
zolang je als operator == gebruikt en niet === maakt het niet uit of je strings of integers met elkaar vergelijkt, maar het is idd netter zonder ""

edit: uiteraard operator ipv operand :)

[ Voor 6% gewijzigd door Verwijderd op 03-10-2006 16:40 ]


Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Nu maken strings of integers voor PHP niet veel uit, maar als je string er zo uit ziet:
" 10" zal dat door PHP dus niet als int(10) worden gezien he ;)

Dit werkt in ieder geval gewoon:
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
<?php

$pieces = array (10, "1");

$maxlisteners = 10;
$maintenance  = false;

// Check if the server is currently broadcasting
if ($maintenance) {
    $status = "<font color=\"red\">Server is in maintenance. Please come back later!</font>";
    $songs  = "";
}
elseif ($pieces[1] == "1") {
    if ($pieces[0] == $maxlisteners) {
        $status = "<font color=\"orange\">Server is full, try again later!</font>";
    }
    else {
        $status = "<font color=\"green\">Online</font>";
    }
}
else {
    $status = "<font color=\"red\">Offline</font>";
    $songs  = "";
}

echo $status;

?>


Ik heb je code maar meteen wat opgeschoond en ingekort :X

[ Voor 9% gewijzigd door --MeAngry-- op 03-10-2006 16:40 ]

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Shadowman schreef op dinsdag 03 oktober 2006 @ 16:38:
[...]
Dat is alleen zo als je === gebruikt, bij == wordt er niet gekeken naar de types van de variabelen, enkel naar de inhoud (eventueel geconverteerd naar het juiste type).
Dan heb ik gewoon netjes leren coden en is dit gewoon dirty :p

En @TS: Waarom die array met 2 keys? Wat stellen de waarden van piece[0] en piece[0] voor dan?

Acties:
  • 0 Henk 'm!

  • SinergyX
  • Registratie: November 2001
  • Laatst online: 18:12

SinergyX

____(>^^(>0o)>____

piece[1] lijkt me de on/off status, piece[0] dus de gebruikers.

Nog 1 keertje.. het is SinergyX, niet SynergyX
Im as excited to be here as a 42 gnome warlock who rolled on a green pair of cloth boots but was given a epic staff of uber awsome noob pwning by accident.


Acties:
  • 0 Henk 'm!

  • djcasl
  • Registratie: Juli 2003
  • Laatst online: 12-09 09:34
Is het niet makkelijker om de benamingen van pieces een wat duidelijkere naam te geven.
De één is bedoeld volgens mij of de server on- of Offline is en de ander telt het aantal gebruikers.

Maar goed dat is persoonlijk...

Ik vind het zelf altijd prettig als ik mijn eigen code over 6 maanden nog begrijp :P

There is no knowledge, that is not Power!


Acties:
  • 0 Henk 'm!

Verwijderd

--MeAngry-- schreef op dinsdag 03 oktober 2006 @ 16:38:
Nu maken strings of integers voor PHP niet veel uit, maar als je string er zo uit ziet:
" 10" zal dat door PHP dus niet als int(10) worden gezien he ;)
int(10) betekent wel niet hetzelfde dan de waarde 10...

Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Ik heb inmiddels de code aangepast met dank aan MeAngry en in de topicpost maar de volledige code geplaatst omdat er nogal wat onduidelijkheden waren met de pieces. Ik hoop dat het nu duidelijker wordt.

De pieces worden dus uit het volgende adres gehaald: http://shoutcast.stx.nl:8000/7.html
Hierbij is de 1e waarde de aantal luisteraars, 2e online/offline, 3e listeners peak, 4e max luisteraars, 5e geen idee, 6e de bitrate en de laatste het nummer wat momenteel afgespeeld wordt.

Nog steeds geen resultaat b.t.w.

[ Voor 27% gewijzigd door DeepFreeze.NL op 03-10-2006 16:57 ]


Acties:
  • 0 Henk 'm!

  • R4NCOR
  • Registratie: December 2000
  • Laatst online: 16-09 12:26

R4NCOR

eigenlijk gewoon Niels

Dat PHP 'Weak Typed' is en dus Strings en Integers met elkaar kan vergelijken is een leuke conclusie maar helpt de TS natuurlijk niet veel verder met zijn probleem :P

Ik denk inderdaad dat er gewoon whitespaces in je pieces[0] zitten.. Check eens goed wat er nou echt in zit. Dan kun je altijd nog de variabele zo bewerken (met een trim bijvoorbeeld) om de vergelijking wel recht te trekken.

Overigens is het gebruik van verschillende types wel aan te raden, dus getallen als Integers en tekst als Strings... dit (je huidige code) komt de leesbaarheid / onderhoudbaarheid van je code totaal niet ten goede :P

edit: @ TS, je bent nog steeds niet echt duidelijk over wat er nou ECHT (in characters) in pieces[0] zit. Check dat eens?

[ Voor 9% gewijzigd door R4NCOR op 03-10-2006 16:56 ]


Acties:
  • 0 Henk 'm!

Verwijderd

doe eens: print_r($pieces); ergens in je <body></body>, dan kun je de waarde zien van pieces en even controleren waarom hij de if statement if($pieces[0] == $maxlisteners) als FALSE beschouwd, wat dus kennelijk je probleem is.

Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Verwijderd schreef op dinsdag 03 oktober 2006 @ 17:00:
doe eens: print_r($pieces); ergens in je <body></body>, dan kun je de waarde zien van pieces en even controleren waarom hij de if statement if($pieces[0] == $maxlisteners) als FALSE beschouwd, wat dus kennelijk je probleem is.
kijk en huiver: http://www.disney.com/

[ Voor 3% gewijzigd door Creepy op 03-10-2006 17:19 ]


Acties:
  • 0 Henk 'm!

Verwijderd

nice... en nu nog even listeners op 10 ;)

[ Voor 7% gewijzigd door Creepy op 03-10-2006 17:19 ]


Acties:
  • 0 Henk 'm!

  • R4NCOR
  • Registratie: December 2000
  • Laatst online: 16-09 12:26

R4NCOR

eigenlijk gewoon Niels

code:
1
2
3
4
5
6
7
8
9
10
Array
(
    [0] => <HTML><meta http-equiv="Pragma" content="no-cache"></head><body>7
    [1] => 1
    [2] => 10
    [3] => 10
    [4] => 7
    [5] => 80
    [6] => A. Matsumoto & Dj Yoshi - Dreamer (The Mfa Mix)</body></html>
)


Zo'n html regel is niet echt gelijk aan 10 he? ;-) Misschien dat stuk van je script nog maar eens nalopen dus.

Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Verwijderd schreef op dinsdag 03 oktober 2006 @ 17:08:
[...]


nice... en nu nog even listeners op 10 ;)
Ik heb de waarde van maxlisteners naar 8 gebracht (wat nu is), maar de status veranders nog steeds niet...

Acties:
  • 0 Henk 'm!

Verwijderd

R4NCOR schreef op dinsdag 03 oktober 2006 @ 17:09:
code:
1
2
3
4
5
6
7
8
9
10
Array
(
    [0] => <HTML><meta http-equiv="Pragma" content="no-cache"></head><body>7
    [1] => 1
    [2] => 10
    [3] => 10
    [4] => 7
    [5] => 80
    [6] => A. Matsumoto & Dj Yoshi - Dreamer (The Mfa Mix)</body></html>
)


Zo'n html regel is niet echt gelijk aan 10 he? ;-) Misschien dat stuk van je script nog maar eens nalopen dus.
damn... vergeten bron te checken.... denk dat ze zojuist het probleem hebt opgelost... tenminste... de oorzaak hebt gevonden, nu moet TS alleen nog even het getal eruit filteren :)

Acties:
  • 0 Henk 'm!

  • R4NCOR
  • Registratie: December 2000
  • Laatst online: 16-09 12:26

R4NCOR

eigenlijk gewoon Niels

DeepFreeze.NL schreef op dinsdag 03 oktober 2006 @ 17:10:
[...]


Ik heb de waarde van maxlisteners naar 8 gebracht (wat nu is), maar de status veranders nog steeds niet...
:?
pieces[0] is een regel die begint met <html>... Dat is nooit gelijk aan 8 of 10 of elk willekeurig ander getal.

Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Woohooo, Ik heb het gevonden!!! Ik heb gebruikt gemaakt van pieces[4]. Deze geeft namelijk (zag ik net pas) ook het aantal luisteraars aan. Dit werkte wel direct. Ik snap alleen niet waarom die andere dan niet werkte, maar goed. BEDANKT ALLEMAAL!

Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Had ik nog één vraag:

Ik heb op me site 3 scripts staan die één voor één verbinding maken met me thuisserver waarop de muziek uitgezonden wordt. Is het beter om dit te combineren door 1 php bestand maken met daarin de connectie en deze dan bij de 3 scripts te includen, of gaat dat niet lukken?

[ Voor 4% gewijzigd door Creepy op 03-10-2006 17:18 ]


Acties:
  • 0 Henk 'm!

  • R4NCOR
  • Registratie: December 2000
  • Laatst online: 16-09 12:26

R4NCOR

eigenlijk gewoon Niels

DeepFreeze.NL schreef op dinsdag 03 oktober 2006 @ 17:12:
Woohooo, Ik heb het gevonden!!! Ik heb gebruikt gemaakt van pieces[4]. Deze geeft namelijk (zag ik net pas) ook het aantal luisteraars aan. Dit werkte wel direct. Ik snap alleen niet waarom die andere dan niet werkte, maar goed. BEDANKT ALLEMAAL!
Omdat (nogmaals) pieces[0] helemaal niet aangaf wat jij dacht dat 'ie aangaf ;) Daar stond namelijk die vreemde HTML regel in.

Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
R4NCOR schreef op dinsdag 03 oktober 2006 @ 17:14:
[...]

Omdat (nogmaals) pieces[0] helemaal niet aangaf wat jij dacht dat 'ie aangaf ;) Daar stond namelijk die vreemde HTML regel in.
Ik had al eerder gepost dan jullie, vandaar dat ik jullie oplossing/oorzaak nog niet had gezien...Maar wel bedankt!!

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

DeepFreeze.NL schreef op dinsdag 03 oktober 2006 @ 17:13:
Had ik nog één vraag:

Ik heb op me site 3 scripts staan die één voor één verbinding maken met me thuisserver waarop de muziek uitgezonden wordt. Is het beter om dit te combineren door 1 php bestand maken met daarin de connectie en deze dan bij de 3 scripts te includen, of gaat dat niet lukken?
Waarom zou dat niet lukken? Probeer het en je weet het ;)

Anyway, je site te pas en te onpas roepen hier heeft volgens mij geen nut voor je vragen en komt nogal spammerig over, vandaar dat ik dat even heb weggehaald.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Technicality
  • Registratie: Juni 2004
  • Laatst online: 13:07

Technicality

Vliegt rechtsom...

Ziet er netjes uit, maar bij het listen for winamp moest ik even kijken waar ik op moest klikken. Het is niet duidelijk dat het om het winamp-logo gaat.
[/usability]

Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Technicality schreef op dinsdag 03 oktober 2006 @ 17:28:
[...]

Ziet er netjes uit, maar bij het listen for winamp moest ik even kijken waar ik op moest klikken. Het is niet duidelijk dat het om het winamp-logo gaat.
[/usability]
Dankje voor de tip! Ik had het al eens eerder gehoord...Ga ik zeker even aanpassen!
Pagina: 1