Ben nu al een tijdje bezig PHP een beetje onder de knie te krijgen. Laatste projectje is een teller voor het aantal bezoekers dat online is. Dat wordt allemaal geregeld door online.php. Om design-technische redenen moeten de getallen (en dus het aantal bezoekers) vervangen worden door een plaatje. Een 1 moet dus vervangen worden door 1.gif. Het script dat ik tot nu toe heb, brengt mij een heel eind:



maar:

$tekst = "<? include "online.php"; ?>";
echo parse_smileys ($tekst);

geeft een witte pagina (m'n gevoel zei al dat dat includen als waarde binnen php niet zou werken).

<?php
function parse_smileys ($tekst)
{
// De array met alle smiley characters die vervangen
// moeten worden
$smile_characters = array(
'1',
';-)',
':D',
':P'
);

// De array met alle images die in de plaats van de characters
// erneer gezet moeten worden
$smile_images = array(
'1.gif',
'wink.gif',
'lach.gif',
'tong.gif'
);


// $i declareren
$i = 0;

// Alle smiley codes vervangen en $tekst wijzigen
foreach ($smile_characters as $character)
{
// $i ophogen
$i++;

// Wijzigen
$tekst = str_replace($character,'<img src="'.$smile_images[($i-1)].'" border="0">',$tekst);
}

// De gewijzigde $tekst retourneren
return $tekst;
}

// Voorbeeldje
$tekst = "<? include "online.php"; ?>";
echo parse_smileys ($tekst);

// :D zal vervangen worden door lach.gif
?>


<html>
<head>
<title>project-teller</title>
</head>

<body>
:D :-) 1
<? include "online.php"; ?>
</body>
</html>

Iemand een idee?
Maak de functionaliteit van online.php in een functie die uiteraard het resultaat terug geeft als plaatje.

Edit:

Als snelle oplossing kun je output buffering gebruiken:

<?php

// Grijp de uitvoer van bestand.php
ob_start();
require 'bestand.php';
$sUitvoer = ob_get_contents();
ob_end_clean();

echo $sUitvoer;

?>

Edit2:
Een php bestand kan ook iets terug geven met "return":

bestand "bestand.php":
<?php

$string = 'fdsfsdfsdf';

return $string;
?>

ander bestand:
<?php

$anderestring = include './bestand.php';

echo $anderestring;

?>


Van de 3 oplossingen is de bovenste altijd nog het mooist.
Mijn jonge PHP-kennis is jammer genoeg nog niet voldoende om die oplossing te snappen :(. Iig bedankt voor je reactie :). Iig bedankt voor je reactie :).

Zou ik $sUitvoer dan in $tekst = "..." moeten zetten, of denk ik dan te simpel?
als je die smileys wilt hebben kun je denk ik beter werken met str_replace(":D",$string,"<img src=smiley.gif");
(weet niet zeker of de volgorde van de parameters kopt)
als je trouwens een string wilt uitvoeren als php code moet je de functie eval() gebruiken, zie nl.php.net
In online.php wordt ergens een variabele aangemaakt die een getal bevat. Zet onderin het online.php dat dit neer:

<?php


return $dievariabelemetdatnummertje;
?>

en maak van

$tekst = "<? include "online.php"; ?>";

dit

$tekst = include "online.php";

en van

<html>
<head>
<title>project-teller</title>
</head>

<body>
:D :-) 1
<? include "online.php"; ?>
</body>
</html>

dit

<html>
<head>
<title>project-teller</title>
</head>

<body>
:D :-) 1
<? echo include "online.php"; ?>
</body>
</html>


Problemo Voetzie!
Door

Gijs (Armorad)
>gevorderd<

