Inleiding
PHP wordt voornamelijk gebruikt om html te genereren, maar is op vele andere manieren toepasbaar.
Een van die manieren is om het te gebruiken om Flash filmpjes te laten communiceren met de server.
De Flash authoring tool is software die het mogelijk maakt om grafisch hoogwaardige, geanimeerde en dynamische content voor het web te maken.
Deze flash content wordt afgespeeld via een plugin in de browser (de flash player) en wordt in een html pagina geplaats door middel van de <object> en de <embed> tags.
Sinds flash 4 is het mogelijk om met de server te communiceren, en sinds flash MX (versie 6, maar de naamgeving is niet meer oplopend) zijn de mogelijkheden sterk verbeterd. Dit onder andere door middel van de LoadVars Class in flash, en door de grote vooruitgang in de scripting taal binnen flash, die gebaseerd is op ECMA script, dezelfde taal waar Javascript op is gebaseerd.
Een groot voordeel van flash content is dat er geen page refresh nodig is om data binnen te halen, waardoor de applicatie toegangelijk blijft terwijl er data uitgewisseld wordt met de server, wat ervoor zorgt dat er een goede user experience kan ontstaan (als het goed wordt toegepast).
Het is dus onder andere mogelijk om via de server:
- highscore lijsten te maken voor games
- formulieren in flash (met client side form checking) te maken
- nieuws uit een database te halen
- xml files in te laden
- connectie maken met een andere server via fsockopen()
- faq lijsten te maken.
- web services aan te spreken.
De mogelijkheden zijn enorm, en dit alles met een interface die weliswaar een plugin vereist maar veel mooier op te maken is dan html.
Bedenk dat enkele van bovenstaande dingen ook mogelijk zijn met een ander type database (MSSQL, postgreSQL) en met een andere server side scriptingtaal (asp, coldfusion) en methoden (zoals flash remoting, xml, flashcommunication server).
In het volgende voorbeeld wordt er een flash applicatie gemaakt die door middel van het LoadVars Object van flash, via php het nieuws ophaalt uit een mysql database.
Tevens worden er een aantal "best practices" beschreven (of deze zitten impliciet in de code of het commentaar) om te programmeren voor communicatie tussen flash en php.
tutorial
De opbouw van deze tutorial is als volgt:
1. Eerst wordt de tabel gemaakt en gevuld in de mysql database.
2. Hierna zetten we onze flash movie op.
3. Als laatste gaan we ons php script maken.
ad 1.
Het aanmaken van de tabel in de mysql database.
Eerst voeren we de create statement uit:
CREATE TABLE phpfreakz_flash_tutorial(
nieuws_id INT NOT NULL PRIMARY KEY auto_increment, #De primaire sleutel
nieuws_titel VARCHAR(100) NOT NULL, #De titel
nieuws_kop VARCHAR(255) NOT NULL, #De kop
nieuws_text TEXT NOT NULL, #de body van het artikel
nieuws_datum DATE NOT NULL, #de datum van het nieuws
nieuws_zichtbaar TINYINT(1) NOT NULL DEFAULT 1 #is het nieuws zichtbaar of niet (dit veld fungeert als ja/nee switch met waarden 1 en 0
);
De tabel bestaat uit een primaire sleutel, een titel, een kop (soort subtitel) een een tekst.
We willen dat de gebruiker deze tekst zo lang kan maken als hij wil en daarom definieeren we het als een TEXT veld.
De datum gebruiken we om op te kunnen ordenen, en om duidelijk te maken van wanneer ons nieuws is.
Er is ook een veld waarmee we aangeven of een artikel opgehaald moet worden of niet.
Hierna wordt er data toegevoegd.
INSERT INTO phpfreakz_flash_tutorial(nieuws_id, nieuws_titel, nieuws_kop, nieuws_text, nieuws_datum, nieuws_zichtbaar) VALUES (NULL,'PHP en Flash Artikel op PHPFreakz','Een artikel door \'De Kale\'','Ga naar <u><a href=\'http://www.phpfreakz.nl\' target=\'_blank\'>phpfreakz</a></u> voor het volledige verhaal', NOW(),1);
INSERT INTO phpfreakz_flash_tutorial(nieuws_id, nieuws_titel, nieuws_kop, nieuws_text, nieuws_datum, nieuws_zichtbaar) VALUES (NULL,'Begin tutorial flash en PHP + mysql ','Groot feest!','Rolf Vreijdenberger, alias \'De Kale\' van <u><a href=\'http://www.dpdk.nl\' target=\'_blank\'>De Pannekoek en De Kale</a></u> schrijft een artikeltje voor phpfreakz.nl.<br>De Pannekoek en De Kale houden zich voornamelijk bezig met flash games en dynamische websites met een flash interface, ondersteund door custom content management systemen.', '2004-05-05',1);
INSERT INTO phpfreakz_flash_tutorial(nieuws_id, nieuws_titel, nieuws_kop, nieuws_text, nieuws_datum, nieuws_zichtbaar) VALUES (NULL,'Rolf jarig','Groot feest','Rolf is jarig vandaag', '2004-01-05',0);
INSERT INTO phpfreakz_flash_tutorial(nieuws_id, nieuws_titel, nieuws_kop, nieuws_text, nieuws_datum, nieuws_zichtbaar) VALUES (NULL,'AMFPHP','AMFPHP, het opensource flash remoting alternatief','kijk op de <u><a href=\'http://www.amfphp.org\' target=\'_blank\'>amfphp website</a></u> voor het volledige verhaal<br><u><a href=\'http://www.dpdk.nl/projects/remoting\' target=\'_blank\'>Remoting toepassing van DPDK</a></u>', '2004-01-02',1);
INSERT INTO phpfreakz_flash_tutorial(nieuws_id, nieuws_titel, nieuws_kop, nieuws_text, nieuws_datum, nieuws_zichtbaar) VALUES (NULL,'Tutorial op DPDK site','Deze tutorial is ook te bekijken op de DPDK site','klik <u><font color="#FF0000"><a href=\'http://www.depannekoekendekale.nl/projects/phpfreakz\' target=\'_blank\'>hier</a></font></u>', '2004-01-01',1);
Zoals je ziet staan er hyperlinks in sommige (TEXT) velden. Deze worden omgeven door <u> tags omdat flash deze niet standaard underlined in zijn tekstvelden.
Sinds flash versie 7 is het ook mogelijk om een stylesheet te laden in flash waar je dit soort properties makkelijk mee kunt regelen, maar deze tutorial richt zich op de versie met de minste functionaliteit: versie 6.
In versies voor de flashplayer 6 worden alleen de html tags "<u>", "<i>", "<font color="" size="">", "<a href="" target="">" en "<b>" ondersteund.
ad 2.
Het opzetten van de flash movie
De volgende stap is het creeren van de flash movie, waarin we onze code gaan zetten.
Flash werkt met een timeline, waarin je diverse layers kan plaatsen. Deze layers kun je gebruiken om je grafische content in te plaatsen, net zoals in bijvoorbeeld photoshop. Je kunt je code intypen door een frame van de timeline te selecteren en het actions panel te openen. Hier kun je dan je code intypen.
Open een nieuwe flash movie.
Maak een nieuwe layer aan, en noem deze "actions", hierin komt al de code te staan
Klik in de eerste keyframe van je actions layer, en open dan het actions panel, waar de acties ingetypt kunnen worden.
Variables en Objecten in Flash hoeven niet vooraf gegaan te worden met een '$' zoals in php.
Type je code in in het actions panel... veel plezier ;)
De volgende stappen zijn nodig om het geheel te laten werken in flash:
2.1. De url van het php script, om mee te communiceren
2.2. Een textField Object, om de opgehaalde data te kunnen laten zien
2.3. Twee LoadVars Objecten: 1 om de data te sturen, 1 om de data te ontvangen.
Het kan er ook 1 zijn(zowel voor zenden als ontvangen van data), maar met deze methode kan er geen property van het zend object overschreven worden.
2.4. Een parameter voor het LoadVars Object dat de data verstuurt.
Deze parameter wordt in het php script gebruikt.
Al naar gelang de waarde van deze parameter kan er in het php script wat conditionele logica toegepast worden (if condities)
2.5. Een callback handler voor het ontvangende LoadVars Object.
Dit is een methode (onLoad) die automatisch wordt uitgevoerd als alle data van het script binnen is in de flashmovie.
2.6. Hierna kan de communicatie opgezet worden dmv. de sendAndLoad methode van het LoadVars object
ad 2.1. De url van het php script kan op de volgend manieren opgezet worden:
- relatief: draait alleen vanuit een webserver(lokaal of remote), dus niet vanuit de flash ontwikkelomgeving.
Deze methode is aan te raden als de site op het internet staat.
nieuwsUrl ="phpfreakz_flash_tutorial.php";
- absoluut (niet lokaal): in de flash ontwikkelomgeving is het mogelijk om absolute url's aan te roepen, vanaf een internetdomein is dit alleen mogelijk op hetzelfde domein als waar de .swf file staat (hier zijn workarounds voor).
Deze methode is aan te raden als er niet lokaal gewerkt wordt via een locale webserver, maar als er wel met live data gewerkt moet worden in de ontwikkelomgeving van flash, je kunt dan de webserver aanspreken met zijn absolute pad.
nieuwsUrl = "http://www.depannekoekendekale.nl/projects/phpfreakz/phpfreakz_flash_tutorial.php";
- absoluut (lokaal): via localhost en het pad waar de file staat, dit kan vanuit de flash ontwikkelomgeving.
Deze methode is goed als je met live data wilt werken, die lokaal staat.
Dit is dus een handigheidje, zodat er ook lokaal goed gewerkt kan worden op je locale webserver.
nieuwsUrl ="http://localhost/dpdk/projects/phpfreakz/phpfreakz_flash_tutorial.php";
nieuwsUrl ="http://localhost/dpdk/projects/phpfreakz/phpfreakz_flash_tutorial.php";//vul hier de optie in die voor jou van toepassing is
ad 2.2. Maak nu een nieuwe layer en noem deze layer "tekstveld". Zet in de keyframe op deze layer een nieuw textveld op de stage.
Het is mogelijk om een textveld object programmatisch neer te zetten maar er kan ook een textveld in de flash ontwikkelomgeving op de stage gezet worden.
Dit is te prefereren als er een vaste layout van de site is, met op diverse plaatsen elementen die al een vaste plek in de layout hebben gekregen.
Als we het tekstveld op de stage hebben gezet moeten we dit object een instance naam geven, flash geeft namelijk code hints in de ontwikkelomgeving als er bepaalde suffixes aan instance namen hangen. Voor instances van het textField Object is dat '_txt'.
Als de naam ingetypt wordt in flash en daarna een '.' (OOP style flash) is er een lijst te zien met methoden en properties van dat object.
Voor het tekstveld wordt een default kleur van wit gekozen.
Door de html propertie van de tekstveld instantie te veranderen kan er tekst met html opmaak worden weergeven. We spreken nu de instantie aan met zijn instance name.
nieuws_txt.html = true;//html tags worden geinterpreteerd
nieuws_txt.wordWrap = true;//de tekst zal wrappen in het tekstveld
ad 2.3. Maak in je actions layer een nieuw LoadVars object dat data gaat verzenden.
Het LoadVars object is een standaard flash object (sinds flash MX)
met een aantal vooraf gedefinieerde methodes en properties, (code hint suffix: '_lv')
die het mogelijk maken om met server side scripts te communiceren via url encoded variables.
De urlencoded variables worden verzonden en ontvangen.
In php kunnen deze uit de $_POST superglobal array gehaald worden (indien je de data zend met "POST", "GET" is ook een optie).
Deze variables kunnen in het php script gebruikt worden om een actie mee uit te voeren door middel van conditionele logica.
Het php script zal uiteindelijk een reactie aan flash sturen door output te printen.
Dit zorgt ervoor dat de output ook gecontroleerd kan worden in de browser.
In flash komt de data binnen in een urlencoded string met name value pairs.
voorbeeld: '&r=1&b=nieuws+is+opgehaald.&'
zend_lv = new LoadVars();
Maak een LoadVars object dat data gaat ontvangen
ontvang_lv = new LoadVars();
ad 2.4. Er wordt een parameter aan het verzend object meegegeven.
Deze parameter zorgt ervoor dat er in het php script, via conditionele logica, het juiste actie blok uitgevoerd wordt.
Op dezelfde manier kunnen er properties van het object gedefinieerd worden die als variabeles aanwezig zullen zijn in het php script.
Bijvoorbeeld:
zendObject.variableVoorPhp = 15
In php, als de data is verstuurd via flash: echo $_POST['variableVoorPhp'];//output "15"
De parameter die gestuurd wordt noemen we "m", voor "mode".
Het is goed om te proberen je data die je verstuurt zo klein mogelijk te houden, zodat er geen onnodige bytes verstuurd moeten worden.
Zorg er echter wel voor dat het niet ten koste gaat van de duidelijkheid van je code.
In flash maakt het meestal niet zoveel uit, aangezien je voornamelijk requests doet om de data op te halen.
In php daarentegen geef je vaak grote hoeveelheden data mee. Als je al deze stukjes data afzonderlijk benoemd, bijvoorbeeld "nieuwsDatum1" "nieuwsDatum2" "nieuwsDatum(N)" dan zie je al direct dat dit qua dataverkeer erg groot kan worden als N erg groot wordt.
Een betere naamgeving zou dan zijn "nD1" "nD2" etcetera. Later in het artikel wordt er meer verteld over de manier waarop php variables naar flash stuurt.
zend_lv.m = "haalNieuws";
ad 2.5. Definieer de nu callback functie, een methode van het ontvangende LoadVars Object.
Deze wordt uitgevoerd op het moment dat alle data van php binnen is en urldecoded is.
Voordat deze callback wordt uitgevoerd, zorgt flash voor het urldecoden van alle binnengekomen urlencoded name/value pairs, en kent ze toe als propertiesaan het LoadVars object, zodat ze vanuit het LoadVars object direct kunnen worden aangesproken.
In deze methode wordt de binnengekomen php data verwerkt.
ontvang_lv.onLoad = function(succes){
if(succes){//interne flash check
/*
trace laat de waarde van het argument zien in het output venster van de flash authoring tool
en is goed om te kunnen zien wat er gebeurt in de flash movie tijdens het debuggen.
*/
trace("communicatie succesvol");
/*
Nu wordt de property "r" bekeken van het LoadVars object.
Dit is de resultaat (r) variabele uit php. Indien de waarde 1 is, is er een goed resultaat.
Als het geen 1 is wordt de foutmelding getoond (die nu ook een property is, nl. "b" (boodschap))
Het is dus ook mogelijk om andere waarden aan r mee te geven vanuit php,
en de handling in flash hierop aan te passen.
*/
if(Number(this.r) == 1){// alles is goed gegaan.
trace("het resultaat is goed: " + this.b);
/*
output de nieuws text, die in php is opgemaakt, naar het textveld
De variabele voor het nieuws is "n"
Het is beter om de tekst op te maken in php dan in flash,
omdat php files makkelijker te editen zijn. Er is namelijk enkel een
texteditor nodig, en voor flash moet er speciale software gebruikt worden (nl. Flash),
en moet de flash file opnieuw gecompileerd worden.
Daarbij is tekstbewerking in php veel sneller dan flash, dat uitgevoerd wordt door middel van de
flash player, een kleine plugin, in de client (browser). Deze plugin krijgt weinig resources van de computer.
*/
nieuws_txt.htmlText = this.n;
}else{//foute waarde van resultaat variabele
//laat de error boodschap zien die vanuit php is meegekomen ("b")
nieuws_txt.htmlText = this.b;
}
}else{//geen succesvolle interne check
trace("communicatie niet succesvol");
nieuws_txt.htmlText = "Er is een fout opgetreden bij het aanroepen van " + nieuwsUrl + ": parse error, of het script kan niet bereikt worden (niet aanwezig of geen internet verbinding)";
}
}//einde onLoad callback
In deze callback worden de acties aangegeven die plaats moeten vinden als de data (goed of fout) binnen is gekomen.
Eerst vindt er een interne check plaats die de door ons genoemde "succes" parameter van de functie controleert (het is een boolean).
Deze zal alleen false zijn als er een parse error in het script zit dat de data binnenlaadt, of als er een fout is in de netwerk verbinding.
Onze error handling in flash zal dan een boodschap schrijven in het nieuws_txt textveld door middel van de "htmlText" property van het tekstveld object.
Als de data wel goed is binnengekomen gaan we checken op de data die expliciet door het script is teruggestuurd naar flash.
Dit doen we als eerste door de variable "r" te bekijken.
Deze moet nu als een property van het ontvangende LoadVars object bestaan, en daarom refereren we in deze callback naar deze property met "this.r".
Alle variables die binnenkomen via een LoadVars object in flash zijn strings. (andere datatypes zijn alleen maar binnen te krijgen op andere manieren namelijk met flash remoting, zie nieuwsartikel in deze tutorial)
Er wordt eerst gecontroleerd op de result variable "r" (van "resultaat"). We checken expliciet op de numerieke waarde in flash, daarom converteren we deze waarde van de "r" propertie naar een nummer.
Is deze "1" dan weten we dat er geen fouten zijn, want dan zou er een "0" teruggekomen zijn via onze custom error handling in het php script (daarover later meer).
Door op deze manier te werken kunnen we dus in flash ook op de hoogte gesteld worden van andere resultaat levels en hier expliciet op controleren (handmatig of via een algoritme).
In ieder geval sturen we ook altijd een "b" variable mee naar flash, die een textuele boodschap bevat. In het geval van een fout kunnen we deze dus in het tekstveld plaatsen om de gebruiker een indicatie te geven van wat er fout is gegaan.
In complexe applicaties zal er nog wat meer error handling moeten zijn aan de flash kant, want je wilt natuurlijk niet dat bepaalde acties plaatsvinden als er geen data is.
Als alles nu goed is ( Number(this.r) == 1) ) kunnen we er zeker van zijn dat de nieuws tekst ook binnen is gekomen.
Deze hebben we als geheel in de variable "n" gezet en kan ook html tags bevatten, zodat we er bijvoorbeeld hyperlinks en font kleuren in kunnen zetten.
Met "nieuws_txt.htmlText = this.n" zetten we het nieuws in het tekstveld.
ad 2.6. Nadat de callback functie is gedefinieerd, wordt er een request gemaakt om de data te versturen vanuit flash en te laden via php.
Gebruik de sendAndLoad methode van het LoadVars object om de data op te halen en om tegelijkertijd data mee te geven aan het script.
De sendAndLoad methode heeft drie parameters:
(1) de url, een string
(2) het ontvangende object (het is een object, dus geen string!)
(3) De methode om data te verzenden (GET/ POST), een string
zend_lv.sendAndLoad(nieuwsUrl,ontvang_lv,"POST");
Nu we alle stappen hebben uitgevoerd laten we de gebruiker zien wat we gaan doen tijdens het laden van de data.
Dit is van belang als er grote hoeveelheden data worden ingeladen en we wat langer moeten wachten.
Dit wordt gedaan door de htmlText propertie van het textObject nieuws_txt een waarde toe te kennen.
Dit is dan de tekst die in het tekstveld verschijnt. Deze waarde wordt overschreven op het moment dat de data via php binnenkomt via de acties de we dan gaan uitvoeren.
nieuws_txt.htmlText = "bezig om de data te laden...";
ad 3.
Het php script dat met de flash movie communiceert.
Maak een nieuw php script (hier heet het php script "phpfreakz_flash_tutorial.php")
Als we dit script vanuit flash aanroepen, hebben we het natuurlijk zo geprogrammeerd dat we altijd juiste parameters meesturen om de blokken conditionele logica goed uit te voeren.
Voor de testfase is het echter makkelijk als we het script direct kunnen aanroepen in de browser.
Daarom gebruiken we tijdens het ontwikkelen altijd $_REQUEST ipv $_POST om de variables vanuit flash op te vangen.
POST is de methode waarmee we vanuit flash dit script aanroepen.Het is echter zo dat $_REQUEST een array is die oa. ALLE GET POST en COOKIE variabelen bevat.
Let dus goed op eventuele naam conflicten die op kunnen treden als je een cookie hebt met dezelfde naam hebt als je post variable, cookies worden namelijk met voorrang op GET en POST uit de $_REQUEST array gehaald!
Door tijdens het ontwikkelen dus $_REQUEST te gebruiken kunnen we dus dit script testen door variabelen mee te geven in de URL: flashdata.php?haalNieuws=true
Hierdoor kunnen we de output van het script dus direct in de browser zien, zodat we niet hoeven te debuggen vanuit flash alleen.
Parse errors zijn nu veel makkelijker te ontdekken, en je hoeft niet iedere keer je flash movie te compileren of te bekijken om te zien wat het resultaat is van de communicatie met het script.
Tevens zetten we tijdens het ontwikkelen de error_reporting op "error_reporting(E_ALL)", dan zien we direct waar het script niet goed is (inclusief niet geinitialiseerde variabelen!). Als de site live gaat zetten we de error_reporting op "error_reporting(0)", zodat we geen last hebben van lelijke boodschappen.
Als de query om nieuws op te halen niet lukt, willen we deze foutmelding onderdrukken. Wel wordt er dan een custom error naar flash gestuurd, we doen namelijk onze eigen error handling, zodat de user toch weet dat er iets mis is gegaan. In dit geval is de error handling erg simpel (namelijk een error opvangen en een custom boodschap naar flash doorgeven) maar je kunt hier natuurlijk ook je errors loggen, of andere acties ondernemen.
Uiteindelijk worden in het script als we live gaan alle "$_REQUEST" vervangen door de juiste superglobal array (dus bijvoorbeeld $_POST, of $_COOKIE als je die ergens gebruikt hebt).
Door deze maatregelen kan niemand tijdens het 'proben' van het script genieten van (eventuele) foutmeldingen, of makkelijk de verschillende
acties uitvoeren die we gedefinieerd hebben (Je kunt data wel posten, maar dat is al net iets vervelender).
We gaan verder met het script.
error_reporting(0);//zet op 0 als de site live is, E_ALL tijdens ontwikkeling
Nu worden de database connectie parameters vanuit een externe file ingeladen. Ze zijn gedefinieerd als constanten, zodat ze niet in de connectie functie (die we later definieren) met global aangeduid hoeven te worden, maar direct beschikbaar zijn in de functie scope.
if(! include("./database.inc.php") ){//preferably outside the web root...
echo '&r=0&b='.urlencode('De file met de database connectie parameters kon niet geinclude worden door '.$_SERVER['PHP_SELF']).'&';
exit;
}
Er wordt door bovenstaand stukje code gekeken of het is gelukt om de file te includen. Lukt dat niet, dan zal er een boodschap gegeven worden aan flash en zal het script door de 'exit' niet verder meer uitgevoerd worden.
De 'echo' voert de taak uit om flash te verwittigen.
De manier om data via 'LoadVars' naar flash te sturen is door simpelweg alles direct te echo-en of te printen. Er hoeven dus geen html tags geschreven te worden, het gaat puur en alleen om het printen van urlencoded name/value pairs.
De output naar flash is een string met urlencoded name/value pairs waarbij de waarde van de value toegekend wordt met een '=' teken en de variabelen gescheiden worden door een '&'.
Bijvoorbeeld: '&naam=Rolf&achternaam=Vreijdenberger&bijnaam=De+Kale&'.
Deze string moet je dus vanuit je php script rechtstreeks naar de browser sturen. Dit doe je simpelweg door het zo te echo-en naar de browser, zonder html tags.
Waarom urlencoded? Omdat flash het ampersand (&) teken gebruikt om de variables van elkaar te scheiden.
Indien je de string "&zin=rolf zegt: flash&php=tof" zomaar doorstuurt, denkt flash dat het gaat om de variabele 'zin' met de waarde "rolf zegt: flash" en de variabele 'php' met de waarde "tof", terwijl we in dit geval bedoelen 'zin' met de waarde "rolf zegt: flash&php=tof" (geen goed nederlands, maar je krijgt het idee ;) ).
Tevens worden andere tekens die een betekenis hebben op de juiste manier geencodeerd. Door de output te urlencoden zorg je ervoor dat de data veilig over het netwerk reist en dat de variables juist geinterpreteerd worden.
De output die naar flash wordt gestuurd in geval van een mislukte include bestaat uit de variable 'r' van 'resultaat' met een waarde 0 en de variable 'b' van boodschap met een textuele boodschap om de gebruiker in te lichten.
In het gedeelte van deze tutorial waar het flashgedeelte wordt beschreven kun je nog eens bekijken wat voor acties er genomen zullen worden als deze variables binnenkomen in flash.
De file met de database connectie parameters zul je zelf aan moeten maken en via het juiste pad moeten includen.
De file met de database connectie parameters zelf zal er als volgt uitzien:
<?php
define("MYSQL_USER","username");//usernaam
define("MYSQL_PASSWORD","password");//passwoord
define("MYSQL_SERVER","localhost");//het server adres
define("MYSQL_DATABASE","database");//database
?>
De volgende funtie legt een connectie met de database en geeft true/false terug, de connectie parameters komen uit de include file.
Deze functie zou je normaal gesproken ook in een include file definieren, maar voor deze tutorial definieren we de functie in het huidige script.
function connecttodatabase(){
if (!$databaseLink = mysql_connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD)) {// connectie parameters uit de include file
return false;
}
if (!mysql_select_db(MYSQL_DATABASE, $databaseLink)) {
return false;
}
return $databaseLink; //we arrive at this point if connection is made, and database is selected!
}//end databaseverbinding function
In dit geval communiceert flash alleen met dit script om informatie uit de database te krijgen,maak dus altijd _eerst_ een verbinding met de database, en stop als het niet lukt.
if(!$link = connecttodatabase() ){
echo '&r=0&b='.urlencode('Er kon geen verbinding met de database gemaakt worden, pas de database connectie parameters aan in '.$_SERVER['PHP_SELF']).'&';
exit;
}
als we hier komen is er een actieve databaseverbinding, en gaan we door met het script.
Nu wordt de "m" parameter uit flash opgevangen in het php script, en deze wordt bewaard in de variable "$mode".
Controleer wel eerst of deze parameter bestaat, zo niet, dan wordt deze expliciet op NULL gezet.
$mode = isset($_REQUEST['m']) ? $_REQUEST['m'] : NULL;
De waarden van de "m" parameter die we opvangen wordt uit de $_REQUEST array gehaald, dit kunnen we gebruiken om te debuggen door deze direct als query string in te typen achter de url.
We gooien nu deze parameter in een switch statement. Hier is dat niet nodig omdat we maar 1 waarde hebben voor "m", maar als er meer flash calls gaan naar dit script kunnen we eenvoudig meer opties toevoegen.
switch($mode){
case "haalNieuws":
$sql = "SELECT
nieuws_titel, nieuws_kop, nieuws_text, DATE_FORMAT(nieuws_datum,'%d-%m-%Y') as datum
FROM
phpfreakz_flash_tutorial
WHERE
nieuws_zichtbaar = 1
ORDER BY
nieuws_datum DESC, nieuws_id DESC
LIMIT 0, 10";
if(!$r = mysql_query($sql, $link)){
echo '&r=0&b='.urlencode('Het nieuws kon niet opgehaald worden: ').mysql_error().'&';
exit;
}
$output = NULL;
while($w = mysql_fetch_object($r)){
$output .= '<font color="#aaaaaa">';
$output .= $w->datum;
$output .= '</font>';
$output .= ': ';
$output .= '<b>';
$output .= htmlentities(stripslashes($w->nieuws_titel));
$output .= '</b>';
$output .= '</font>';
$output .= '<br />';
$output .= '<font color="#aaaaaa">';
$output .= htmlentities(stripslashes($w->nieuws_kop));
$output .= '</font>';
$output .= '<br />';
$output .= nl2br(stripslashes(ereg_replace("\r",'',$w->nieuws_text)));
$output .= '<br /><br />';
}
$output = urlencode($output);//zorg voor veilig netwerk transfer naar flash
echo '&r=1&b='.urlencode('nieuws succesvol opgehaald').'&n='.$output.'&';
exit;
break;
case "andereParam":
break;
default:
break;
}
Hier gebeurde het allemaal! In de eerste case controleerden we op "haalNieuws". Dit is de waarde die van flash komt voor de "m" parameter. Dan komen we dus in het eerste blok conditionele logica.
Als eerste maken we de query aan. Deze zetten we voor de leesbaarheid over meerdere regels, aangezien whitespace door database management systemen genegeerd wordt.
In de query halen we alleen de velden op die we willen, alleen als ze zichtbaar moeten zijn en we ordenen ze eerst op datum van nieuw naar oud, en indien ze dezelfde datum hebben op volgorde van laatst toegevoegde nieuwsitem.
Vervolgens wordt de query uitgevoerd en checken we of de query wel lukt, zo niet dan sturen we een "r" (resultaat) van 0 naar flash met een boodschap("b") die in dit geval ook de error boodschap van mysql zelf bevat (maar dat is aan jou om die al dan niet mee te geven).
Daarna verlaten we het script via de "exit".
Als de query wel goed gelukt is, is het stukje binnen de if conditie niet uitgevoerd en gaan het script gewoon door.
Eerst zetten we dan de variable $output op NULL (initialisatie). Dit wordt gedaan zodat we geen notice krijgen als we data aan deze string gaan toevoegen later en als we de error_reporting(tijdens het ontwikkelen) op "E_ALL" hebben staan.
En ook natuurlijk omdat het netjes is om al je variables te declareren of te initialiseren in (of aan het begin) van je script!
Er wordt nu een loop opgezet waarmee we de resultset van de query gaan uitlezen en per iteratie opslaan in het object "$w".
Er wordt in de body van de loop data toegevoegd aan de variable $output. Deze data wordt toegevoegd zolang als er meer rijen zijn in de resultset.
Dat wil dus zeggen dat alle resultaten die we voor de query hebben gekregen in onze $output variable worden gestopt als we dat in de body van de loop zetten.
Hier kan aan de inhoud van onze output een opmaak gegeven worden.
De datum wordt als eerste neergezet, met <font> tags eromheen die definieren dat de datum in het lichtgrijs wordt weergegeven.
Daarna zetten we de titel neer. We halen waarde van de titel door de functie htmlentities heen, zodat eventuele html tags die in deze titel staan niet worden geinterpreteerd als html, maar letterlijk als de tekens die er staan.
De tekst van het TEXT veld halen we NIET door deze functie heen, zodat gebruikers hier linkjes in kunnen zetten en de tekst op kunnen maken.
De default kleur van het flash tekstveld is wit, en door de font tags te gebruiken kunnen we dus de kleur nog aanpassen van verschillende stukjes tekst via zowel php als via de data zelf.
Tevens gebruikt dit script de functie ereg_replace() om alle "\r" uit de tekst in het TEXT veld van de database te halen.
Indien je via windows tekst invoert in de database, zal een druk op de "return" toets een "\r\n" invoeren in het veld.
Flash zet een line break neer voor iedere "\r" en iedere "\n" in de tekst. De "\n" wordt geconverteerd via de functie nl2br() en de "\r" halen we er handmatig uit.
Als dit niet wordt gedaan zullen er dus 2 linebreaks staan waar er maar 1 moet staan.
Als de while loop stopt omdat we door alle rijen van de resultset geloopt zijn bereiken we het punt waar we de data naar flash gaan sturen.
Eerst halen we de data nog door de functie urlencode() heen om alle "&" uit de tekst te halen, zodat we de data veilig kunnen versturen.
Daarna word alles ge-echo'd als name/value pair. Het resultaat ("r") is 1, de boodschap ("b") is dat alles gelukt is en het nieuws zit in de variable "n".
Dit alles netjes ingesloten door ampersands. De exit zorgt ervoor dat het script niet verder uitgevoerd wordt.
In de andere cases kun je andere dingen uitvoeren, die door hetzelfde of door andere flashfilmpjes nodig zijn.
Er is geen default gedefinieerd hier, maar dat is natuurlijk altijd mogelijk.
Om af te sluiten is er nog een klein stukje code om het allemaal netjes te doen.
echo '&r=0&b='.urlencode('Geen of onjuiste parameters meegestuurd').'&';
sleep(1);
exit;
Bovenstaande code wordt alleen uitgevoerd als er geen parameters aan het script worden meegegeven.
Dit wordt gedaan, zodat als iets niet goed gaat (als je vergeet een param mee te geven vanuit flash) er toch een boodschap aan flash wordt meegegeven.
Dat is hier niet zo belangrijk, maar bij geavanceerdere toepassingen wel.
Een voorbeeld: als flash door een aantal waarden heen moet loopen, en deze verwacht een parameter "t" (teller) hiervoor, dan zou flash in een oneinidige loop komen. DAt is duidelijk niet gewenst, dus zorg er altijd voor dat je rekening houd met dit soort omstandigheden en goede error handling doet.
Controleer tot slot de code gewoon in een browser door eerst direct het script aan te roepen via zijn url.
Eventuele parse errors zullen dan meteen aan het licht komen.
Controleer daarna of de output ook klopt door achter de url een query string te plakken (dit kan omdat we de "m" parameter uit flash opvangen uit de $_REQUEST array): phpfreakz_flash_tutorial.php?m=haalNieuws.
Als alles goed is gedaan zul de nieuws items als output zien. Omdat we goede error handling hebben gebruikt zal er ook een boodschap te zien zijn als er iets fout is gegaan, bijvoorbeeld als de tabel niet goed is aangemaakt.
Nu is het dan tenslotte tijd om de hele applicatie te testen.
Sla je flash file op als je dat al niet gedaan hebt ;) en zet de flash file (de .swf file die je gecompileerd hebt) in een html pagina (of php pagina natuurlijk).
Je doet dat door deze code in je html output te zetten (met de juiste waarden voor de filenaam en de grootte!).
De object tag zorgt ervoor dat de plugin wordt aangesproken voor IE en de embed tag zorgt voor hetzelfde in mozilla.
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="400" height="250">
<param name="movie" value="phpfreakz_flash_tutorial.swf">
<param name="quality" value="high">
<embed src="phpfreakz_flash_tutorial.swf" quality="high" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="400" height="250"></embed>
</object>
Je flash file staat nu in je pagina, en roept vanuit de locatie van de flash file het php script aan dat de nieuws items uit de database haalt en deze aan flash doorgeeft.
Heb je alles goed gedaan, dan zie je nu de nieuws items staan! Je kunt deze via een content management systeem natuurlijk aanpassen aan je eigen wensen.
Tot slot
Deze tutorial is een eenvoudige inleiding in het gebruik van php in combinatie met flash.
De mogelijkheden om applicaties te bouwen op deze manier zijn fantastisch en zeker niet beperkt tot het uitwisselen van variabelen zoals hier gebeurde.
Denk aan content management systemen in flash, het dynamisch maken van _alle_ data in een flash movie, menu's genereren etc.
Als al je data in je database zit zoals het hoort te zitten, kun je van je hele html interface een flash interface maken.
Dit is natuurlijk een kwestie van persoonlijke voorkeur, maar het opent vele mogelijkheden en het internet staat hier vol mee.
Ben je geinteresseerd in meer toepassingen van de combinatie flash + php + mysql kun je kijken op onze site
www.depannekoekendekale.nl ,
www.phpfreakz.nl en op
www.flashfocus.nl.