Zo gevorderd ben ik jammer genoeg nog niet :(. Heb inderdaad al een aantal manieren om smiley's te vervangen gezien, en dat is op zich het probleem niet. Dat lukt nog net wel ;). Het probleem is dat de tekst gegenereerd wordt...
AARGGH!! Werd warm van de post van Martijn! maar het levert een witte pagina op. Het probleem ligt waarschijnlijk niet ver weg, maar ik zie het nog even niet.

online.php:

<?php

$dbhost = "localhost";
$dbuser = "***";
$dbpass = "***";
$dbname = "***";

@mysql_connect($dbhost,$dbuser,$dbpass);
@mysql_select_db($dbname) or die("Geen database geselecteerd");


$timeoutseconds = 120; // 2 minuten = 120 seconden

$timestamp=time();
$timeout=$timestamp-$timeoutseconds;
$ip = substr($_SERVER['REMOTE_ADDR'], 0, strrpos($_SERVER['REMOTE_ADDR'],"."));


$loopcap = 0;
while($loopcap<3 && @mysql_query("INSERT INTO useronline VALUES('". $timestamp ."','". $ip ."','". $_SERVER['PHP_SELF'] ."')"))
{ // In geval van error
$timestamp = $timestamp+$ip{0}; $loopcap++;
}


@mysql_query("DELETE FROM useronline WHERE timestamp<". $timeout);


$result = @mysql_query("SELECT DISTINCT ip FROM useronline");
$user = @mysql_num_rows($result);


mysql_free_result($result);

echo ($user == 1) ? $user ." gebruiker online" : $user ." gebruikers online";
?>

<?php
return $user;
?>

test2.php:

<?php
function parse_smileys ($tekst)
{
// De array met alle smiley characters die vervangen
// moeten worden
$smile_characters = array(
'1',
';-)',
':D',
':P'
);

// De array met alle images die in de plaats van de characters
// erneer gezet moeten worden
$smile_images = array(
'1.gif',
'wink.gif',
'lach.gif',
'tong.gif'
);


// $i declareren
$i = 0;

// Alle smiley codes vervangen en $tekst wijzigen
foreach ($smile_characters as $character)
{
// $i ophogen
$i++;

// Wijzigen
$tekst = str_replace($character,'<img src="'.$smile_images[($i-1)].'" border="0">',$tekst);
}

// De gewijzigde $tekst retourneren
return $tekst;
}

// Voorbeeldje
$tekst = "<? echo include "online.php"; ?>";
echo parse_smileys ($tekst);

// :D zal vervangen worden door lach.gif
?>


<html>
<head>
<title>project-teller</title>
</head>

<body>
:D :-) 1
<? echo include "online.php"; ?>
</body>
</html>


Help!
Probeer het zo eens:

<?php
error_reporting(E_ALL);

$dbhost = "localhost";
$dbuser = "***";
$dbpass = "***";
$dbname = "***";

@mysql_connect($dbhost,$dbuser,$dbpass);
@mysql_select_db($dbname) or die("Geen database geselecteerd");


$timeoutseconds = 120; // 2 minuten = 120 seconden

$timestamp=time();
$timeout=$timestamp-$timeoutseconds;
$ip = substr($_SERVER['REMOTE_ADDR'], 0, strrpos($_SERVER['REMOTE_ADDR'],"."));


$loopcap = 0;
while($loopcap<3 && @mysql_query("INSERT INTO useronline VALUES('". $timestamp ."','". $ip ."','". $_SERVER['PHP_SELF'] ."')"))
{ // In geval van error
$timestamp = $timestamp+$ip{0}; $loopcap++;
}


@mysql_query("DELETE FROM useronline WHERE timestamp<". $timeout);


$result = @mysql_query("SELECT DISTINCT ip FROM useronline");
$user = @mysql_num_rows($result);


mysql_free_result($result);

//echo ($user == 1) ? $user ." gebruiker online" : $user ." gebruikers online";

return $user;
?>

test2.php:

<?php
error_reporting(E_ALL);

function parse_smileys ($tekst)
{
// De array met alle smiley characters die vervangen
// moeten worden
$smile_characters = array(
'1',
';-)',
':D',
':P'
);

// De array met alle images die in de plaats van de characters
// erneer gezet moeten worden
$smile_images = array(
'1.gif',
'wink.gif',
'lach.gif',
'tong.gif'
);


// $i declareren
$i = 0;

// Alle smiley codes vervangen en $tekst wijzigen
foreach ($smile_characters as $character)
{
// $i ophogen
$i++;

// Wijzigen
$tekst = str_replace($character,'<img src="'.$smile_images[($i-1)].'" border="0">',$tekst);
}

// De gewijzigde $tekst retourneren
return $tekst;

} # einde functie parse_smileys

// Voorbeeldje
$tekst = include "online.php";
echo parse_smileys ($tekst);

// :D zal vervangen worden door lach.gif

echo '<html>
<head>
<title>project-teller</title>
</head>

<body>
:D :-) 1
' . $tekst . '
</body>
</html>';
?>
waarom pak je niet gewoon een ubb parser?
Ok... het geeft een resultaat: het plaatje, gevolgd door ":D :-) 1 1". Ik ga even nadenken welke conclusie ik daaruit zou kunnen trekken: ik maak er even een php-leermoment van :P. Martijn!, zie jij het in 1x? Be my hero!

Tussentijds resultaat: volgens mij werkt het... weet alleen niet wat er gebeurt als de aantallen boven de 9 komen...

Reageren