Joscha Feth Dynamische Webseiten mit Flash und PHP
JOSCHA FETH
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
eBook Die nicht autorisierte Weitergabe dieses eBooks an Dritte ist eine Verletzung des Urheberrechts!
Die Deutsche Bibliothek – CIP-Einheitsaufnahme Ein Titeldatensatz für diese Publikation ist bei Der Deutschen Bibliothek erhältlich. Die Informationen in diesem Produkt werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht. Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt. Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht ausgeschlossen werden. Verlag, Herausgeber und Autoren können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Für Verbesserungsvorschläge und Hinweise auf Fehler sind Verlag und Herausgeber dankbar. Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien. Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zulässig. Fast alle Hardware- und Softwarebezeichnungen, die in diesem Buch erwähnt werden, sind gleichzeitig eingetragene Warenzeichen oder sollten als solche betrachtet werden.
Umwelthinweis: Dieses Buch wurde auf chlorfrei gebleichtem Papier gedruckt. Die Einschrumpffolie – zum Schutz vor Verschmutzung – ist aus umweltverträglichem und recyclingfähigem PE-Material.
10 9 8 7 6 5 4 3 2 1 05 04 03 02
ISBN 3-8272-6285-2
© 2002 by Markt+Technik Verlag, ein Imprint der Pearson Education Deutschland GmbH Martin-Kollar-Straße 10-12, D-81829 München/Germany Alle Rechte vorbehalten Einbandgestaltung: Dominik Schech, Dresden (www.schech.net) Lektorat: Boris Karnikowski,
[email protected] Fachlektorat: Christian Wenz, München Korrektorat: Friederike Daenecke, Zülpich Herstellung: Monika Weiher,
[email protected] CD-Mastering: Gregor Kopietz,
[email protected] Satz: someTimes GmbH, München Druck und Verarbeitung: fgb, freiburger graphische betriebe, www.fgb.de Printed in Germany
INHALTSVERZEICHNIS 1 Einleitung ............................................................................................................................. 9 1.1
Über den Autor .......................................................................................................... 10
1.2
Über dieses Buch ........................................................................................................ 10
1.2.1 Danksagungen .............................................................................................................. 11 1.2.2 Formales ........................................................................................................................ 12
2 Grundlegendes zu PHP ...................................................................................................... 13 2.1
Über PHP .................................................................................................................... 14
2.2
Bezugsquellen für PHP ............................................................................................. 15
2.3
Installation von PHP .................................................................................................. 15
2.4
Einsatz der Skripte aus diesem Buch ...................................................................... 16
3 Dynamische Inhalte ............................................................................................................ 17 3.1
Variablen von PHP in Flash laden ........................................................................... Schema der Übergabe ................................................................................................... Funktionen für das Laden ............................................................................................. Korrekte Formatierung ................................................................................................. Arrays von PHP nach Flash übergeben ........................................................................ Variablen innerhalb des - und <EMBED>-Tags an Flash übergeben ........... Caching-Verhalten ........................................................................................................ Beispiel: IP-Übergabe an Flash ...................................................................................... Umgang mit Verzögerungen .........................................................................................
18 18 18 20 28 35 37 41 43
3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7
Variablen von Flash an PHP übergeben ................................................................. Schema der Übergabe ................................................................................................... Funktionen zur Übergabe ............................................................................................. Verschiedene Übergabearten/Methoden ...................................................................... Auswahl der zu sendenden Variablen .......................................................................... Arrays ........................................................................................................................... Verarbeitung übergebener Daten in PHP ...................................................................... Beispiel: Übergabe und Manipulation eines Strings .....................................................
50 51 51 52 54 57 65 69
3.3
Beispiel: Ein Feedback-Formular ............................................................................. 71
3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8
3.2
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
6
Inhaltsverzeichnis
4 PHP, MySQL und Flash ....................................................................................................... 75 4.1 4.2 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5
Interaktionsschema .................................................................................................... 76 Die Klasse swiffSQL .................................................................................................. 77 79 79 84 84 89
Wichtige Hinweise ........................................................................................................ Funktionsübersicht ....................................................................................................... Umgang mit der Klasse swiffSQL ................................................................................. Beispiel: Daten laden (Variablen) .................................................................................. Beispiel: Daten laden/einfügen (XML) .........................................................................
5 Umgang mit Flash und PHP ............................................................................................ 99 5.1
Scripts von anderen Servern ausführen/laden ................................................... 100
5.1.1 Proxy-Scripting ........................................................................................................... 100 5.1.2 DNS-Aliasing .............................................................................................................. 100
5.2
SSL mit Flash ............................................................................................................ 101
5.3
Beispiel: Passwortgeschützter Bereich in Flash ................................................... 102
5.4
Beispiel: Sessions mit Flash und PHP ................................................................... 107
5.5
Beispiel: Besucherzähler mit PHP und Flash ....................................................... 120
5.6
Beispiel: automatische Sprachauswahl mit Hilfe von PHP ............................... 128
6 Cookies mit Flash und PHP ............................................................................................ 133 6.1
Beispiel: Cookies setzen/löschen .......................................................................... 134
6.2
Wichtiges bei Verwendung von Cookies .............................................................. 144
6.3
Sicherheitsaspekte .................................................................................................... 145
7 XML mit Flash und PHP ................................................................................................... 147 7.1
Ein- und Ausgabe von Daten ................................................................................. 148
7.1.1 Funktionen .................................................................................................................. 148 7.1.2 Events ......................................................................................................................... 151 7.1.3 Eigenschaften .............................................................................................................. 152
7.2
Beispiel: Daten von PHP nach Flash übergeben .................................................. 154
7.3
Beispiel: Daten von Flash nach PHP übergeben .................................................. 160
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Inhaltsverzeichnis
7
8 Serverseitige Erzeugung von Flash-Inhalten ............................................................ 163 8.1
... mit Ming und PHP ............................................................................................... 164 164 165 166 168 173
8.1.1 8.1.2 8.1.3 8.1.4 8.1.5
Einbindung des Ming-Moduls .................................................................................... Wichtige Informationen zu Ming ................................................................................ Beispiel: Leeres SWF erzeugen .................................................................................... Beispiel: Konvertierung eines JPEGs in ein SWF ........................................................ Beispiel: Darstellung von Text .....................................................................................
8.2
... mit Swift-Generator und PHP ............................................................................ Voraussetzungen ......................................................................................................... Aufbau eines Flash-Films ............................................................................................ Erstellen von SWT-Dateien ......................................................................................... Dumps von SWT-Dateien erstellen ............................................................................. Der swiPHP-Wrapper ................................................................................................. Funktionsübersicht ..................................................................................................... Beispiel: Ersetzen eines Bildes durch ein anderes ....................................................... Beispiel: Ersetzen von Text und ActionScript .............................................................. Beispiel: Anwendung aller Funktionen .......................................................................
177 177 177 178 179 180 181 196 198 201
8.3
… mit der JPG2SWF-Klasse .................................................................................... 8.3.1 Funktionsübersicht ..................................................................................................... 8.3.2 Restriktionen ............................................................................................................... 8.3.3 Beispiel ........................................................................................................................
203 203 205 205
8.4
Weitere Alternativen (libswf) ................................................................................. 207
8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.2.7 8.2.8 8.2.9
9 Flash MX ............................................................................................................................ 209 9.1
Neue Funktionen zum Datenaustausch ............................................................... 210
9.1.1 Funktionsübersicht ..................................................................................................... 210 9.1.2 Events ......................................................................................................................... 220 9.1.3 Eigenschaften .............................................................................................................. 221
10 flash.inc.php ...................................................................................................................... 223 10.1.1 Funktionsübersicht ..................................................................................................... 224
A Anhang ................................................................................................................................. 233 A.1 A.1.1 A.1.2 A.1.3 A.1.4
Boni ............................................................................................................................ 234 flaLittleShop (Onlineshop) .................................................................................................... 234 swFrog (Multiplayer-Applikation) ...................................................................................... 236 flashStats – Statistik in Flash ................................................................................................. 237 fdb – flash database ................................................................................................................ 237
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
8
Inhaltsverzeichnis
A.1.5 SWF2PNG – Gemaltes speichern ......................................................................................... 238 A.1.6 FlaWRITEonline ..................................................................................................................... 238 A.2.1 A.2.2 A.2.3 A.2.4
A.2
Ressourcen ................................................................................................................ 239 PHP ........................................................................................................................................... 239 Webserver ................................................................................................................................ 239 MySQL ..................................................................................................................................... 239 Sonstiges .................................................................................................................................. 240
A.3
PHP-Entwicklungsumgebungen ........................................................................... 241
A.3.1 Maguma PHP4EE Studio light ............................................................................................. 241 A.3.2 PHP Coder ............................................................................................................................... 242 A.3.3 PHP Edit .................................................................................................................................. 242
Index ..................................................................................................................................... 245
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
KAPITEL 1
EINLEITUNG
Crescit enim cum amplitudine rerum vis ingenii. (Denn mit der Größe der Aufgaben wächst die Kraft des Geistes) PUBLIUS CORNELIUS TACITUS
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
10
Kapitel 1
1.1 Über den Autor Joscha Falco Feth ist Programmierer und entwickelt Anwendungen und dynamische Internetseiten im eigenen Unternehmen. Zu seinem Sprachrepertoire gehören hauptsächlich PHP, SQL, Flash ActionScript, C/C++, Delphi und Perl. 1998 entdeckte Joscha die faszinierenden Möglichkeiten von Macromedias vektororientiertem Flash und dessen interne Programmiersprache »ActionScript«. Im Zusammenspiel mit serverseitigen Scriptsprachen war damit im Internet möglich, was sonst nur mit aufwändig programmierten Applikationen realisiert werden konnte. 1999 entwickelte Joscha Feth eine Flash-Seite, auf der dynamische Texteffekte generiert und im Flash-(SWF-)Format erstellt werden konnten. Die Nachfrage für diese Anwendung war so groß, dass er zusammen mit Wildform Inc. in Los Angeles eine eigenständige Anwendung für Windows entwickelte. Das Programm SWfX wurde bis heute schon einige tausend Mal verkauft und ist mittlerweile auch für Macintosh verfügbar (www.wildform. com). Anfang 2000 eröffnete Joscha Feth das Flash-Internetportal www.flashtool.de. Er bietet dort von ihm entwickelte Zusatz-Tools an, welche die Online- und Offlinefunktionalität von Flash erheblich steigern. Die Seite ist ein großer Erfolg und hat circa 15.000 Besucher pro Monat. Durch die Entwicklung eines auf Flash basierten Strategiespiels wurde Joscha Hauptgewinner des Software-Wettbewerbs 2000 von e-SAP und Sunshine Live. Ein sechswöchiges Intensivtraining bei SAP LABS FRANCE in Sophia-Antipolis, Frankreich, folgte. Noch im selben Jahr gründete Joscha Feth mit Jochen Schimmelpfennig und Dominik Schech www.e-motionshop.com. Im Team wird ein Flash-PHP-Internet-Shopsystem mit anspruchsvoller Grafik, komfortablem Administrationsbereich und Contentmanagement entwickelt (FLASH:BAG). Im Sommer 2001 entwickelte Joscha Feth bei Wildform, Inc., in Los Angeles, USA eine komplexe PHP-Flash-Video-Datenbank (Wildform Video Library). Die Videosequenzen sind für die Vorschau in Flash mit dem Programm Flix kodiert worden. Seit 2000 hält Joscha Feth regelmäßig Vorträge auf der Deutschen Flash-Konferenz und veranstaltet Schulungen für Flash. Jess Märtterer, www.de-de.de
1.2 Über dieses Buch Flash ist ein vektorbasiertes Grafikformat, das aufgrund starker Kompression und mathematischer anstatt grafischer Beschreibung von Kurven, Linien etc. auch bei viel Inhalt nur sehr wenig Speicherplatz benötigt, und eignet sich ideal für das Internet mit seiner beDYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Einleitung
11
schränkten Bandbreite. Von Animationen über Comics und interaktive Spiele bis hin zu Onlineshops lässt sich mit Flash alles realisieren, was im Internet benötigt wird. PHP ist eine serverseitige Sprache, deren verborgene Stärken dem Betrachter einer Webseite meistens entgehen, die jedoch nicht weniger wichtig als der sichtbare Teil einer Webseite ist. Ob es um Datenbankzugriffe oder komplexe Dateioperationen geht, PHP ist vor allem durch seine komfortable Syntax und sein Funktionsrepertoire eine mächtige Sprache für die serverseitige Programmierung. Flash und PHP sind zwei vollkommen unterschiedliche Sprachen. Verbunden und sich gegenseitig ergänzend schaffen sie Raum für neue, ungeahnte Möglichkeiten. Ob man nun einen einfachen Besucherzähler benötigt (siehe Kapitel 5.5), ein Feedback-Formular (siehe Kapitel 3.3) , zeitgenaue Statistiken (siehe Kapitel 11.3) oder einen interaktiven Onlineshop (siehe Anhang A.1) in Flash bleibt kein Wunsch offen. So einfach dies klingt, so schwierig ist es, dies in der Praxis umzusetzen. Dieses Buch soll Ihnen einen Eindruck davon vermitteln, was mit Flash und PHP alles möglich ist. Anhand von Beispielen werden die Vorgehensweise bei häufigen Problemen erläutert und Lösungsmöglichkeiten aufgezeigt. Mit Hilfe dieses Buches sollte es Ihnen möglich sein, alle Hürden beim Umgang mit Flash und PHP zu überwinden. Ich werde so ausführlich wie möglich auf vorhandenen Code eingehen und zusätzliche Erklärungen geben. Allerdings sind beide Sprachen, sowohl PHP wie auch Flash, keine sehr kleinen Sprachen, und es ist unmöglich, im Rahmen dieses Buches auf alle Sprachkonstrukte im Einzelnen einzugehen. Deshalb sind zum gänzlichen Verständnis dieses Buches Grundkenntnisse von Flash und PHP erforderlich.
1.2.1 Danksagungen An dieser Stelle möchte ich denjenigen Personen danken, die mir beim Schreiben dieses Buches zur Seite standen: Ich danke Dominik Schech (www.schech.net) für den Entwurf des Covers, Jess Märtterer (www.de-de.de), der mir immer mit Rat und Tat zur Seite stand, Jochen Schimmelpfennig (www.onlinegeneration.com), der mir PHP zeigte, meinen Eltern Helmut Feth und Claudia Häfele-Feth für die mir gegebene Unterstützung, meiner Freundin Valerie Grass für ihre Geduld und Ausdauer und (in alphabetischer Reihenfolge) Sébastien Hordeaux, Christian Lamine, Johannes P., pi, Tobias Ratschiller, Marco Stix, Bastian Waidelich und Christian Wenz.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
12
Kapitel 1
1.2.2 Formales · Kommentare:
Im Folgenden sind oftmals Teile von Code aus Flash und aus PHP zu sehen. Für diese gilt im Allgemeinen: //~ einzeiliger Autorenkommentar /*~ mehrzeiliger Autorenkommentar */ • ActionScript-Code in Flash wird so eingeleitet: //~ ActionScript • PHP-Code wird so eingeleitet: • Funktionsdefinitionen: typ function name(typ parameter1 [, typ parameter2]) Der Parameter in eckigen Klammern ist ein optionaler Parameter mit einem voreingestellten Wert, der übergeben wird, wenn dieser Parameter (oben ist es Parameter 2) nicht angegeben wird. Sowohl in Flash als auch in PHP gibt es keine Typunterscheidung von Variablen, wie man sie z.B. aus C/C++ kennt, jedoch zeigt der Typ eines Parameters zumindest an, welches Format der übergebene Parameter haben muss. Teilweise sind bei den Funktionsdefinitionen die Original-Signaturen aus dem PHPManual übernommen worden. Ich danke an dieser Stelle noch einmal ausdrücklich der PHP Documentation Group, die freundlicherweise die Erlaubnis erteilt hat. • Farben: Alle Konstanten, vordefinierten Variablen, Befehle, Funktionen und reservierten Wörter sind eingefärbt. Dieses Symbol verweist auf Daten auf der Buch-CD.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
KAPITEL 2
GRUNDLEGENDES ZU PHP
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
14
Kapitel 2
2.1 Über PHP Die Scriptsprache PHP wurde 1994 von Rasmus Lerdorf (www.lerdorf.com) entwickelt. Er nannte seine Sprache PHP (»Personal Home Page/Form Interpreter«), da er sie für seine eigene Homepage verwendete, um HTML-Formulare auszuwerten. Mittlerweile verbirgt sich hinter der Abkürzung PHP der lange Name »PHP Hypertext Preprocessor«. PHP ist eine serverseitige, plattformunabhängige Scriptsprache und für alle gängigen Plattformen frei erhältlich. PHP bringt schon von Haus aus eine sehr gute Datenbankanbindung an die meisten gängigen Datenbanken mit, was den Umgang mit Daten aus Datenbanken extrem erleichtert. Weiterhin ist PHP sehr gut durch Module und Klassen erweiterbar, die im Internet oftmals frei erhältlich sind. Im Gegensatz zu anderen Scriptsprachen wie z.B. Perl ist vor allem die Handhabung von Variablen, die aus Formularen oder anderen externen Quellen (wie z.B. auch Flash) stammen in PHP sehr komfortabel. Es ist anders als in Perl möglich, auch ohne CGI.pm oder entsprechende Module auf die übergebenen Daten sofort zuzugreifen. Die Syntax von PHP erinnert etwas an die von C und ist relativ leicht erlernbar. PHP-Dateien können sowohl normalen HTML-Code als auch PHP-Anweisungen enthalten. Bei einem Abruf eines PHP-Scripts über den Browser wird zunächst der PHP-Code ausgeführt. Dem Browser wird anschließend die vorverarbeitete (daher der Name »Preprocessor«) Datei, d.h. nur die HTML-Anteile und die »Ergebnisse« der PHP-Anweisungen, übermittelt. Diese Übersetzung findet vollständig auf der Seite des Servers statt. Die eigentlichen PHPAnweisungen werden nicht übermittelt. Bei Flash ist dies ganz anders. Die in Flash verwendete Sprache »ActionScript«, häufig mit AS abgekürzt, wird auf der Clientseite ausgeführt, d.h. sämtliche AS-Anweisungen werden ebenso wie die anderen Steuerinformationen eines Flash-Filmes innerhalb der SWFDatei kodiert gespeichert und mit an das Flash-Plugin des Browsers übertragen. Das Flash-Plugin ist dann nicht nur für das Abspielen aller Animationen verantwortlich, sondern auch für die Interpretation und Ausführung der ActionScript-Anweisungen. Dadurch ist es in gewissem Maße möglich, dass ein Flash-Film sofort mit AS auf Benutzereingaben reagieren kann, ohne erneut Verbindung zum Server aufnehmen zu müssen (z.B. für interaktive Menüs oder Spiele). Bei PHP-basierten Anwendungen hingegen muss jedes Mal, wenn Benutzereingaben verarbeitet werden sollen, erneut eine Verbindung zum Server aufgebaut werden, d. h. eine PHP-Datei ausgeführt werden.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Grundlegendes zu PHP
15
WAMP und LAMP Im Internet finden Sie im Zusammenhang mit PHP oft die Abkürzungen WAMP und LAMP. Exkurs
• LAMP steht für die Kombination von: Linux, Apache, MySQL und PHP. • WAMP steht für: Windows, Apache, MySQL und PHP. Dabei handelt es sich um Konfigurationen. Übrigens lassen sich auch andere bekannte Webserver wie z.B. der IIS von Microsoft mit einer PHP-Erweiterung betreiben. Genauso lassen sich andere Datenbanksysteme gut in Kombination mit PHP verwenden. LAMP und WAMP sind recht häufig verwendete Server-Konfigurationen. Sämtliche in diesem Buch behandelten Beispiele laufen ohne Probleme in beiden Umgebungen.
2.2 Bezugsquellen für PHP Verschiedene PHP-Distributionen finden Sie auf der CD-ROM im Verzeichnis Software und Module\PHP\. Die aktuellen PHP-Distributionen sind unter www.php.net für verschiedene Plattformen frei erhältlich. Eine Distribution speziell für Windows inklusive einiger vorkompilierter Module, die in der Distribution von www.php.net nicht enthalten sind (z.B. Ming), ist unter www. php4win.com verfügbar.
2.3 Installation von PHP Eine Installationsanleitung für WAMP gibt es unter: www.pc-town.de/praxis_wissen/workshops/php_mysql/wamp.php oder hier (auch für andere Betriebssysteme als Windows, z.B. LAMP): www.dynamic-webpages.de/07.installation.php Ich kann an dieser Stelle leider keine Installationsanleitung für PHP geben – zum einen aus Platzgründen, zum anderen, weil ich voraussetze, dass Sie sich als Leser dieses Buches bereits ein wenig mit PHP auskennen. Sollten Sie aber dennoch Unterstützung bei der Installation benötigen, schauen Sie im Verzeichnis Software und Module\PHP\Installation DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
16
Kapitel 2
der beiliegenden Buch-CD nach. Hier hat der herausgebende Verlag Markt+Technik die ersten vier Kapitel des Titels »Jetzt lerne ich MySQL & PHP« (ISBN 3-8272-6202-X) im PDFFormat zur Verfügung gestellt. Diese Kapitel sollten Sie sicher und einfach durch den Installationsprozess geleiten.
2.4 Einsatz der Skripte aus diesem Buch Sie können die Scripts entweder sofort online auf einem Server testen, der PHP unterstützt, oder lokal auf dem eigenen Rechner, der dann den Server darstellt. Um den eigenen Rechner zum Server zu machen, müssen Sie einen so genannten Webserver installieren. Mit diesem Webserver als Basis kann dann PHP installiert werden. Ich persönlich empfehle hier Apache (www.apache.org). ·
HINWEIS
Wenn Sie Ihre Scripts online testen bzw. einsetzen, müssen Sie beachten, dass es auf Servern, bei denen der SAFE MODE von PHP aktiviert ist, einige Einschränkungen gibt. Ob auf Ihrem Server der SAFE MODE aktiviert ist, kann Ihnen Ihr ISP bzw. dessen Administrator mitteilen.
Damit Sie als Leser dieses Buches meine und Ihre Programmcodes von derlei Einschränkungen unbeeinträchtigt austesten können, stellt Ihnen der Kölner Internet-Provider Host Europe (www.host-europe.de) in Kooperation mit dem herausgebenden Verlag Markt+ Technik von Mai 2002 an für die Dauer eines Jahres einen kostenlosen Webspace-Account zur Verfügung. Um dieses Angebot nutzen zu können, müssen Sie sich als Leser dieses Buches registrieren lassen. Füllen Sie hierzu das Formular unter buch.flashtool.de aus – ich richte Ihnen darauf hin Ihren Account ein und maile Ihnen Benutzerkennung, Passwort sowie die Richtlinien zur Nutzung des Angebots zu. Mein herzliches Dankeschön an Host Europe für die Bereitstellung des Dedicated Servers!
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
KAPITEL 3
DYNAMISCHE INHALTE
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
18
Kapitel 3
In diesem Kapitel zeige ich Ihnen die grundlegenden Möglichkeiten zum Austausch von Daten zwischen Flash und PHP. Zu jedem Beispiel finden Sie jeweils auch eine kleine Funktionsreferenz.
3.1 Variablen von PHP in Flash laden In diesem Kapitel wird gezeigt, wie sich Daten aus PHP in Flash-Filme übertragen (einlesen) und dort auswerten bzw. darstellen lassen.
3.1.1 Schema der Übergabe
Abbildung 3.1: Schema der Übergabe von Daten aus PHP an Flash. Mit den Befehlen loadVariables() oder loadVariablesNum()wird aus dem Flash-Film das Script aufgerufen und werden die vom Script ausgegebenen Daten empfangen. Auf die Flash-kompatible Formatierung von Daten wird in Kapitel 3.1.3 eingegangen.
3.1.2 Funktionen für das Laden Um Daten von PHP nach Flash zu laden, werden in Flash einige Funktionen benötigt. Diese werden in diesem Abschnitt vorgestellt. Außerdem werden einige häufige Fehler beim Umgang mit diesen Funktionen angesprochen. ·
HINWEIS
Die nachfolgend beschriebene Funktion loadVariables() und loadVariablesNum() sind asynchrone Prozesse. Das bedeutet, dass bei ihrem Aufruf die Timeline keinesfalls anhält und auf den Abschluss des Befehls wartet, sondern dass die Timeline sich ohne anzuhalten weiterbewegt. Es kann also nicht davon ausgegangen werden, dass im Schlüsselbild, das auf den Befehl folgt, die Daten bereits verfügbar sind. Die Verfügbarkeit von Daten muss zuerst überprüft werden. Mehr dazu in Kapitel 3.1.8.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Dynamische Inhalte
19
loadVariablesNum() Beschreibung: Mit loadVariablesNum() können Daten aus externen Datenquellen auf Ebenen im SWF geladen werden. Definition:
void loadVariablesNum (string url, string position [, int methode]);
Parameter:
string url Ein absoluter oder relativer URL zu dem Script, das aufgerufen werden soll. URL – URL steht für Uniform Resource Locator und ist die Abkürzung für eine Internetadresse. ·
HINWEIS
Ob der URL nun ein PHP-Script, ein ASP-Script, ein Perl-Script oder eine einfache Textdatei ist, macht keinen Unterschied, solange die Daten korrekt formatiert sind. Wie eine korrekte Formatierung aussieht, wird in Kapitel 3.1.3 erläutert. Seit Version 4.0.1.2 von Flash muss der angegebene URL auf demselben Host sein wie das SWF, von dem aus der Aufruf erfolgt (siehe Kapitel 5.1).
SWF – SWF ist die Abkürzung für ShockWave Flash. SWF wird aber meistens dazu verwendet, einen mit Flash erstellten Film zu benennen, da die Dateiendung .swf ist. string position Eine Ebene in unserem SWF. int methode Dieses Argument ist optional. Es gibt an, wie die in Flash vorhandenen Variablen an den URL gesendet werden. Mögliche Werte sind POST oder GET. Auf die verschiedenen Methoden wird in Kapitel 3.2.3 näher eingegangen. Anwendung:
Um die Ausgabe eines Scripts (hier: meinScript.php) auf Ebene 0 unseres Films zu laden, muss der Aufruf folgendermaßen aussehen: //~ ActionScript loadVariablesNum("meinScript.php", 0); ·
HINWEIS
Andere Betriebssysteme als Windows (z.B. Linux) unterscheiden zwischen Groß- und Kleinschreibung. Deshalb ist es wichtig, dass die Schreibweise des Scriptnamens bei einem Aufruf aus Flash mit dem wirklichen Namen der Datei übereinstimmt. DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
20
Kapitel 3
loadVariables() Beschreibung: Mit loadVariables() können Daten aus externen Quellen auf Ebenen oder in Filmsequenzen geladen werden. Definition:
void loadVariables (string url , string position [, int methode]);
Parameter:
string url Ein absoluter oder relativer URL zu dem Script, das aufgerufen werden soll. string position Die Position ist hier ein Ziel innerhalb des SWF, beispielsweise eine Filmsequenz oder eine Ebene. int methode Dieses Argument ist optional. Es gibt an, wie die in Flash vorhandenen Variablen an den URL gesendet werden. Mögliche Werte sind POST oder GET. Auf die verschiedenen Methoden wird in Kapitel 3.2.3 näher eingegangen.
Anwendung:
Um die Ausgabe eines Scripts (hier: meinScript.php) in eine Filmsequenz auf unserer Hauptzeitleiste zu laden, muss der Aufruf des SWF folgendermaßen aussehen: //~ ActionScript loadVariables("meinScript.php", "_root.movieClip"); oder //~ ActionScript _root.movieClip.loadVariables("meinScript.php");
3.1.3 Korrekte Formatierung Damit Flash die Ausgabe eines Scripts richtig interpretieren kann, müssen die Daten eine bestimmte Form haben (application/x-www-form-urlencoded): variablenName=variablenWert Bei mehreren Variablen sieht dies so aus: variable1=wert1&variable2=wert2,...,&variableN=wertN Als Trennzeichen zwischen den einzelnen Variablen dient das &-Zeichen.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Dynamische Inhalte
·
21
Der Inhalt des PHP-Scripts (hier: meinScript.php) ist folgender: echo() gibt einen String auf der Standardausgabe (Bildschirm bzw. Browser) aus. In Flash lädt folgender Code das PHP-Script mit oben stehendem Inhalt: //~ ActionScript loadVariablesNum("meinScript.php", 0); Wenn die Daten geladen wurden, dann sind sie an der Stelle verfügbar, die bei den Befehlen als Ziel angegeben wurde. Das heißt, die Variablen variable1 und variable2 sind jetzt auf der Hauptzeitleiste verfügbar und können beispielsweise als _root.variable1 _root.variable2
BEISPIEL
angesprochen oder in einem Textfeld auf der Hauptzeitleiste mit dem Namen variable1 oder variable2 angezeigt werden.
Einleitung und Schluss der Daten Flash lädt Daten normalerweise korrekt, wenn man bei der ersten Variable das &-Zeichen weglässt. Beispielsweise so: variable1=wert&variable2=wert Sollte das Script jedoch davor etwas anderes ausgeben (beispielsweise eine Warnung o. Ä.), dann wird der erste Variablenname durch die Ausgabe der Warnung verfälscht. ·
Wenn vor der Ausgabe der eigentlichen Daten ungewollt eine Warnung ausgegeben wird, z.B. so: UNGEWOLLTE_WARNUNGvariable1=wert&variable2=wert Dann wird in diesem Fall die erste Variable nicht mehr Variable variable1 = "wert" lauten, sondern: Variable UNGEWOLLTE_WARNUNGvariable1 = "wert" Dieses Problem kann man umgehen, indem man vor den Namen der ersten Variable auch ein &-Zeichen setzt; folglich so:
BEISPIEL
UNGEWOLLTE_WARNUNG&variable1=wert&variable2=wert
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
22
Kapitel 3
Es werden nun z.B. bei der Ausgabe eines Fehlers zwar trotzdem noch mehr (unnötige) Daten geladen, jedoch wird an den übergebenen Variablen nichts verfälscht. Leiten Sie Ihre Daten also immer mit einem &-Zeichen ein. Dasselbe gilt auch für das Ende der Daten. Wenn eine Warnung o. Ä. am Ende ausgegeben wird, dann wird diese an den Wert der letzten Variable angehängt. ·
Die Ausgabe eines Scripts enthält nach der Ausgabe der Daten eine ungewollte Warnung: &variable1=wert&variable2=wertUNGEWOLLTE_WARNUNG Wenn dies in Flash geladen wird, dann ist der Wert der Variable »variable2« nicht mehr Variable variable2 = "wert" sondern: Variable variable2 = "wertUNGEWOLLTE_WARNUNG" Es ist also sinnvoll, auch an das Ende der Daten ein &-Zeichen anzuhängen. Etwa so:
BEISPIEL
&variable1=wert&variable2=wert&UNGEWOLLTE_WARNUNG
Die Warnung wird zwar trotzdem noch geladen, allerdings wird sie nicht an den Wert der letzten Variable angehängt. Beenden Sie Ihre Datenausgabe also ebenfalls immer mit einem &-Zeichen. ·
HINWEIS
Bei Verwendung eines &-Zeichens am Ende wird in Flash eine überflüssige Variable mit leerem Namen geladen (wenn danach nichts mehr kommt), da das &-Zeichen ja normalerweise dafür verwendet wird, eine neue Variable einzuleiten. Wenn Sie diese Variable stört, so können Sie sie beruhigt löschen.
Auf diese Variable können Sie mit \r\n oder \n zugreifen (je nachdem wie Sie diese aus PHP ausgeben). Entsprechend lautet der Befehl, um diese Variable zu entfernen: delete \r\n; oder: delete \n; Dies erzeugt in der Flash-Entwicklungsumgebung eine Fehlermeldung; die Variable wird aber korrekt entfernt.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Dynamische Inhalte
23
Strukturierte Datenausgabe Dasselbe gilt auch, wenn man seine Ausgabe strukturieren möchte, um einen besseren Überblick zu bekommen. Falls Sie die Ausgabe etwa so schreiben wollen &preis1=25 &preis2=40 &preis3=80 dann werden Sie nach jedem Wert noch die Zeichen \r\n finden, so genannte Whitespaces (unter Whitespaces werden alle nicht sichtbaren Zeichen wie z.B. Space, Tab, Newline und Carriage Return verstanden). Um dies zu umgehen, müssen Sie hinter jedem Wert ein &Zeichen anbringen: &preis1=25& &preis2=40& &preis3=80& Solange die Werte nicht angezeigt werden, bemerkt man Whitespaces nicht. Es scheint einerlei zu sein, ob sie da sind oder nicht – will man jedoch mit den Werten rechnen, wie z.B. mit den Preisen im oberen Beispiel, so muss man sichergehen, dass keine Whitespaces vorhanden sind, sonst schlägt die Rechenoperation fehl.
Rechnen mit eingelesenen Werten Noch eine weitere Besonderheit muss man beachten, wenn man mit eingelesenen Werten rechnen möchte: Im englischsprachigen Raum ist bei der Angabe von Preisen der Punkt das Äquivalent des Kommas im deutschsprachigen Raum. Englische Angabe: 9.99 € Deutsche Angabe: 9,99 € Wenn Sie nun Preise (z.B. bei einem Onlineshop) im deutschen Format übergeben, dann können Sie mit diesen nicht rechnen, da sie nicht als Zahl, sondern als String erkannt werden. Wollen Sie mit eingelesenen Zahlen rechnen, muss die Ausgabe folgendermaßen aussehen: &preis1=9.99&preis2=18.07& Nicht: &preis1=9,99&preis2=18,07&
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
24
Kapitel 3
Leerzeichen Leerzeichen zwischen dem Variablennamen und dem Gleichheitszeichen werden an den Variablennamen angehängt. ·
Die Ausgabe eines PHP-Scripts ist folgende: &variable1
=wert
Sie sehen, dass zwischen variable1 und dem Gleichheitszeichen Leerzeichen sind. Diese werden von Flash nicht etwa ignoriert, sondern an den Variablennamen (in diesem Fall variable1) angehängt. Der Name ist also nicht mehr: Variable variable1 = "wert" sondern: Variable variable1 BEISPIEL
= "wert"
Sie sollten demnach keinen ungewollten Abstand setzen.
Übergabe von booleschen Werten Bei der Übergabe von booleschen Werten, also true (wahr) oder false (falsch) müssen Sie beachten, dass bei folgender Schreibweise: &variable1=true&variable2=false& die Werte von Flash als String angesehen werden. Um zu überprüfen, ob diese Variablen die richtigen Werte haben, müssten Sie folgenden Code benutzen: //~ ActionScript if (variable1 == "true" && variable2 == "false") { //~ Bedingung erfüllt } //~ end if Hier wird überprüft, ob der Wert der variable1 gleich dem String »true« ist und ob der Wert der variable2 gleich dem String »false« ist. Sie sehen, dass die Werte in diesem Falle Strings sind, keine booleschen Werte. Die richtige Formatierung, um einen Vergleich mit booleschen Werten zuzulassen, ist: &variable1=1&variable2=0&
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Dynamische Inhalte
25
Dieses Format erzielt das gewünschte Ergebnis: //~ ActionScript //~ prüfen, ob variable1 wahr und variable2 falsch ist if (variable1 && !variable2) { //~ Bedingung erfüllt } //~ end if Diese Abfrage prüft, ob variable1 true (wahr) und variable2 false (falsch) ist.
URL-Kodierung von Werten Dieses Beispiel befindet sich im Ordner Applikationen\urlEncode\ auf der CD-ROM. Da bei der Übergabe von Daten nur ein bestimmter Zeichensatz erlaubt ist, müssen alle Zeichen, die nicht alphanumerisch sind (bis auf -_. ), in % gefolgt von dem ASCII-Code des Zeichens umgewandelt werden. Dies ist vor allem bei den &-Zeichen wichtig, die als Trennzeichen für Variablen fungieren. So führt &menue=Fish & Chips& nicht zu einer Variable menue mit dem Wert Fish & Chips innerhalb von Flash, sondern zu zwei Variablen: zu einer mit dem Namen menue und dem Wert Fish und zu einer mit dem Namen Chips und einem leeren Wert: Variable menue = "Fish " Variable Chips = "" Sie sehen, dass das zweite &-Zeichen ungewollt eine neue Variable einleitet, obwohl es eigentlich ein Teil vom Wert der Variable menue sein sollte. Um das gewünschte Ergebnis zu erzielen, ist folgende Formatierung korrekt: &menue=Fish+%26+Chips& Dies ergibt nach dem Laden in Flash folgende Variable: Variable menue = "Fish & Chips"
Die Funktion urlencode() Damit man nicht alles von Hand kodieren muss, gibt es in PHP die Funktion urlencode(), welche die Daten in das korrekte Format bringt. Tutorial
string urlencode (string str) string str Das Argument ist der String, der kodiert werden soll. Zurückgegeben wird ein String im kodierten (richtigen) Format.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
26
Kapitel 3
Beispiel: Der Code gibt auf dem Bildschirm &menue=Fish+%26+Chips& aus, was von Flash korrekt interpretiert wird. Beim Kodieren muss man unbedingt darauf achten, die als Trennzeichen fungierenden &-Zeichen nicht mit zu kodieren, da man sonst einen einzigen riesigen String bekommt, der von Flash nicht richtig verstanden wird. Beispiel: Der Code ergibt die Ausgabe: %26menue1%3DFish+%26+Chips%26menue2%3DBeef%26 Sie sehen, dass jetzt zwar die Zeichen URL-kodiert wurden, die man kodieren wollte, aber auch alle &-Zeichen, die zum Einleiten der Variablen benötigt werden, und alle Gleichheitszeichen ebenfalls. Diese Ausgabe kann von Flash nicht mehr korrekt interpretiert werden. Kodieren Sie also, wie oben beschrieben, immer nur den Wert einer Variablen, nie die gesamten Daten.
Sonderzeichen
ASCII-Wert
Sonderzeichen
& % # Ü ü Ä
%26 %25 %23 %DC %FC %C4
ä Ö ö ß Zeilenumbruch (\n) Leerzeichen
Tabelle 3.1: Wichtige ASCII-Werte von Sonderzeichen
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
ASCII-Wert %E4 %D6 %F6 %DF %0D %20
Dynamische Inhalte
27
Die in Tabelle 3.1 stehenden ASCII-Werte von Sonderzeichen erhalten Sie bei der Benutzung von urlencode() automatisch. Jedoch halte ich es für sinnvoll, häufig verwendete Zeichen hier anzuführen, damit diese auch ohne PHP (z.B. nur mit Textdateien) eingesetzt werden können. ·
HINWEIS
Bei der Verwendung von Sonderzeichen wie ü, Ü, ä, Ä, ö, Ö und ß sollten die Zeichen selbst bei einer häufigen Schriftart im Textfeld (in Flash) mit eingebunden werden, da sie in den Schriftsätzen anderer Länder oftmals nicht enthalten sind.
Übergabe von relativen Pfadangaben Dieses Beispiel befindet sich im Ordner: Beispiele\redoPath\ auf der CD-ROM. Wenn man in ein SWF dynamisch andere SWF laden möchte (z.B. weil man ein Bild jede Woche ändert etc.), dann kann es sein, dass bei der Übergabe der Pfade für die externen SWF ein Pfad dabei ist, der relativ auf ein Verzeichnis über dem Hauptfilm zeigt. Da die Ein- und Ausgabe von Daten in Flash auch immer etwas mit dem Browser zu tun hat, gibt es bei der Übergabe von relativen Pfaden weitere, browserbedingte Probleme. Dies liegt daran, dass ja nicht direkt mit dem Flash-Plugin gesurft wird, sondern über Umwege. Die Daten, die vom Server kommen, werden vom Browser angenommen und dann erst an das Flash-Plugin weitergeleitet. Das heißt, bei der Kommunikation zwischen Browser und Plugin können Probleme auftreten. Dies ist auch hier der Fall. Da diese Probleme sehr selten und sehr sporadisch auftreten, lassen sich an dieser Stelle keine genauen Versionsnummern der Browser nennen. Sicher ist, dass im Netscape 4.x Probleme auftreten können. Erfahrungswerte mit dem Netscape 6.x habe ich noch keine. Im Internet Explorer habe ich noch keine bemerkt, aber auch hier sind Fehler nicht grundsätzlich auszuschließen. Im Netscape 4.x bringt folgende Ausgabe bzw. deren Laden in Flash oftmals nicht das gewünschte Ergebnis: &pfad=../bild.swf& Netscape versucht, die Pfadangabe schon vor dem Eintreffen in Flash zu interpretieren. Das bedeutet, dass bei der Übergabe von Pfaden zwischen dem Browser (Netscape) und dem Plugin ein Fehler auftritt, da der Pfad nicht mehr korrekt im SWF ankommt. Ich nehme an, dass Netscape an der entsprechenden Stelle nach dem Ziel sucht, anstatt die Pfadangabe einfach weiterzugeben. Abhilfe schafft hier eine Maskierung. Das heißt, man muss die auf die Unterverzeichnisse zielenden ../ in eine Zeichenfolge umwandeln, die Netscape nicht als Pfadangabe interpretiert. Dies wäre beispielsweise so etwas: &pfad=**/bild.swf&
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
28
Kapitel 3
Diese Umwandlung muss man dann innerhalb von Flash wieder rückgängig machen. Die folgende Funktion erledigt das für uns: //~ ActionScript function redoPath(myPath, splitChar) { //~ Alle splitChar in . umwandeln myPath = myPath.split(splitChar).join("."); return myPath; //~ Ergebnis zurückgeben } //~ end function redoPath pfad = redoPath(pfad, "*"); //~ Anwendung der Funktion Diese Funktion wandelt einen maskierten Pfad wieder in die richtige Form um. Aus **/bild.swf wird demnach ../bild.swf. Sie können selbstverständlich auch jedes andere Zeichen verwenden, um den Pfad zu maskieren. Allerdings sollte es ein Zeichen sein, das in der URL selbst nicht vorkommt und auch bei Pfadangaben im Pfad selbst nicht auftreten kann. Bestens geeignet wäre etwa *. · HINWEIS
Eine Maskierungsfunktion für Pfade ist Teil von flash.inc.php (siehe Kapitel 10).
3.1.4 Arrays von PHP nach Flash übergeben Arrays lassen mehr Möglichkeiten zur Strukturierung von Daten. Wenn Sie z.B. eine Liste übergeben möchten, dann können Sie dies selbstverständlich tun, indem Sie die Variablennamen mit Zahlen versehen, etwa so: &listenwert1=wert& &listenwert2=wert& &listenwert3=wert& Allerdings wird dies bei größeren Datenmengen erstens relativ unübersichtlich, und zweitens ist der Zugriff auf diese Art von Variablen nicht sonderlich komfortabel. Bei Daten, die alle zu einer Gruppe gehören, aber dennoch unterschieden werden müssen, setzt man normalerweise Arrays ein. Array – (deutsch: »Reihung«) Ein Array ist eine Liste von Elementen (Daten), die in einer, zwei oder mehreren Dimensionen gespeichert werden können. Im Folgenden werden zwei verschiedene Arten beschrieben, wie man ein Array an Flash übergibt. Eine Übergabe eines Arrays ist ursprünglich nicht vorgesehen, daher bilden die beiden beschriebenen Verfahren nur einen Kompromiss. Jedes der Verfahren hat sowohl Nachteile als auch Vorteile. Bei beiden Möglichkeiten lassen sich keine mehrdimensionalen Arrays übergeben.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Dynamische Inhalte
29
Erste Möglichkeit: mit Hilfe von join() und split Das Prinzip: Das Array in PHP wird zu einem String umgeformt, und dabei werden die einzelnen Arrayelemente z.B. durch Kommata getrennt. Dieser String wird dann an Flash übergeben. Dort kann anhand der Trennzeichen wieder ein Array gebildet werden. Der Vorteil dieser Methode ist, dass extrem wenige Daten übergeben werden und keine Funktion benötigt wird, welche die Daten (strukturierte Variablen) in eine andere (für Flash verständliche) Form bringt. Nachteile hingegen ergeben sich daraus, dass man keine assoziativen Arrays übergeben kann und dass man hundertprozentig sicher sein muss, dass das benutzte Trennzeichen nicht innerhalb der übergebenen Werte auftaucht, da sonst das Array falsch aufgebaut wird. ·
Ein PHP-Script hat folgenden Inhalt: Als Trennzeichen zwischen den Elementen werden Kommata verwendet. Der String, der nun ausgegeben wird, sieht so aus:
BEISPIEL
&arrayString=Keine Kommata erlaubt, Hier, sind, aber, trotzdem, welche&
Sie sehen, dass nicht nur zwischen den Elementen Kommata sind, sondern auch im Wert des zweiten Elements. Wenden Sie auf diesen String in Flash die split()-Funktion an, erhalten Sie nicht ein Array mit zwei Elementen, sondern ein Array mit sechs Elementen. Flash kann ja nicht erkennen, welche Kommata Trennzeichen sind und welche zum Wert gehören. Sie können natürlich in diesem Fall ein anderes Trennzeichen verwenden, z.B. einen *. Wenn dieser jedoch auch in einem Wert des Arrays vorkommt, haben wir wieder das gleiche Resultat. Sollten Sie also nicht hundertprozentig sicher gehen können, dann ist diese Methode ungeeignet. Verwenden Sie in diesem Fall die zweite Methode!
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
30
Kapitel 3
Das Beispiel befindet sich im Ordner Beispiele\arrayStuff\arraySplit\ auf der CD-ROM. Wenn Sie sich sicher sind, dass Sie wissen, welche Zeichen in den Werten auftauchen und welche nicht, dann können Sie diese Methode ohne weiteres anwenden. ·
Ein PHP-Script hat folgenden Inhalt:
Als Erstes wird das Array erstellt, das an Flash übergeben werden soll. In unserem Fall eine Namensliste. Dieses Array wird mit join() in eine kommaseparierte Liste umgewandelt. Dieser String wird dann ausgegeben.
Die Funktion join() string join (string glue, array pieces) join() wandelt Arrays in Strings mit Trennzeichen um. Tutorial
string glue Das erste Argument ist der String, mit dem die verschiedenen Elemente getrennt werden. array pieces Das zweite Argument ist das Array, das in einen String umgewandelt werden soll. Zurückgegeben wird das in einen String umgeformte Array mit dem gewählten Trennzeichen zwischen den einzelnen Elementen.
In diesem Fall wurde als Trennzeichen ein Komma gewählt, da keiner der Namen ein Komma enthält und so in Flash korrekt gesplittet werden kann. Wenn Sie wissen, welche Zeichen das Array enthält, und so ein Trennzeichen wählen können, das nicht in dem Array vorkommt, dann ist diese Methode gut geeignet.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Dynamische Inhalte
31
Wenn Sie jedoch nicht wissen, was für Zeichen im Array vorkommen, dann sind Fehler vorprogrammiert – in diesem Fall wird dringend zur zweiten Methode geraten, oder Sie müssen das gewählte Trennzeichen in den Daten URL-kodieren (siehe Kapitel 3.1.3). Dies geht allerdings nur, wenn Sie ein Trennzeichen wählen, das nicht alphanumerisch ist (wie z.B. ein Komma). Der ausgegebene String sieht nun so aus: &arrayString=Joscha,Hans,Peter,Hannes,Markus& Das SWF bzw. der Code, um das Array wieder aufzubauen, sieht so aus:
Abbildung 3.2: Das zu einer kommaseparierten Liste zusammengesetzte Array wird geladen und dann per split() wieder in ein Array umgeformt. Danach wird der geladene String gelöscht.
Wenn ein Element leer sein soll, so genügt es nicht, dieses Element in PHP einfach nicht zu deklarieren. Etwa so:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
32
Kapitel 3
Es »fehlen« die Elemente 5 und 6 des Arrays $nameArray, denn der String, der nun ausgegeben würde, wäre folgender: &arrayString=Joscha,Hans,Peter,Hannes,Markus,Daniel& Sie sehen, dass obwohl zwischen den Elementen 4 und 7 eine »Lücke« ist, diese im String nicht ausgedrückt wird. Dies mag teilweise geschickt sein; wenn man jedoch die Positionen der Elemente bei der Übergabe berücksichtigen möchte, müssen fehlende Elemente als »leer« deklariert werden. Etwa so: Ausgegeben würde dann: &arrayString=Joscha,Hans,Peter,Hannes,Markus,,,Daniel& Der String unterscheidet sich nur geringfügig von dem anderen, leere Positionen sind bei ihm jedoch berücksichtigt. Wenn Sie nicht genau wissen, welche Elemente leer sind, dann können Sie folgende Funktion verwenden, um fehlende Elemente in Arrays zu deklarieren:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Dynamische Inhalte
33
Diese Funktion fügt »fehlende« Elemente in ein Array ein und sortiert es anhand der Schlüssel. · HINWEIS
Diese Funktion inklusive URL-Kodierung und direkter Flash-spezifischer Ausgabe ist Teil von flash.inc.php (siehe Kapitel 10).
Zweite Möglichkeit: Parsen der Arrays Dieses Beispiel befindet sich im Ordner Beispiele\arrayStuff\arrayParse\ auf der CD-ROM. Parser – (engl.: to parse = analysieren) Ein Parser analysiert Daten mit einer bestimmten Struktur (hier Variablen) und wandelt diese in eine andere Form (hier Arrays) um. Das Prinzip: Das Array in PHP wird in die Array-Schreibweise umgeformt (arrayName [key]=value) und dann an Flash übergeben. In Flash wird mit einem Parser das Array aus den einzelnen Strings aufgebaut. Der Vorteil dieser Methode ist, dass sich auch assoziative Arrays übergeben lassen und dass nicht darauf geachtet werden muss, welche Zeichen in den Daten vorhanden sind, da kein Trennzeichen benötigt wird. Diese Art der Übergabe ist jedoch etwas langsamer als die erste, da zum einen mehr Daten (Name des Arrays, Schlüssel und eckige Klammern) übergeben werden als bei der ersten Methode und zum anderen das Parsen an sich etwas mehr Zeit benötigt. ·
Ein PHP-Script hat folgenden Inhalt:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
34
Kapitel 3
Zuerst wird ein Array erstellt, das nicht nur numerische, sondern auch nicht-numerische Schlüssel enthält: also ein assoziatives Array. Dieses Array wird dann durchlaufen, und die einzelnen Elemente werden in der Form Arrayname[key]=value ausgegeben. · HINWEIS
Diese Funktion inklusive URL-Kodierung und direkter Flash-spezifischer Ausgabe ist Teil von flash.inc.php (siehe Kapitel 10).
Der ausgegebene String ist wäre in diesem Fall dann folgender: &nameArray[0]=Joscha& &nameArray[1]=Hans& &nameArray[2]=Peter& &nameArray[3]=Hannes& &nameArray[4]=Markus& &nameArray[7]=Daniel& &nameArray[key]=value& Flash kann mit diesen Daten direkt noch nichts anfangen, da sie als normale Variablen interpretiert werden. Die Daten sind also im Flash-Film vorhanden, jedoch lassen sie sich nur als Variablen und nicht als Array ansprechen. Wir müssen die Daten also noch in »richtige« Arrays umformen. Die dazu notwendigen Funktionen bzw. Prototypen sind relativ komplex und werden an dieser Stelle nicht näher behandelt. Sie sind auf der CD-ROM beigelegt und können selbstverständlich angepasst und verändert werden. Uns interessiert an dieser Stelle nur ihre Benutzung. Wenn man also die Daten geladen hat, dann muss man eine Funktion ausführen. Ihr Name ist buildArrays(). Wichtig ist, dass buildArrays() ein Filmsequenz-Prototyp ist, d.h. der Aufruf muss: //~ ActionScript myClip.buildArrays(); lauten. Sollte man die Daten nicht in eine Filmsequenz geladen haben, sondern auf eine Ebene, dann sieht der Aufruf so aus: //~ ActionScript _root.buildArrays(); So muss der Aufruf lauten, wenn die Daten auf Ebene 0 geladen wurden. Wenn die Daten auf Ebene 2 geladen wurden, lautet der Aufruf hingegen: //~ ActionScript _level2.buildArrays(); Die Funktion erstellt aus den »falschen« Arrays ein richtiges Array und löscht die alten Variablen.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Dynamische Inhalte
·
HINWEIS
35
Je nach Menge der übergebenen Variablen dauert das Parsen einige Zeit. Beschleunigen kann man das, indem man Arraydaten in eine leere Filmsequenz lädt und nur dort parst. Bei einem Aufruf an einer Stelle, wo schon andere Variablen deklariert wurden, werden auch diese durchlaufen, um zu sehen, ob sie eventuell Arrays sein könnten. Dies dauert unnötig Zeit. Bei der Übergabe von Arrays mit mehr als 50 (!) Elementen kann es sein, dass der Flash-Film zu viele Aktionen ausführt und das Script abbricht. Deshalb sollte immer darauf geachtet werden, nicht zu viele Arrays bzw. Elemente auf einmal zu schicken. Eine Deklaration von Variablen in Flash, die das Zeichen [ oder ] enthalten, ist nicht möglich, bei eingeladenen Textdateien jedoch sehr wohl, daher kann zwischen Variablen und Variablen, die Arrays sein sollen, zu 100% unterschieden werden. Es ist also ohne weiteres möglich, in dem PHP-Script, in dem man Arrayvariablen verschickt, auch normale Variablen zu versenden oder in Flash bereits Variablen zu definieren, ohne dass es zu einer Verwechslung kommt.
Das Ergebnis in Flash nach dem Parsen ist also: Variable nameArray = [object #1] [ key:"value", 7:"Daniel", 4:"Markus", 3:"Hannes", 2:"Peter", 1:"Hans", 0:"Joscha" ] Sie sehen, dass bei dieser Methode nicht nur »leere« Elemente berücksichtigt werden, sondern auch, dass die Übergabe von assoziativen Arrays möglich ist. Beides ist bei der ersten Methode nicht so einfach zu erreichen, dafür müssen Sie die Verzögerung in Kauf nehmen, die das Parsen verursacht. Diese Verzögerung ist jedoch bei kleineren Arrays verschwindend gering.
3.1.5 Variablen innerhalb des - und <EMBED>-Tags an Flash übergeben Dieses Beispiel befindet sich im Ordner Beispiele\externVar\ auf der CD-ROM. Tag – (deutsch: Etikett) Ein Tag ist eine Kennzeichnung und wird zur Strukturierung von Daten (z.B. in HTML) verwendet. Hier leiten die beiden Tags ein in HTML eingebundenes SWF ein. Sie sagen quasi dem Browser, dass dieser Teil des Codes durch das FlashPlugin angezeigt wird. DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
36
Kapitel 3
Es mag vorkommen, dass man einmal Variablen an SWF-Filme innerhalb einer HTMLSeite an Flash übergeben muss und aus bestimmten Gründen keinen loadVariables()oder loadVariablesNum()-Befehl verwenden kann oder möchte, um die Daten direkt zu laden. In diesem Fall gibt es die Möglichkeit, die Variablen innerhalb der HTML-Seite bzw. des PHP-Scripts direkt an das SWF zu übergeben. Jedoch ist Folgendes zu beachten: • Variablen werden ausschließlich auf Ebene 0 übergeben. • Die Übergabe schlägt bei Macintosh-Usern mit älteren Browsern eventuell fehl. Bei erneutem Laden der Seite funktioniert es meistens. Da diese Fehlfunktionen sehr sporadisch und nach keinem genauen Muster auftreten, können an dieser Stelle leider keine genauen Versionsnummern der Browser bzw. Flash-Plugins genannt werden. Ich habe mit sehr vielen aktuellen Browsern Tests durchgeführt und keine Probleme entdeckt. Es mag sein, dass diese in neueren Browserversionen behoben wurden. Bei dieser Art von Übergabe werden die Variablen etwa so angehängt: meinSWF.swf?variable1=wert&variable2=wert Jedoch werden die Variablen nicht an den URL der HTML-Seite angehängt, sondern innerhalb des HTML-Codes in die Tags für das SWF geschrieben. Das sieht dann folgendermaßen aus: <EMBED src="meinSWF.swf?variable=wert"> Die anderen Parameter der Tags können bzw. sollten selbstverständlich hinzugefügt werden, hier sind sie jedoch aus Gründen der Übersichtlichkeit weggelassen worden. Wichtig ist, dass die Variablen an das SWF sowohl im - als auch im <EMBED>-Tag angehängt werden müssen, sonst schlägt die Übergabe evtl. fehl. Sie könnten nun in einem PHP-Script verschiedene Variablen ermitteln oder Benutzereingaben verarbeiten und dann den Code für das SWF inklusive der angehängten Variablen ausgeben. Vergessen Sie auch bei dieser Übergabe nicht, die Werte zu URL-kodieren (siehe Kapitel 3.1.3). ·
Ein PHP-Script mit folgendem Code:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Dynamische Inhalte
·
37
Wobei bei beiden row_name gleich dem bzw. den Spaltennamen in der Tabelle ist. ·
Wenn die Tabelle eine solche Struktur hat: fruits id
fruit
1
Erdbeere
2
Banane
3
Zitrone
wird bei folgendem Query SELECT * FROM fruits folgende Ausgabe geliefert: • Bei Variablen: &id_0=1& &fruit_0=Erdbeere& &id_1=2& &fruit_1=Banane& &id_2=3& &fruit_2=Zitrone& &result_total=3& &result=1& • Bei XML:
BEISPIEL
Diese zwei Ausgabeformen werden von Flash verstanden. Somit kann die Ausgabe ohne Weiterverarbeitung bzw. Umformung direkt von Flash gelesen werden. Wie in der Einleitung bereits beschrieben wurde, wäre es das Einfachste, einfach einen SQL-String aus Flash an ein PHP-Script weiterzugeben, das diesen einfach an die MySQLDatenbank weitergibt, das Ergebnis empfängt und an Flash ausgibt.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
PHP, MySQL und Flash
79
Im Normalfall ist dies eine große Sicherheitslücke, da Unbefugte auch Befehle an die MySQL-Datenbank senden können, um diese zu verändern, zu löschen etc. Nun stellt sich die Frage, was hier anders ist als an einem solchen PHP-Script. In der Klasse swiffSQL ist es möglich, den Zugriff zu beschränken, d.h. man kann einzelne MySQL-Befehle sperren oder freigeben. So ist es beispielsweise möglich, den SELECT-Befehl freizugeben, alle anderen Befehle aber nicht. Dies schafft hinreichende Sicherheit in Hinblick auf ungewollte Manipulationen.
4.2.1 Wichtige Hinweise • Die Klasse swiffSQL befindet sich noch in der Beta-Phase. Auf www.flashtool.de/ swiffSQL/ finden Sie jeweils die neueste Version. Momentan sind noch nicht alle MySQL-Funktionen implementiert und es kann nur ein Objekt der Klasse instanziiert werden, da sich die Ausgaben sonst vermischen und überschreiben. Bitte senden Sie Bugs und/oder Anregungen an:
[email protected]. • In MySQL Version 4.x werden so genannte Sub-Selects möglich sein. Sollte hierbei ein Sub-Select mit einer anderen Aktion als SELECT möglich sein, so greift die Zugriffsbeschränkung von swiffSQL eventuell nicht mehr korrekt. Momentan befindet sich MySQL 4 noch in der Alpha-Phase.
4.2.2 Funktionsübersicht swiffSQL() Beschreibung: Erstellt ein neues Objekt der Klasse swiffSQL, die eine Datenbankverbindung hält, zu der dann Anfragen gesendet werden können. Definition:
new swiffSQL (string outputType, string database [, string host [, string user [, string password [, int port]]]])
Parameter:
string outputType Mit diesem Argument legt man die Art der Ausgabe fest, die nach einem Query zurückgegeben wird. Mögliche Werte sind VAR für die Ausgabe des Ergebnisses als Variablen oder XML für die Ausgabe in XML. Denken Sie daran, die flash.inc.php-Klasse einzubinden, falls Sie als Ausgabeart VAR wählen. string database Mit diesem Argument wird die Datenbank angegeben, zu der eine Verbindung erstellt wird.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
80
Kapitel 4
string host Der Server, auf dem die Datenbank sich befindet. Optionales Argument. Defaultwert ist localhost. string user Dieses Argument ist der Benutzer der Datenbank. Optionales Argument. Defaultwert ist root. string password Das Passwort zum angegebenen Benutzer. Optionales Argument. Defaultwert ist kein Passwort. int port Der Port, auf dem die Datenbank »lauscht«. Optionales Argument. Defaultwert ist Port 3306. Anwendung:
Dieser Code erzeugt eine neue Verbindung zu der Datenbank database auf localhost. Das Ergebnis oder eventuelle Fehlermeldungen werden als XML-Daten ausgegeben. swiffSQL->setPermissions()
Beschreibung: Mit dieser Funktion lässt sich der Zugriff auf die Datenbank beschränken (oder gewähren). Diese Funktion muss nicht zwingend aufgerufen werden. Standard ist nur lesen (SELECT). Hier sind nur einige Befehle für den Zugriff auf Daten in einer MySQLDatenbank definiert. Sollte ein Befehl eingegeben werden, der momentan nicht definiert ist (z.B. ALTER oder SHOW), wird eine Fehlermeldung ausgegeben. Definition:
void swiffSQL->setPermissions ([bool select [, bool insert [, bool update [, bool delete [, bool truncate [, bool drop]]]]]])
Parameter:
bool select Wenn bei diesem Parameter true (wahr) angegeben wird, ist das Lesen der Datenbank erlaubt. Optionaler Parameter. Standard ist true.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
PHP, MySQL und Flash
81
bool insert Wenn bei diesem Parameter true (wahr) angegeben wird, können Daten in die Datenbank eingefügt werden. Optionaler Parameter. Standard ist false. bool update Wenn bei diesem Parameter true (wahr) angegeben wird, können Daten in der Datenbank verändert werden. Optionaler Parameter. Standard ist false. bool delete Wenn bei diesem Parameter true (wahr) angegeben wird, können Daten in der Datenbank gelöscht werden. Optionaler Parameter. Standard ist false. Es wird nicht empfohlen, diesen Parameter zu ändern. bool truncate Wenn bei diesem Parameter true (wahr) angegeben wird, kann die Tabelle geleert werden. Optionaler Parameter. Standard ist false. Es wird nicht empfohlen, diesen Parameter zu ändern. bool drop Wenn bei diesem Parameter true (wahr) angegeben wird, können Tabellen, Datenbanken etc. gelöscht werden. Optionaler Parameter. Standard ist false. Es wird nicht empfohlen, diesen Parameter zu ändern. Anwendung:
swiffSQL->query()
Beschreibung: Sendet über die erstellte Verbindung eine Anfrage an die Datenbank und gibt das Ergebnis aus. Schlägt fehl und meldet einen Fehler, wenn der Zugriff nicht gestattet ist (siehe Funktion swiffSQL->setPermissions()).
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
82
Kapitel 4
Mögliche Ausgaben: • Bei Ausgabe von Variablen: • Bei SELECT: &row_name1=wert1& &row_name2=wert2& &result_total=2& &result=1& • Bei INSERT: &insert_id=ZAHL& &result=1& Anmerkung: ZAHL ist bei einer Tabelle, in der ein auto_increment-Feld vorhanden ist, eine Zahl größer als 0. In einer Tabelle, in der kein auto_increment-Feld definiert wurde, ist ZAHL gleich 0. • Bei DELETE oder UPDATE: &affected_rows=ZAHL& &result=1& Anmerkung: ZAHL ist die Anzahl der geänderten Zeilen. • Bei allen anderen Befehlen: &result=1& • Bei Fehlern: &error=Fehlermeldung& &result=0& Anmerkung: Bei Fehlern wird das Script beendet. • Bei Ausgabe von XML: • Bei SELECT: • Bei INSERT: ·
HINWEIS
ZAHL ist bei einer Tabelle, in der ein auto_increment-Feld vorhanden ist, eine Zahl größer als 0. In einer Tabelle, in der kein auto_increment-Feld definiert wurde, ist ZAHL gleich 0.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
PHP, MySQL und Flash
83
• Bei DELETE oder UPDATE: Anmerkung: ZAHL ist die Anzahl der geänderten Zeilen. • Bei allen anderen Befehlen: • Bei Fehlern: <error message="Fehlermeldung" /> Anmerkung: Bei Fehlern wird das Script beendet. Definition:
void swiffSQL->query(string sql)
Parameter:
string sql Ein gültiger und korrekt formatierter SQL-String.
Anwendung:
Dieser Code liefert alle Datensätze der Tabelle fruits in der Datenbank database auf dem Server localhost als XML-Daten. swiffSQL->close()
Beschreibung: Schließt die Verbindung zur Datenbank. Die Verbindung wird zwar beim Beenden des Scripts automatisch geschlossen, jedoch werden während der Laufzeit Ressourcen freigegeben, wenn Sie die Verbindung sofort nach erfolgter Anfrage selbst beenden. Definition:
void swiffSQL->close(void)
Parameter:
Keine.
Anwendung:
Dieser Code öffnet eine Verbindung zu einer Datenbank, stellt eine Anfrage, gibt das Ergebnis als XML-Daten aus und schließt die Verbindung. DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
84
Kapitel 4
4.2.3 Umgang mit der Klasse swiffSQL Prinzipiell lässt sich sagen, dass die Ausgabe von XML-Daten eleganter und auch komfortabler ist. Wenn man XML ausgibt, muss man weder im Voraus die Namen der Felder in der Datenbank wissen, noch muss man eine Ergebnisvariable abfragen. Man muss »nur« das XML-Objekt durchlaufen, und man erkennt, ob und was für Daten geladen wurden. Bei der Ausgabe von XML hat man im Gegensatz zur Ausgabe von Variablen einen Geschwindigkeitsverlust. Sowohl das Laden von XML-Daten als auch das Parsen dauert länger, als dies bei Variablen der Fall ist. Da sich bei verschiedenen Applikationen Unterschiedliches anbietet (bei zeitkritischen Applikationen wie z.B. einem Chat eher Variablen, bei einem Gästebuch etwa XML), möchte ich hier auf beide Möglichkeiten, Daten zu laden, eingehen. Die Datenbankstruktur für die zwei folgenden Beispiele (liegt auf CD-ROM bei: Beispiele\swiffSQL\fruits.sql): fruits id
fruit
color
1
Erdbeere
rot
2
Banane
gelb
3
Zitrone
gelb
4
Melone
grün
4.2.4 Beispiel: Daten laden (Variablen) Dieses Beispiel befindet sich im Ordner Beispiele\swiffSQL\Lessons\fruchtSuche\ auf der CD-ROM. Aufbau des PHP-Scripts:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
PHP, MySQL und Flash
85
Aufbau des SWF:
Abbildung 4.3: In diesem SWF kann der Besucher eine Farbe eingeben, dann wird in der Datenbank nach einer Frucht mit entsprechender Farbe gesucht. Wenn eine oder mehrere Früchte gefunden werden, werden diese ausgegeben.
Ablauf der Applikation: 1. Im SWF wird vom Besucher eine Farbe eingegeben. 2. Diese Farbe wird in einen SQL-String eingefügt und an ein PHP-Script weitergeleitet.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
86
Kapitel 4
3. Das PHP-Script sendet die Anfrage an die Datenbank, eine Frucht mit der Farbe, die der Besucher zuvor eingegeben hat, zu suchen, und gibt dann das Ergebnis in Flash-kompatiblem Format (hier Variablen) aus. 4. Das SWF lädt das Ergebnis und überprüft, ob Früchte gefunden wurden. Falls ja, werden diese in einem Textfeld angezeigt, falls nicht, wird eine Meldung ausgegeben. ·
In diesem Beispiel wird ein SQL-String im SWF generiert und an das PHP weitergeleitet. Es wäre in diesem Fall sinnvoller, nur die Farbe zu übergeben, da das SWF an keiner sonstigen Stelle mit der Datenbank bzw. dem PHP in Interaktion tritt. Dieses Beispiel ist bewusst einfach gehalten, um den Umgang mit der swiffSQL-Klasse zu zeigen.
HINWEIS
Auf der CD-ROM befinden sich zwei Interfaces (eines für Variablen und eines für XML), die die Flexibilität der swiffSQL-Klasse zeigen. Nachdem Sie dieses Beispiel verstanden haben, sollten Sie unbedingt einen Blick auf diese Interfaces werfen.
Die Interfaces befinden sich im Ordner Beispiele\swiffSQL\Interfaces\ auf der CD-ROM. Aufbau der Applikation: 1. Erstellen Sie einen neuen Flash-Film. 2. Fügen Sie ein Texteingabefeld ein, in das die Farbe eingegeben werden kann, und nennen Sie es farbe. 3. Erstellen Sie ein weiteres dynamisches Textfeld (mehrzeilig mit Zeilenumbruch) mit der Variable message. In diesem Textfeld wird nachher entweder die Meldung ausgegeben, dass keine Früchte mit der gesuchten Farbe gefunden wurden, oder bei Erfolg die gefundenen Früchte. 4. Nun benötigen wir noch eine leere Filmsequenz. In diese werden die Daten bzw. die Ausgabe des PHP-Scripts geladen. Nennen Sie die Filmsequenz emptyClip und weisen Sie ihr folgenden Code zu: onClipEvent (data) { if (result == 1) { //~ Daten korrekt geladen if (result_total == 0) { //~ Keine Früchte gefunden _root.message = "Keine Frucht mit dieser Farbe in der Datenbank!"; } else { //~ Früchte gefunden _root.message = "Diese Früchte haben die gewünschte Farbe:\n"; for (i = 0; i < result_total; i++) { //~ Alle gefundenen Früchte anzeigen
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
PHP, MySQL und Flash
87
_root.message += this["fruit_"+i]+"\n"; } //~ end for } //~ end if //~ Geladene Variablen löschen for (var v in this) { delete this[v]; } //~ end for } //~ end if } //~ end onClipEvent Vom PHP-Script werden folgende Daten zurückgegeben: • Bei Erfolg: – Bei keinen gefundenen Früchten: &result=1& &result_total=0& – Bei zwei gefundenen Früchten: &result=1& &fruit_1=Banane& &fruit_2=Zitrone& &result_total=2& • Bei Fehlschlag: &result=0& &error=Fehlermeldung& In diesem Beispiel wird nicht auf Fehlschlag überprüft, sondern nur darauf, ob Früchte gefunden wurden oder nicht. Sobald alle Daten geladen wurden (onclipEvent(data)), wird überprüft, welchen Wert result hat. Wenn der Wert gleich 1 sein sollte (also Erfolg), dann wird überprüft, ob result_total (die Anzahl der gefundenen Früchte) gleich 0 ist. Wenn ja, wird eine Meldung ausgegeben, dass keine Früchte gefunden wurden, wenn nein, dann wird eine andere Meldung im Textfeld message angezeigt und die Früchte angehängt. Da die Früchte sich ja in der Form &fruit_1=name& &fruit_2=name& ... &fruit_n=name& in der Filmsequenz befinden und man die Gesamtzahl weiß (result_total), kann man diese Variablen einfach mit einer Schleife zusammensetzen und auslesen. Nachdem die Früchte angezeigt wurden bzw. die Meldung ausgegeben wurde, müssen die geladenen Variablen wieder gelöscht werden, da es möglich ist, dass der Besucher eine neue Anfrage startet.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
88
Kapitel 4
5. Um eben diese Anfrage starten zu können, wird auf Ebene 0 neben dem Eingabefeld für die Farbe noch eine Schaltfläche benötigt. Erstellen Sie diese und weisen Sie ihr folgenden Code zu: on (release, keyPress "<Enter>") { // ~ Textfeld auf Ebene 0 leeren delete _root.message; // ~ SQL String erstellen sql = "SELECT fruit FROM fruits WHERE color = '"+farbe+"'"; // ~ Dokument laden loadVariables("query.php", "emptyClip", "POST"); } //~ end on Zuerst wird das Ausgabefenster geleert, damit das Ergebnis der letzten Suche nicht eventuell stehen bleibt. Dann wird der SQL-String erstellt. Dieser ist vorformatiert, und die Eingabe des Besuchers wird an der entsprechenden Stelle eingefügt. Dann wird der SQL-String an das PHP-Script übertragen und die Ausgabe in die Filmsequenz emptyClip geladen. Sie können den SQL-String auch nur an den URL anhängen und mit escape() URL-kodieren, es ist jedoch sinnvoller (vor allem, wenn der String länger ist), diesen nicht an den URL anzuhängen, da einerseits Daten verloren gehen können, wenn er zu lang ist, und andererseits eventuell unbefugte Personen auf dumme Ideen gebracht werden. Wenn Sie den SQL-String per POST übermitteln, sollten Sie darauf achten, dass keine anderen Daten unnötigerweise an das PHP-Script gesendet werden, da dies den Vorgang nur unnötig verlangsamen würde (siehe auch Kapitel 3.2.4). 6. Nun wenden wir uns dem PHP-Script zu. Binden Sie zuerst die Klassendatei für die swiffSQL-Klasse ein, damit Sie auf deren Funktionen zugreifen können:
4.2.5 Beispiel: Daten laden/einfügen (XML) Dieses Beispiel befindet sich im Ordner swiffSQL\Lessons\enterFruit\ auf der CD-ROM. Der XMLNode-Prototyp insertAction(): XMLNode.prototype.insertAction = function () { if (this.firstChild.nodeName == "insert_id") { //~ Frucht erfolgreich eingefügt //~ Früchte laden getFruits(); } else if(this.firstChild.nodeName == "error") { //~ Frucht nicht erfolgreich eingefügt //~ Fehlermeldung ausgeben message = this.firstChild.attributes.text; } } Der XMLNode-Prototyp showFruits(): XMLNode.prototype.showFruits = function () { if (this.firstChild.nodeName == "result") { var array = this.firstChild.childNodes; for (var k = 0; k < array.length; k++) { message += array[k].attributes.fruit; message += " - "; message += array[k].attributes.color; message += "\n"; }
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
90
Kapitel 4
} else if (this.firstChild.nodeName == "error") { message = this.firstChild.attributes.text; } } Aufbau des SWF:
Abbildung 4.4: In diesem SWF kann der Besucher eine Frucht inkl. Farbe in eine Datenbank eintragen und bekommt danach eine Liste mit allen Früchten zurück.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
PHP, MySQL und Flash
91
Aufbau des PHP-Scripts: ... • Beim Speichern einer Frucht in der Form: wobei ZAHL in unserem Fall eine Zahl größer 0 sein muss, da wir ein auto_incrementFeld (id) haben. • Bei einem Fehler: <error message="Fehlermeldung" /> DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
94
Kapitel 4
5. Nachdem die Anfrage an die Datenbank gesendet und das Ergebnis ausgegeben wurde (siehe oben), können wir die Verbindung zur Datenbank wieder schließen: //~ Verbindung schließen $swiffSQL->close(); ?> 6. Nun benötigen wir noch die Flash-Seite, mit der die Ausgabe des PHP-Scripts (grafisch) verarbeitet wird. 7. Erstellen Sie zunächst einen neuen Flash-Film und fügen Sie in diesen drei Textfelder ein. Eines dieser Textfelder ist ein dynamisches Textfeld mit der Variable message. In diesem werden die geladenen Früchte angezeigt (deshalb das Textfeld eher hoch als breit und mit Wortumbruch anlegen). Dazu kommen die zwei Texteingabefelder fruit und color. In diese Textfelder muss der Besucher die Frucht bzw. die Farbe, die er in der Datenbank speichern möchte, eintragen. 8. Nun wird noch eine Schaltfläche benötigt, mit welcher der Besucher seine Frucht (und Farbe) an das PHP-Script schicken kann, das die Eintragung vornimmt. Legen Sie diese ebenfalls auf Ebene 0 an. 9. Im ersten Bild des Films legen Sie folgende Variable fest: url = "query.php"; Dies ist der URL zu dem zuvor erstellten Script. Es ist sinnvoll, diese Variable festzulegen, da wir sie an verschiedenen Stellen benötigen. Es wäre selbstverständlich auch möglich, den URL an den jeweiligen Stellen direkt einzufügen. 10. Da jeweils zu Beginn des Scripts und nach dem Einfügen einer Frucht, also an zwei verschiedenen Stellen im SWF, die gesamten sich in der Datenbank befindlichen Früchte angezeigt werden sollen, ist es sinnvoll, diesen Code in einer Funktion unterzubringen. Fügen Sie deshalb ebenfalls im ersten Bild des SWF folgenden Code ein: function getFruits() { //~ Neues XML-Objekt erstellen var myFruits = new XML(); //~ XML-Daten (Früchte und Farben) laden myFruits.load(url+"?action=get"); /*~ Sobald alles geladen wurde, den Prototyp showFruits() aufrufen */ myFruits.onLoad = myFruits.showFruits; } Dieser Code erstellt ein neues XML-Objekt und lädt dann in dieses die Ausgabe des PHP-Scripts (als Aktion wird get angegeben). Sobald die Ausgabe des Scripts vollstän-
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
PHP, MySQL und Flash
95
dig geladen wurde, wird der XMLNode-Prototyp showFruits() auf das XML-Objekt mit den geladenen Daten angewandt. Diesen Prototyp müssen Sie ebenfalls einfügen: XMLNode.prototype.showFruits = function () { if (this.firstChild.nodeName == "result") { //~ Daten erfolgreich geladen //~ Alle Früchte und Farben extrahieren var array = this.firstChild.childNodes; for (var k = 0; k < array.length; k++) { //~ durchlaufen und Name+Farbe anzeigen message message message message
+= += += +=
array[k].attributes.fruit; " - "; array[k].attributes.color; "\n";
} //~ end for } else if (this.firstChild.nodeName == "error") { //~ Ein Fehler ist aufgetreten //~ Fehlermeldung ausgeben message = this.firstChild.attributes.text; } //~ end else if } Zuerst wird geschaut, ob der Name des obersten Knotens result oder error ist. Ist der Name error, ist ein Fehler aufgetreten. Dieser wird dann im Textfeld message angezeigt. Ist der Name result, werden alle childNodes (unsere Reihen, also Früchte mit ihren jeweiligen Farben) in einem Array gespeichert und dieses durchlaufen. Bei jedem Element wird der Name (der Frucht) und die Farbe zu dem Textfeld message in der Form Fruchtname – Fruchtfarbe\n hinzugefügt. ·
HINWEIS
Es wäre auch möglich, diesen Prototyp als einfache Funktion zu definieren, allerdings erachte ich es immer als sehr komfortabel, wenn man auf this Zugriff hat; insofern nutze ich diesen Vorteil gerne aus. Sie können aber selbstverständlich auch eine normale Funktion verwenden.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
96
Kapitel 4
11. Als Nächstes wird die Funktion benötigt, mit der sich eine Frucht in der Datenbank speichern lässt. Dazu benötigen wir zuerst den Code, der die Frucht inklusive Farbe an das PHP-Script übergibt: function insertFruit(fruit, color) { //~ String, der an das Script übergeben wird string = "?action=add&fruit="+escape(fruit)+"&color="+escape(color); //~ Neues XML-Objekt erstellen var result = new XML(); //~ Ausgabe laden (insert_id oder error) result.load(url+string); /*~ Sobald alles geladen wurde, den Prototyp insertAction() aufrufen */ result.onLoad = result.insertAction; } Zuerst wird der String definiert, der an den URL angehängt wird, die Aktion festlegt und Frucht und Farbe übergibt. Sowohl der Name der Frucht als auch die Farbe werden URL-kodiert. Dies würde der Browser eventuell auch automatisch machen, allerdings ist es sauberer und vermeidet eventuelle Fehler, wenn der String bereits URL-kodiert übergeben wird. Sobald die Ausgabe des Scripts vollständig geladen wurde, wird der XMLNodePrototyp insertAction() auf die geladenen Daten im XML-Objekt result angewandt. Diesen Prototyp müssen Sie einfügen: XMLNode.prototype.insertAction = function () { if (this.firstChild.nodeName == "insert_id") { //~ Frucht korrekt eingefügt //~ Aktualisierte Früchteliste laden getFruits(); } else if(this.firstChild.nodeName == "error") { //~ Beim Einfügen trat ein Fehler auf //~ Fehlermeldung ausgeben message = this.firstChild.attributes.text; } //~ end else if }
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
PHP, MySQL und Flash
97
Zuerst wird überprüft, ob die Frucht korrekt eingefügt wurde (in diesem Fall ist der Name des obersten Elements result) oder ob ein Fehler auftrat (der Name des obersten Elements ist dann error). Wenn ein Fehler auftrat, wird die Fehlermeldung im Textfeld message ausgegeben. Andernfalls wird die Funktion getFruits() aufgerufen und so die aktualisierte Früchteliste aus der Datenbank geladen und dargestellt. Damit beim Start des SWF automatisch die Früchte geladen werden, muss nun noch im ersten Bild der Aufruf getFruits(); eingefügt werden. 12. Damit die Funktion insertFruit() vom Besucher aufgerufen werden kann, sobald er eine neue Frucht (und Farbe) in die vorgesehenen Textfelder eingetragen hat, muss dem zuvor erstellten Textfeld auf Ebene 0 folgender Code zugewiesen werden: on (release) { insertFruit(fruit, color); delete message; delete fruit; delete color; } Dieser Code ruft die Funktion insertFruit() mit den in den Textfeldern eingetragenen Werten auf und löscht diese danach. Das Textfeld, in dem nachher die aktualisierte Fruchtliste (oder ein Fehler) angezeigt wird, sollte ebenfalls geleert werden.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
KAPITEL 5
UMGANG MIT FLASH UND PHP
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
100
Kapitel 5
In diesem Kapitel werden einige Probleme beim Umgang mit Flash und PHP angesprochen und Lösungsmöglichkeiten dargeboten. Anhand von einigen Beispielen wird gezeigt, wie sich Flash und PHP elegant und zweckmäßig verbinden lassen.
5.1 Scripts von anderen Servern ausführen/laden Seit dem Flash-Plugin Version 4.0.1.2 ist es nicht mehr möglich, auf Scripts/Dateien von anderen Servern bzw. Domains zuzugreifen, da dies als Sicherheitslücke angesehen wurde. Das heißt: Wenn man ein Script aufrufen möchte, das unter www.meinedomain.de/ script.php liegt, so muss das SWF sich auch unterhalb von meinedomain.de befinden. Es ist nicht möglich, von einem Script, das unter www.meinedomain.de/meinswf.swf liegt, auf ein Script zuzugreifen, das unter www.anderedomain.de/script.php liegt. · HINWEIS
Diese Beschränkung bezieht sich nur auf das Browser-Plugin, im Standalone-Player besteht sie nicht.
Um dennoch auf ein Script, das auf einem anderen Server liegt, zugreifen zu können, gibt es zwei Möglichkeiten:
5.1.1 Proxy-Scripting Ein Beispiel dazu befindet sich im Ordner Beispiele\extRequest\ auf der CD-ROM. Bei dieser Methode ruft das SWF ein PHP-Script auf, das auf der selben Domain liegt. Dieses PHP-Script wiederum kontaktiert das extern liegende Script und gibt dessen Ausgabe an das SWF weiter. Das PHP-Script fungiert somit als »Proxy«-Datenquelle. Eine Funktion, die genau diese Rolle übernimmt, ist Bestandteil der flash.inc.php-Klasse (siehe Kapitel 10). ·
HINWEIS
Bedenken Sie, dass ein PHP-Script, das einen anderen Server kontaktiert, den Server zusätzlich belastet. Das Ausmaß der zusätzlichen Belastung ergibt sich aus der Häufigkeit des Aufrufs und dem Volumen der übermittelten Daten.
5.1.2 DNS-Aliasing DNS (engl: Domain Name System) – Das DNS ist quasi das »Telefonbuch« des Internets. Es dient dazu, die Domainnamen in ihre entsprechenden IP-Adressen umzuwandeln und vice versa.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Umgang mit Flash und PHP
101
Bei dieser Methode wird ein DNS-Eintrag angelegt, der ein Alias zu einem externen Server ist. Wenn das SWF den Aufruf zu dem DNS-Alias macht, dann fängt der DNS den URL ab, wertet die Anfrage aus und gibt sie an den extern liegenden Server weiter. ·
HINWEIS
Manche Server lehnen Anfragen von anderen Domains ab, somit ist es möglich, dass eine Fehlermeldung anstelle der erwarteten Variablen zurückgegeben wird. DNS-Einträge für Server außerhalb Ihrer eigenen Domain anzulegen kann problematisch sein. Diese Lösung setzt eine enge Zusammenarbeit mit den Systemadministratoren des extern liegenden Servers voraus, um unerwartetem Verhalten vorzubeugen.
Informationen zum Zugriff auf extern liegende Daten: • Macromedia Technote ID 14213
5.2 SSL mit Flash SSL – (engl.: Secure Sockets Layer) SSL ist eine sichere Übertragungsmethode für Daten im Internet. Für SSL werden Zertifikate für die Gewährleistung der sicheren Übertragung benötigt. Mit diesen Zertifikaten kann man sich beispielsweise sicher sein, wo der Server, auf den man Daten überträgt, steht und wer ihn betreibt. Für ein solches Zertifikat wird ein Zeuge benötigt (z.B. VeriSign – www.verisign.com). Eine solche Bürgschaft kostet Geld – sollten Sie Interesse an einem Sicherheitszertifikat haben, so wenden Sie sich an Ihren ISP, die meisten ISPs bieten für ihre Kunden solche Zertifikate an. Laut Macromedia soll sich Flash bei der Verwendung eines SSL-Servers in Bezug auf die Sicherheit genauso verhalten wie HTML. Man soll sich beim Umgang mit SSL und Flash genauso verhalten wie bei SSL und HTML. Sollten Sie eine Verbindung zu einem sicheren Server aufbauen wollen, so benutzen Sie als Methode POST und einen HTTPS-URL. HTTPS – (engl.: Hypertext transfer protocol secure) Bei einem URL, der mit https:// beginnt, werden die Daten verschlüsselt zum Webserver übertragen. Hierbei wird die Verschlüsselungsmethode SSL (siehe oben) angewandt. Beispiel: //~ ActionScript passwort = "12345"; loadVariablesNum("https://sslserver/daten.php", 0); würde die Variable »passwort« verschlüsselt an den Server (hier: sslserver) übertragen und die Ausgabe auf Ebene 0 laden.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
102
Kapitel 5
Informationen zu SSL: • www.ssl.de Informationen zu SSL in Verbindung mit Flash: • Macromedia Technote ID 13931
5.3 Beispiel: Passwortgeschützter Bereich in Flash Dieses Beispiel befindet sich im Ordner Applikationen\flashPass\ auf der CD-ROM. Inhalt des SWF:
Abbildung 5.1: Dieses Bild zeigt den Aufbau der Eingabemaske für passwortgeschützte Daten, die aus einem PHP-Script geladen werden sollen.
Inhalt des PHP-Scripts: Es kann sein, dass man innerhalb von Flash bzw. eines SWF einmal Daten benötigt, auf die nur ein oder mehrere bestimmte Benutzer zugreifen dürfen. Dies lässt sich mit Hilfe von Flash allein nicht sicher lösen, da das Passwort irgendwo im SWF gespeichert werden müsste. Da Flash aber eine clientseitige Sprache ist und so der Träger (das SWF) mit dem Benutzer in Berührung kommt, würden auch die im SWF gespeicherten Passwörter dem Besucher zugänglich sein. Es ist ein Leichtes, ein SWF von einer Domain entweder direkt herunterzuladen oder aus dem Cache des Browsers zu holen. Mit einem Hexeditor könnte man dann das SWF begutachten und so Variablen und damit auch die Passwörter aus dem SWF herauslesen.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
104
Kapitel 5
Wir müssen also eine Methode finden, bei der die Passwörter nicht mit dem Besucher in Berührung kommen. Dazu eignet sich PHP, da der Quellcode von PHP nur eingesehen werden kann, wenn der Zugriff über das FTP-Protokoll stattfindet. Wenn ein PHP-Script per HTTP aufgerufen wird, dann wird niemals der Quellcode angezeigt werden (dies stellt der Interpreter sicher). Es ist demnach also möglich, die Passwörter bzw. die Benutzer in einem PHP-Script zu speichern und dort zu überprüfen, ob der Benutzer die Berechtigung hat, die Daten abzurufen oder nicht. ·
HINWEIS
Der folgende Entwurf ist lediglich ein Beispiel. Es kann nicht garantiert werden, dass hierbei tatsächlich eine Sicherheitsebene erreicht wird, die den geschützten Daten angemessen ist! Um eine höhere Sicherheitsebene zu erreichen, empfehle ich zusätzlich noch den Einsatz von SSL (siehe Kapitel 5.2).
Der Ablauf ist folgender: 1. Der User wird in Flash mit einer Eingabemaske aufgefordert, seinen Benutzernamen und das dazugehörige Passwort einzugeben. 2. Diese Daten werden an das PHP-Script übermittelt. 3. Im PHP-Script wird überprüft, ob der Benutzer gültig ist und ob das Passwort zu diesem Benutzer mit dem eingegebenen übereinstimmt. 4. Je nach Ergebnis wird entweder eine Fehlermeldung oder die geheimen Daten zurückgegeben. 5. Die Rückgabe wird in einem Textfeld des SWF angezeigt. Aufbau der Applikation: 1. Erstellen Sie einen neuen Flash-Film. 2. Fügen Sie direkt im ersten Bild ein Texteingabefeld für den Benutzernamen ein, wählen Sie als Linientyp »Eine Zeile« und nennen Sie ihn user. Denken Sie daran, dass in PHP anders als in Flash Variablen case-sensitive sind, d.h. es wird zwischen Groß- und Kleinschreibung unterschieden. Fügen Sie ein weiteres Texteingabefeld ein, wählen Sie diesmal als Linientyp »Kennwort«. Wählen Sie bei diesem Feld als Variable pass. Nun benötigen wir noch das Textfeld für die Ausgabe der Fehlermeldungen bzw. der geheimen Daten. Fügen Sie hierzu ein mehrzeiliges Textfeld ein und nennen Sie es result. 3. Jetzt können die Daten vom Besucher eingegeben werden. Aber zur Übergabe der Daten an das PHP-Script und die Rückgabe des Ergebnisses wird noch folgender Code auf einer Schaltfläche benötigt:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Umgang mit Flash und PHP
105
//~ ActionScript on (release, keyPress "<Enter>") { delete result; loadVariablesNum("checkPass.php", 0, "POST"); } Wenn die Schaltfläche angeklickt oder die Enter-Taste gedrückt wird, wird das Ergebnis, das eventuell von einem vorherigen Fehlschlag geladen worden wäre, gelöscht und die Daten in den Textfeldern erneut an das PHP-Script (hier: checkPass.php) übertragen. Beachten Sie hierbei, dass als Übertragungsmethode POST angegeben wurde. Dies ist extrem wichtig, da bei der GET-Methode das Passwort und der Benutzername an den URL angehängt würden und somit eventuell aus dem Cache des Browsers von Unbefugten extrahiert werden könnten. Ein weiterer Grund dafür, hier die POST-Methode zu verwenden, ist, dass dann die Benutzerdaten auch nicht von Proxies zwischengespeichert werden und somit nicht in Hände von Dritten fallen können. · HINWEIS
Sollten Sie ein noch höheres Maß an Sicherheit benötigen, so schauen Sie sich bitte Kapitel 5.2 an.
4. Nachdem das SWF nun fertig ist, widmen wir uns dem PHP-Script. Erstellen Sie hierzu eine neue PHP-Datei (hier: checkPass.php). Binden Sie zuerst die Klassendatei von flash.inc.php ein, damit Sie auf deren Funktionen zugreifen können: include("./includes/flash.inc.php"); · HINWEIS
Die Klasse flash.inc.php und ihre Funktionen sind in Kapitel 10 näher beschrieben.
5. Als Nächstes legen wir die Benutzer mit ihren Passwörtern fest, die auf die geschützten Daten Zugriff haben sollen: $accessArray = array(); Es ist immens wichtig, dass dieses Array neu definiert wird. Man könnte auch Benutzer zum Array hinzufügen, ohne vorher die Variable $accessArray dem Typ »Array« zugeordnet zu haben. Dies würde allerhöchstens eine Warnung produzieren. Sollten Sie das Array jedoch nicht bei jedem Aufruf des PHP-Scripts neu definieren, so ließen sich an den URL des PHP-Scripts neue Arrayelemente anhängen, etwa so: http://server/checkPass.php?accessArray[hacker]=trick&user=hacker&pass=trick Schon käme der Hacker an die geschützten Daten heran, ohne dass er überhaupt einen Benutzernamen oder ein Passwort kennt. Gehen Sie nicht davon aus, dass niemand die Art der Benutzerspeicherung (also das Array) erraten wird, sondern stellen Sie sicher, dass Daten aus der Umwelt (dem Internet bzw. dem Hacker) nicht die Daten in Ihrem PHP-Script auf ungewollte Weise manipulieren. Um die Benutzer zu definieren, benötigen wir folgenden Code:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
106
Kapitel 5
$accessArray["Joscha"] = "X"; $accessArray["User2"] = "Passwort2"; $accessArray["User3"] = "PASSwort3"; Das Array wird in der Form $accessArray["Benutzername"] = "Passwort"; definiert. Sollten Sie einen weiteren Benutzer hinzufügen wollen, so können Sie diesen inklusive Passwort einfach mit einer weiteren Zeile derselben Form definieren. Benutzernamen und Passwörter sind case-sensitive, d.h. es wird sowohl im Namen als auch im Passwort nach Groß- und Kleinschreibung unterschieden. 6. Als Nächstes definieren wir die geschützte Information: $geheim = "Ganz geheim!\nExtra für dich ;-)"; Diese Information könnte selbstverständlich auch aus einer Datenbank oder einer anderen Datenquelle kommen. Sie ist hier nur der Einfachheit des Beispiels wegen direkt in PHP definiert. 7. Da es sich bei diesem PHP-Script um sensible Daten handelt, fügen wir folgenden Befehl hinzu: flash::drawExpire(); Dieser Befehl verhindert, dass die Ausgabe des Scripts von Proxies und/oder im Cache des Besuchers gespeichert wird. Dies ist wichtig, da bei einem erfolgreichen Login die geschützten Daten zurückgegeben werden und diese nicht aus dem Cache extrahiert werden dürfen. 8. Nun können wir beginnen, die vom Besucher übergebenen Daten zu überprüfen und im Falle eines Fehlschlags eine Fehlermeldung oder bei Erfolg die geschützten Daten auszugeben. //~ Überprüfung, ob Benutzer und Passwort eingegeben wurden. if (empty($user) OR empty($pass)) { //~ Passwort oder Benutzer wurden nicht eingegeben flash::echoVar("result", "Bitte geben Sie Ihren Benutzernamen und Ihr Kennwort ein!", true); exit(); //~ Script beenden } else if (!isset($accessArray[$user]) OR $accessArray[$user] != $pass) { //~ Passwort oder Benutzer falsch/nicht vorhanden flash::echoVar("result", "Falsches Passwort/Benutzer", true); exit(); //~ Script beenden
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Umgang mit Flash und PHP
107
} else { //~ alles korrekt, "geheime" Daten ausgeben flash::echoVar("result", $geheim, true); } //~ end if else In der ersten if-Abfrage wird geprüft, ob die Variablen $user und $pass überhaupt einen Inhalt haben. Wenn eine oder beide Variablen keinen Inhalt haben, dann wird eine Fehlermeldung ausgegeben. Bei der zweiten if-Abfrage wird geprüft, ob der eingegebene Benutzer überhaupt gültig ist, und wenn ja, ob das eingegebene Passwort mit dem des Benutzers übereinstimmt. Wenn beide Bedingungen erfüllt sind, werden die geschützten Daten ausgegeben, ansonsten wird eine Fehlermeldung generiert. ·
HINWEIS
Geben Sie in der Fehlermeldung immer an, dass sowohl der Benutzername als auch das Passwort falsch sein können. Schränken Sie den Fehler nicht weiter ein, da sonst unbefugte Personen bei einem bekannten Benutzernamen nur noch Passwörter ausprobieren müssen.
Sie sehen, dass nach der Ausgabe der Fehlermeldungen das Script sofort beendet wird. Dies ist nicht unbedingt nötig, da auch bei weiterer Ausführung die Bedingungen die Ausgabe der geschützten Daten verhindern würden. Allerdings ist es überflüssig, bei einer Fehlermeldung weitere Überprüfungen vorzunehmen, da eventuelle Fehler bei der Eingabe so oder so zuerst behoben werden müssen.
5.4 Beispiel: Sessions mit Flash und PHP Dieses Beispiel befindet sich im Ordner Applikationen\flashSession\ auf der CD-ROM. Inhalt des PHP-Scripts: ·
HINWEIS
In diesem Beispiel werden die Session-Funktionen von PHP verwendet. Diese sind ab PHP Version 4 verfügbar. Es ist möglich, die Session-Funktionen zu benutzen, ohne die Session-Daten an PHP-Scripts anzuhängen, da die Session Engine von PHP Cookies benutzt. Da aber nicht alle Benutzer Cookies aktiviert haben, wird in diesem Beispiel nur darauf eingegangen, wie man die Session-Funktionen ohne die Verwendung von Cookies einsetzt.
Globale Variablen in Flash
Exkurs
Es gibt in Flash (4/5) keine globalen Variablen, d.h. es ist nicht möglich, eine Variable so zu definieren, dass man überall direkt auf sie zugreifen kann. Angenommen, Sie definieren eine Variable variable auf Ebene 0, dann können Sie innerhalb einer Filmsequenz auf diese Variable nicht direkt zugreifen, sondern müssen den Pfad voranstellen.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Umgang mit Flash und PHP
111
Beispiel: //~ ActionScript Exkurs
//~ Man befindet sich z.B. in einer Filmsequenz, //~ auf Ebene 0 ist die Variable "variable" definiert. //~ mit dem Code trace(variable); //~ kann ihr Inhalt nicht ausgegeben werden, mit trace(_root.variable); //~ hingegen schon. Das heißt, es gibt zwar keine globalen Variablen, aber man kann auf alle Variablen global zugreifen (solange man ihren genauen Pfad kennt).
Der Ablauf ist folgender: 1. In Flash wählt der Besucher eine Sprache (Englisch oder Deutsch) und startet dann die Session. 2. Die Session-Daten werden vom PHP-Script an das SWF zurückgegeben. 3. Danach kann mit der Session-ID, die an ein PHP-Script übergeben wird, herausgefunden werden, welche Sprache der Besucher zuvor gewählt hat, und anhand dieser Information ein Text in der entsprechenden Sprache geladen werden. 4. Bei Bedarf kann die Session beendet werden. Aufbau der Applikation: 1. Erstellen Sie einen neuen Flash-Film mit drei Ebenen mit jeweils zwei Bildern. 2. Erstellen Sie in der dritten Ebene ein Textfeld mit der Variable message. Dies wird benötigt um Statusmeldungen auszugeben. 3. Fügen Sie in der ersten Ebene eine leere Filmsequenz ein. Benennen Sie diese eindeutig (hier: _SESS). Welchen Namen Sie der Filmsequenz geben, ist nicht wichtig, allerdings werden in dieser Filmsequenz später die Session-Daten gespeichert. Somit ist es sinnvoll, einen eindeutigen und kurzen (da Sie eventuell oft darauf zugreifen müssen) Namen zu geben. Fügen Sie zu dieser Filmsequenz folgenden Code hinzu: //~ ActionScript onClipEvent (data) { _root.message = message; delete message;
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
112
Kapitel 5
if (result == true) { _root.gotoAndPlay (2); } //~ end if delete result; } //~ end onClipEvent(data) Dieser Code bewirkt, dass nach dem vollständigen Laden von Daten in diese Filmsequenz die Statusmeldung in dem Textfeld, das wir auf der dritten Ebene erstellt haben, ausgegeben wird. Danach wird die Statusmeldung gelöscht, da sie nicht länger benötigt wird. Die if-Abfrage bewirkt, sollte der vom PHP-Script zurückgegebene Status true (wahr) sein, dass auf der Hauptzeitleiste ein Bild weiter gesprungen wird. Danach wird die Statusvariable (result) gelöscht. Wenn der Status true (wahr) ist, enthält die Filmsequenz auch die Session-Daten, die später benötigt werden. 4. Ändern Sie nun das zweite Bild auf der zweiten Ebene in ein Schlüsselbild um, in das Sie eine stop()-Aktion einfügen. Im ersten Bild fügen Sie folgenden Code ein: //~ ActionScript MovieClip.prototype.getString = function () { var authString = this._SNAME+"="+this._SID; return authString; }; // ~ end function getString stop (); Der Filmsequenz-Prototyp gibt, wenn er aufgerufen wird, einen String zurück, der die Session-Daten enthält, die an das PHP-Script angehängt werden müssen. Der String sieht der Form nach so aus: PHPSESS=7a9659221e0693185ae4a4249c875ce2 Er wird aus den zuvor vom PHP-Script übergebenen Session-Daten generiert. Wenn Sie die Ausgabe des PHP-Scripts bzw. die Variablen verändern oder diese innerhalb des SWF an anderer Stelle als in einer Filmsequenz speichern, dann müssen Sie diesen Prototyp entsprechend anpassen. 5. Ebenfalls im ersten Bild der zweiten Ebene fügen Sie drei Schaltflächen ein, zwei zur Auswahl der Sprache, nämlich eine für die Sprache Deutsch und eine für Englisch. Die dritte Schaltfläche dient zum Starten der Session. Der Schaltfläche für Deutsch weisen Sie folgenden Code zu:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Umgang mit Flash und PHP
113
on (release) { message = "Deutsch"; language = "de"; } Der Schaltfläche für Englisch weisen Sie folgenden Code zu: on (release) { message = "Englisch"; language = "en"; } Der Schaltfläche zum Starten der Session weisen Sie folgenden Code zu: on (release) { _SESS.loadVariables("flashSession.php?action=create&language="+language); delete language; } Dieser Code übergibt dem Script die gewählte Sprache und die Aufforderung, die Session einzuleiten. Die Rückgabe des Scripts wird in die vorher erstellte Filmsequenz _SESS auf Ebene 0 geladen. Die Information, welche Sprache gewählt wurde, wird entfernt, da sie nicht länger benötigt wird. 6. Im zweiten Frame der zweiten Ebene benötigen wir zwei Schaltflächen, eine, um den Text zu laden, und eine, um die Session zu beenden. Weisen Sie dem Button für das Laden des Textes folgenden Code zu: on (release) { loadVariablesNum("flashSession.php?action=get&"+_SESS.getString(), 0); } Dieser Code übergibt dem PHP-Script die Session-Daten, die mit der Funktion getString() aus dem Container (der Filmsequenz _SESS) in einen String umgewandelt und dann an das Ende des URL zusammen mit der Aktion angehängt werden. Die Ausgabe des Scripts wird auf Ebene 0 geladen und der Text im Textfeld message angezeigt. Der Button, um die Session zu beenden, benötigt folgenden Code: on (release) { loadVariablesNum("flashSession.php?action=destroy&"+_SESS.getString(), 0); } DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
114
Kapitel 5
Bei diesem Aufruf werden dem Script ebenfalls die Session-Daten angehängt, die Aktion ist aber, die Session zu beenden. Es wird eine Statusmeldung zurückgegeben, die im Textfeld message auf Ebene 0 angezeigt wird. 7. Nachdem das SWF nun fertig gestellt ist, wenden wir uns dem PHP-Script zu. Zuerst müssen Sie die flash.inc.php-Klasse einbinden, um Zugriff auf deren Funktionen zu bekommen. Näheres zu flash.inc.php erfahren Sie in Kapitel 10. Danach senden Sie die Information für Browser und Proxies, die Ausgabe des Scripts nicht im Cache zu speichern. Dies ist wichtig, da das Script eventuell sehr oft aufgerufen wird. DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Umgang mit Flash und PHP
117
Wenn register_globals nicht aktiviert ist, sondern nur track_vars, dann kann auf die Variablen nicht direkt zugegriffen werden, sondern nur über das Array $HTTP_SESSION_VARS: Tutorial
Beispiel: Ist sowohl register_globals als auch track_vars aktiviert, so bezeichnen die globalen Variablen und die Variablen im Array $HTTP_SESSION_VARS denselben Wert. · HINWEIS
Die Konfiguration hinsichtlich register_globals und track_ vars kann nur vom Administrator verändert werden.
9. Nachdem nun die Session gestartet und die Sprache wie folgt festgelegt wurde: //~ Wert der Session-Variable ändern $HTTP_SESSION_VARS["s_language"] = $language; $s_language = $language; müssen die Session-Daten noch an das SWF zurückgegeben werden. Die Session-Daten werden auch in einem Cookie auf dem Rechner des Besuchers abgelegt, wenn diese Funktion in der php.ini aktiviert wurde. Allerdings ist es möglich, dass der Besucher keine Cookies annimmt. Dann würde der weitere Ablauf fehlschlagen. Um also zu gewährleisten, dass die Session-Daten immer übergeben werden, müssen sie an das SWF übergeben werden. Dies geschieht mit folgendem Code: //~ Ausgabe des Status flash::echoVar("result", $result); //~ Ausgabe des Session-Namens flash::echoVar("_SNAME", session_name(), false); //~ Ausgabe der Session-ID flash::echoVar("_SID", session_id(), false); //~ Ausgabe der Statusmeldung flash::echoVar("message", $messageArray[$result], true);
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
118
Kapitel 5
Die Ausgabe sieht etwa so aus (andere Session-ID und evtl. anderer Session-Name): &result=1& &_SNAME=PHPSESSID& &_SID=5ec4284761796b329890949d6324e449& &message=Session+gestartet.& Zuerst wird der Statuscode ausgegeben (result). Dieser zeigt, ob alles korrekt abgelaufen ist. Dann folgen der Session-Name (_SNAME), dann die Session-ID (_SID) und dann eine Statusmeldung (message). 10. Nun benötigen wir den Code für den nächsten Block. In diesem wird ein Text ausgegeben, der je nach ausgewählter Sprache entweder englisch oder deutsch ist. Es wird aber nicht die Sprache übergeben, sondern nur die Session-Daten. In diesem Fall gibt es noch ein Missverhältnis zwischen der Datenlänge, d.h. es wäre schneller bzw. kürzer, die Sprache zu übergeben. Bei großen Projekten allerdings wird höchstwahrscheinlich nicht nur die Sprache gespeichert, sondern eventuell noch andere Informationen, wie z.B. Benutzername, Passwort etc. Da dies hier aber ein Beispiel ist und das Prinzip das gleiche bleibt, egal wie viele Daten in der Session gespeichert werden, ist das nicht von Relevanz. Fügen Sie also nach } else if ($action == "get") { folgenden Code ein: //~ Deutschen und englischen Text definieren $messageArray["de"] = "Dies ist der deutsche Text."; $messageArray["en"] = "This is the english text."; $messageArray[""] = "Session nicht aktiv!"; //~ Text in der gewählten Sprache ausgeben flash::echoVar("message", $messageArray[$HTTP_SESSION_VARS["s_language"]], true); Zuerst werden die zwei verschiedenen Texte definiert. Diese können auch aus einer anderen Quelle stammen, hier jedoch werden sie der Einfachheit halber innerhalb des PHP-Scripts definiert. Danach wird der entsprechende Text ausgegeben. Die Variable $s_language enthält die zuvor gewählte Sprache des Besuchers. Sie ist nun wieder verfügbar, und anhand von ihr wird entschieden, welcher der beiden Texte ausgegeben wird. 11. Nun wird noch der Block benötigt, mit dem die Session beendet bzw. gelöscht werden kann. Fügen Sie hierzu nach } else if ($action == "destroy") { folgenden Code ein:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Umgang mit Flash und PHP
119
//~ Statusmeldungen definieren $messageArray[0] = "Zerstörung fehlgeschlagen!"; $messageArray[1] = "Session wurde zerstört!"; //~ Session zerstören $result = session_destroy(); //~ Ausgabe der Statusmeldung flash::echoVar("message", $messageArray[$result], true); Zuerst werden die Statusmeldungen definiert, dann wird die Session mit session_ destroy()zerstört und anschließend das Ergebnis bzw. die entsprechende Statusmeldung ausgegeben.
Die Funktion session_destroy() bool session_destroy (void)
Tutorial
Diese Funktion löscht bzw. beendet eine Session und löscht alle Daten, die mit dieser zusammenhängen. Zurückgegeben wird im Erfolgsfall true (wahr) und falls das Löschen fehlschlug, false (falsch). Argumente gibt es keine, wichtig ist, dass die Session, die zerstört werden soll, vorher eingeleitet wurde, ansonsten schlägt das Beenden der Session fehl.
12. Zuletzt benötigen wir noch den Block, der ausgegeben wird, wenn beim Aufruf des Scripts keine Aktion angegeben wurde. Fügen Sie hierzu nach } else { folgenden Code ein: //~ Statusmeldung definieren $messageArray[0] = "Aktion nicht definiert!"; //~ Statusausgabe flash::echoVar("result", 0); //~ Ausgabe der Statusmeldung flash::echoVar("message", $messageArray[0]); } //~ end no correct action Dieser Code gibt eine Fehlermeldung an das SWF aus, sollte beim Aufruf keine Aktion angegeben worden sein.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
120
Kapitel 5
Dieses Projekt bzw. diese Applikation ist nur ein Beispiel für den Umgang mit Sessions. In einem richtigen Projekt werden die Aktionen, die hier über Schaltflächen ausgelöst werden, eher vom Programmierer festgelegt und ohne Zutun des Besuchers ausgelöst. Um aber die Funktionsweise und vor allem den Umgang mit Session-Daten innerhalb von Flash zu demonstrieren, eignet sich dieses Beispiel gut. Der Ablauf in einem Projekt wäre wohl eher folgender: 1. Der Besucher kommt auf der Webseite an; es wird automatisch eine Session gestartet. 2. Dann wählt der Besucher seine Sprache. 3. Im weiteren Verlauf werden bei allen Aufrufen an externe PHP-Scripts die SessionDaten übergeben, und so wird erkannt, in welcher Sprache die Daten zurückgegeben werden müssen (beispielsweise bei einem Menü oder einem Produktkatalog). 4. Die Session wird eventuell nicht explizit beendet, sondern automatisch entfernt, wenn keine Interaktion vom Besucher mehr kommt.
5.5 Beispiel: Besucherzähler mit PHP und Flash Dieses Beispiel befindet sich im Ordner Applikationen\swfCount\ auf der CD-ROM. Inhalt des SWF:
Abbildung 5.3: Dieses SWF ruft ein PHP-Script auf, das in einer Datei auf dem Server die Aufrufe zählt. So lässt sich ein einfacher Besucherzähler mit Flash und PHP realisieren.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Umgang mit Flash und PHP
121
Inhalt des PHP-Scripts: Der Ablauf ist folgender: 1. Das SWF ruft beim Start ein PHP-Script auf. 2. Dieses PHP-Script liest die bisherige Besucherzahl aus einer Datei, erhöht diese Zahl um eins, speichert sie in der Datei und gibt sie in Flash-kompatiblem Format aus. 3. Diese Ausgabe wird von Flash geladen und die Besucherzahl in einem Textfeld angezeigt. ·
HINWEIS
Da es sich bei dieser Applikation um ein Beispiel handelt, wurde auf die Ausgabe von Fehlermeldungen verzichtet. Vor dem Einsatz sollten Sie zunächst das Script im Browser direkt aufrufen, um eventuelle Fehlermeldungen sehen zu können.
Aufbau der Applikation: 1. Erstellen Sie einen neuen Flash-Film mit zwei Ebenen. 2. Auf der einen Ebene erstellen Sie ein dynamisches Textfeld mit der Variable showCount. Dies ist das Textfeld, in dem später die Besucherzahl ausgegeben wird. 3. Auf der anderen Ebene fügen Sie eine (leere) Filmsequenz ein, die folgenden Code enthält: //~ ActionScript onClipEvent (load) { loadVariables("swfCount.php", this); } DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Umgang mit Flash und PHP
123
onClipEvent (data) { _root.showCount = "Sie sind Besucher # "+count; } Der erste onClipEvent ruft das Script swfCount.php beim Start der Filmsequenz auf und lädt dessen Ausgabe in die Filmsequenz. Der zweite onClipEvent gibt die Besucherzahl zusammen mit dem kurzen Text auf Ebene 0 aus, sobald die Besucherzahl komplett geladen wurde. · BEISPIEL
Waren z.B. bereits 22 Besucher auf der Seite (inklusive des momentanen Besuchers), dann ist die Ausgabe folgende: Sie sind Besucher # 22
4. Aufbau des PHP-Scripts: Zu Beginn muss die flash.inc.php-Klasse eingebunden werden, um auf ihre Funktionen zugreifen zu können. Danach müssen Sie die Anweisung an Browser und Proxies senden, die Ausgabe des Scripts nicht zu cachen. Dies ist wichtig, falls einer der Besucher in naher Zukunft wieder auf Ihre Seite gelangen sollte. Es wird dadurch sichergestellt, dass er immer die aktuellste Besucherzahl bekommt. Zuletzt muss noch eine Datei definiert werden, in der die Besucherzahl gespeichert wird: 8. Die neue Besucherzahl wird dann in Flash-kompatiblem Format ausgegeben und kann so von dem SWF weiterverarbeitet werden. Beispiel einer Ausgabe ist: &count=22& Dieser Besucherzähler ist noch sehr einfach. Ein Beispiel für eine etwas komplexere Einsatzmöglichkeit wäre z.B., an verschiedenen Stellen des SWF Angelpunkte mit Aufrufen dieses Scripts einzubauen und in verschiedenen Dateien zu speichern. So wäre es z.B. möglich zu erfassen, wie viele Besucher das Intro übersprungen oder wie viel Prozent der Gesamtbesucherzahl sich die Referenzen angesehen hat etc.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
128
Kapitel 5
5.6 Beispiel: automatische Sprachauswahl mit Hilfe von PHP Dieses Beispiel befindet sich im Ordner Applikationen\flashLanguage\ auf der CD-ROM. Inhalt des SWF:
Abbildung 5.4: Dieses SWF lädt den Willkommenstext, welcher im PHP-Script in der richtigen Sprache ermittelt wird und zeigt in in dem Textfeld text an.
Inhalt des PHP-Scripts: Der Ablauf ist folgender: 1. Das SWF ruft das PHP-Script auf. 2. Das Script ermittelt anhand der Browsersprache die Sprache des Besuchers. 3. Wenn diese Sprache definiert wurde, wird der entsprechende (korrekt für Flash formatierte) Text ausgegeben, ansonsten der Text der Standardsprache. 4. Der zurückgegebene Text (in diesem Fall »Willkommen« in verschiedenen Sprachen) wird in einem Textfeld angezeigt.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
130
Kapitel 5
Aufbau der Applikation: 1. Erstellen Sie einen neuen Flash-Film mit zwei Ebenen. 2. Erstellen Sie auf der zweiten Ebene ein dynamisches Textfeld mit der Variable text. 3. Auf der ersten Ebene erstellen Sie eine (leere) Filmsequenz, die folgenden Code zugeordnet bekommt: onClipEvent (load) { loadVariables("flashLanguage.php", this); } onClipEvent (data) { _root.text = this.text; } Der erste onClipEvent() ruft das Script flashLanguage.php beim Start der Filmsequenz auf und lädt dessen Ausgabe in die Filmsequenz. Der zweite onClipEvent() gibt zeigt den zurückgegebenen Text in einem Textfeld auf Ebene 0 an, sobald er vollständig geladen wurde. · BEISPIEL
Ist die Sprache des Besuchers z.B. Englisch, dann ist die Ausgabe folgende: Welcome!
4. Das PHP-Script wird wie folgt erstellt: Zuerst muss die Klasse flash.inc.php eingebunden werden, um auf ihre Funktion zugreifen zu können. Dann muss noch dafür gesorgt werden, dass die Ausgabe des Scripts nicht im Cache des Browsers gespeichert und somit eventuell bei einem weiteren Besuch wiederholt angezeigt wird. Dies übernimmt der folgende Code: ·
HINWEIS
Die Browsersprache kann von der wirklichen Sprache des Benutzers abweichen. Einige Browser senden auch mehr als einen Sprachcode mit, in diesem Fall wird der Text der Standardsprache (hier: Deutsch) ausgegeben. Um hundertprozentig die Sprache zu wählen, die der Besucher versteht, sollten Sie ihn selbst wählen lassen.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
KAPITEL 6
COOKIES MIT FLASH UND PHP
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
134
Kapitel 6
Cookie (engl.: Plätzchen, Keks) – Cookies (plural) sind Dateien, die von Anbietern im Internet auf der Festplatte des Besuchers gespeichert werden können. Sie enthalten z.B. Informationen über den letzten Besuch, die Anzahl der Besuche oder auch verschlüsselte Passwörter. Mit Flash allein lassen sich keine Cookies setzen und lesen, zusammen mit PHP jedoch lassen sich Cookies auch bei Flash-Projekten ohne weiteres einsetzen. Die Akzeptanz für Cookies ist nicht sehr groß, und sehr viele Surfer verweigern die Annahme von Cookies. An manchen Stellen jedoch sind Cookies besser als irgendeine andere Methode geeignet, um Daten von bestimmten Besuchern bzw. von jedem Besucher zu speichern, um später wieder darauf zugreifen zu können. Im folgenden Beispiel wird solch ein Einsatzgebiet gezeigt. Um das Beispiel nachvollziehen zu können, müssen Sie die Annahme von Cookies in Ihrem Browser aktiviert haben.
6.1 Beispiel: Cookies setzen / löschen Dieses Beispiel befindet sich im Ordner Applikationen\swfCookie\ auf der CD-ROM. Inhalt des PHP-Scripts: Aufbau des SWF:
Abbildung 6.1: In diesem SWF befindet sich eine Filmsequenz (circle), die der Besucher mit der Maus verschieben kann. Beim Absetzen wird die Position der Filmsequenz in einem Cookie gespeichert. Bei wiederholtem Aufruf der Seite bzw. des SWF wird die Position der Filmsequenz wieder hergestellt.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
136
Kapitel 6
Der Ablauf ist folgender: 1. Im SWF befindet sich ein Kreis, der mit der Maus auf der Bühne verschoben werden kann. 2. Wird der Kreis an einer bestimmten Stelle abgesetzt, so werden die Positionsdaten (XWert und Y-Wert) an ein PHP-Script übermittelt. 3. Dieses PHP-Script speichert die gesetzte Position in einem Cookie mit einer Gültigkeitsdauer von einem Tag. 4. Wenn der Besucher nun innerhalb eines Tages auf die Seite mit diesem SWF zurückkehrt, dann werden mit PHP die Positionsdaten aus dem Cookie ausgelesen, in Flash geladen und der Kreis an die entsprechende Stelle gesetzt. Der Aufbau der Applikation: 1. Erstellen Sie einen neuen Flash-Film. 2. Erstellen Sie auf Ebene 0 ein neues dynamisches Textfeld mit dem Namen message. In diesem Textfeld werden nachher Statusmeldungen ausgegeben. 3. Erstellen Sie ebenfalls auf Ebene 0 eine neue Filmsequenz (hier: circle). In dieser Filmsequenz erstellen Sie eine neue Schaltfläche (hier: circleButton) mit beliebiger Form (hier: Kreis). Um die Filmsequenz verschiebbar zu machen und die Positionen in einem Cookie zu speichern, müssen Sie dieser Schaltfläche folgenden Code zuweisen: on (press) { _root.message = "Verschieben..."; this.startDrag(); } on (release) { _root.message = "Speichere aktuelle Position..."; this.stopDrag(); tStamp = new Date().getTime(); pos = "xPos="+_x+"&yPos="+_y; _root.loadVariables("swfCookie.php?action=set&"+pos+"&"+tStamp); } Bei der ersten Aktion für den Button wird die Filmsequenz bei einem Klick auf den Button an die Maus angeheftet und kann verschoben werden. Wird die Maus losgelassen, so wird der Code in on (release) ausgeführt. Er entfernt die Filmsequenz von der Maus.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Cookies mit Flash und PHP
137
In der dritten Zeile wird ein Timestamp erstellt, das ist deshalb wichtig, da das PHPScript nicht aus dem Cache geladen werden darf. In der vierten Zeile wird die Position der Filmsequenz in einen String umgeformt, der dann an das PHP-Script übergeben wird. Die Aktion »Cookie setzen« (action=set) und der Timestamp werden zusätzlich noch an den URL angehängt. Die Aktion teilt dem PHP-Script mit, die Positionsdaten zu verarbeiten und in einem Cookie zu speichern. 4. Nun wird noch der Code benötigt, um die Filmsequenz an eine bestimmte (im Cookie gespeicherte) Position zu verschieben. Dazu weisen Sie der Filmsequenz folgenden Code zu: onClipEvent (load) { this.loadVariables("swfCookie.php"); } onClipEvent (data) { this._x = this.xPos; this._y = this.yPos; _root.message = this.message; } Der erste Event lädt die im Cookie gespeicherte Position in die Filmsequenz (das PHPScript extrahiert die Position aus dem Cookie und gibt sie dann für Flash lesbar aus). Der zweite Event bewegt die Filmsequenz an die entsprechende Position (wenn eine gespeichert wurde), sobald alle Daten geladen sind. 5. Erstellen Sie nun eine weitere Schaltfläche (hier: button) auf Ebene 0 und weisen Sie dieser folgenden Code zu: on (release) { message = "Cookie wird gelöscht..."; loadVariablesNum("swfCookie.php?action=del", 0); } Bei einem Klick auf diese Schaltfläche wird das PHP-Script mit der Aktion »Löschen« aufgerufen (action=del). Das PHP-Script löscht dann das gespeicherte Cookie. Beim nächsten Aufruf der Seite mit dem SWF wird die Filmsequenz dann nicht bewegt, da keine Positionsdaten gespeichert wurden. 6. Der Flash-Teil dieser Applikation ist nun beendet. Der Inhalt des PHP-Scripts ist folgender:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
138
Kapitel 6
Dann können Sie in PHP (vorausgesetzt, register_globals in der php.ini wurde auf on gesetzt) durch $c_test $HTTP_COOKIE_VARS["c_test"] auf den Inhalt der Variable zugreifen. string value Dieses Argument bezeichnet den Wert des Cookies. Der Wert wird automatisch URL-kodiert und beim Laden des Cookies wieder dekodiert. Wenn Sie das Cookie löschen wollen, so lassen Sie dieses Argument aus bzw. verwenden "", um es zu übergehen. int expire Dieses Argument ist das Verfallsdatum des Cookies. Es muss in Sekunden seit dem 1. Januar 1970 angegeben werden. Die Sekunden seit dem 1. Januar 1970 können mit der Funktion time() ermittelt werden. Beispiel: Um ein Cookie mit 24 Stunden Gültigkeit zu erstellen, muss man folgenden Code benutzen: Um dieses Argument zu übergehen, setzen Sie es einfach gleich 0 string path Mit diesem Parameter kann man den Pfad bestimmen, in dem das Cookie gültig ist. Beispiel: Dieses Cookie ist nun im Verzeichnis /test und allen Unterverzeichnissen gültig. In einem übergeordneten Verzeichnis lässt sich nicht auf den Inhalt des Cookies zugreifen. Um dieses Argument zu übergehen, setzen Sie es einfach gleich "". string domain Mit diesem Parameter kann man die Domain bestimmen, auf der das Cookie gültig ist. Beispiel: Dieses Cookie ist nur auf der Domain flashtool.de gültig. Um dieses Argument zu übergehen, setzen Sie es einfach gleich "". int secure Mit diesem Parameter kann festgelegt werden, ob die Daten des Cookies nur bei einer gesicherten Verbindung (HTTPS; siehe Kapitel 5.2) übertragen werden dürfen. Beispiel: Dieses Cookie bzw. dessen Daten würde(n) nur bei einer gesicherten Verbindung übertragen werden bzw. verfügbar sein. Um dieses Argument zu übergehen bzw. eine Übertragung immer zuzulassen, setzen Sie es einfach gleich 0. · HINWEIS
Cookies können konstruktionsbedingt erst bei der nächsten HTTP-Anforderung ausgelesen werden.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Cookies mit Flash und PHP
Tutorial
143
Beispiel: Man könnte annehmen, dass dieses Script Hallo ausgibt, dies ist aber nicht richtig. Cookies werden nur bei Beginn des Aufrufs eines Scripts geladen. In diesem Fall ist das Cookie (und damit die Variable $c_test) zum Zeitpunkt der Ausgabe noch nicht verfügbar. Wenn Sie das oben stehende Script im Browser aktualisieren, ist das Cookie verfügbar und es wird Hallo ausgegeben. Wenn Sie eine Variable sowohl in einem Cookie speichern als auch sofort darauf zugreifen wollen, dann empfiehlt sich folgender Code: In diesem Fall würde die Ausgabe sofort funktionieren. Mit der if-Abfrage wird sichergestellt, dass die Variable bei erneutem Laden bzw. Aktualisieren nicht überschrieben wird. Cookies müssen mit denselben Parametern gelöscht werden, mit denen sie gesetzt wurden. Beispiel: Der folgende Code Der Ablauf ist folgender: 1. Ein Array in PHP wird als XML mit bestimmter Struktur ausgegeben. 2. Das SWF lädt diese XML-Struktur, extrahiert ihre Elemente und gibt diese mit Hilfe einer Funktion in anderer Form in einem Textfeld aus.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
XML mit Flash und PHP
157
Der Aufbau der Applikation: 1. Erstellen Sie einen neuen Flash-Film. 2. Erstellen Sie ein dynamisches Textfeld auf Ebene 0 mit dem Namen text. Dieses Textfeld wird benötigt, um später die geladenen Daten auszugeben. 3. Fügen Sie nun im ersten Bild die zwei oben stehenden Prototypen (XMLNode.print() und XMLNode.aText()) ein. Diese werden benötigt, um die XML-Struktur umzuformen und im Textfeld auszugeben. Ich werde nicht näher auf die Prototypen eingehen, da sie mit Hilfe des Flash-Manuals und der beigefügten Kommentare ohne weiteres verstanden werden können. 4. Anschließend müssen Sie zusätzlich zu den Prototypen im ersten Bild noch folgenden Code einfügen: //~ Neues XML-Objekt erstellen myXML = new XML(); //~ XML-Dokument laden myXML.load("phpXML.php"); //~ Überprüfen, ob XML-Dokument geladen wurde myXML.onLoad = function () { //~ XML-Dokument wurde vollständig geladen if(!myXML.loaded) { text = "Es trat ein Fehler auf!"; } else { //~ XML-Dokument umstrukturiert in Textfeld ausgeben text = myXML.print(); } } Zuerst wird ein neues XML-Objekt erstellt, das nachher unsere Daten aus dem PHPScript bzw. aus dessen Ausgabe enthalten soll. Dann wird mit der XML-Funktion load() die Ausgabe des PHP-Scripts (hier: phpXML .php) in das XML-Objekt geladen. Sobald die XML-Daten vollständig geladen wurden, wird der Code, der in den Klammern der XML-Funktion onload() steht, ausgeführt. Dort wird überprüft, ob beim Laden ein Fehler aufgetreten ist. Wenn ja, wird eine Meldung in dem erstellten Textfeld ausgegeben. Wenn nein, dann wird das Parsen des XML-Objekts gestartet und die Ausgabe im Textfeld angezeigt. DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
158
Kapitel 7
5. Wenden wir uns nun dem PHP-Script zu, das die XML-Daten ausgibt. 6. Zuerst muss ein Array definiert werden. Etwa so: Zuerst wird mit der Header-Funktion dem Browser mitgeteilt, dass es sich bei den ausgegebenen Daten um XML-Daten handelt. Geben wir die Daten ohne diese Information aus, würden sie als HTML dargestellt. Mit dieser Information zeigt ein XML-kompatibler Browser (z.B. Internet Explorer) das XML-Dokument auch als solches an. DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
XML mit Flash und PHP
159
Nachdem der Header gesendet wurde, wird das Array $fruitArray durchlaufen und die Daten werden korrekt formatiert direkt an den Bildschirm ausgegeben. Wichtig ist, dass alle Daten URL-kodiert werden. XML erlaubt nur alphanumerische Zeichen und (.-_). Die Form der Ausgabe ist folgende: <Parent numofChildren="2"> In unserem konkreten Fall ist die Ausgabe dann diese: Diese Ausgabe wird von Flash geladen und dann in ein anderes Format gebracht. Selbstverständlich können Sie noch mehr Ebenen hinzufügen als nur eine. Die Ausgabe im Textfeld nach dem Parsen sieht in diesem Fall so aus: Fruechte | Frucht Frucht Frucht Frucht Frucht
Size = | Name | Name | Name | Name | Name
5 = = = = =
Zitrone | Farbe = gelb Erdbeere | Farbe = rot Heidelbeere | Farbe = blau Granny-Smith | Farbe = grün Orange | Farbe = orange
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
160
Kapitel 7
7.3 Beispiel: Daten von Flash nach PHP übergeben Dieses Beispiel befindet sich im Ordner Beispiele\XML\flashXML\ auf der CD-ROM. Aufbau des SWF:
Abbildung 7.2: In diesem SWF wird ein XML-Objekt erstellt, das auf Knopfdruck per POST als XML-Dokument an ein PHP-Script übergeben wird.
Aufbau des PHP-Scripts: Der Ablauf ist folgender: 1. In Flash bzw. dem SWF wird ein XML-Objekt erstellt. 2. Dieses XML-Objekt wird als XML-Dokument mittels POST an das PHP-Script übergeben. 3. Das PHP-Script gibt das XML-Dokument im Browser aus. Der Aufbau der Applikation: 1. Erstellen Sie einen neuen Flash-Film. 2. Erstellen Sie ein neues XML-Objekt mit folgendem Code: //~ ActionScript //~ Neues XML-Objekt erstellen myXML = new XML(); //~ DOCTYPE-Deklaration definieren myXML.docTypeDecl = "myXML="; /*~ Nun können weitere Knoten erstellt und an das XML-Objekt angeheftet werden */ Erstellen Sie danach beliebig viele Knoten, wie z.B. in unserem Beispiel (siehe oben). Wie die Struktur des XML-Dokuments aussieht, ist im Moment nicht von Bedeutung, wichtig für uns ist die DOCTYPE-Deklaration. Die DOCTYPE-Deklaration legt fest, mit welchem Variablennamen das XML-Dokument nachher in PHP angesprochen werden kann. Wenn Sie diese Definition nicht machen, kann das XML-Dokument innerhalb von PHP nicht angesprochen werden. ·
Wenn die Deklaration folgendermaßen aussieht: //~ ActionScript XMLObjekt.docTypeDecl = "XML=";
BEISPIEL
·
HINWEIS
kann man nach dem Senden des XML-Objekts an das PHP-Script mit $XML auf das Objekt zugreifen. Sie dürfen nur Zeichen verwenden, die ein Variablenname in PHP enthalten darf. Ein gültiger Variablenname in PHP beginnt mit einem Dollarzeichen ($), gefolgt von einem Buchstaben oder Unterstrich. Hinter diesem können beliebig viele Buchstaben, Zahlen oder Unterstriche in beliebiger Kombination folgen.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
162
Kapitel 7
3. Erstellen Sie nun auf Ebene 0 eine Schaltfläche und weisen Sie ihr folgenden Code zu: //~ ActionScript on (release) { myXML.send("flashXML.php", "_self"); } Dieser Code sendet das XML-Objekt bei Klick auf die Schaltfläche per POST an das PHPScript flashXML.php und öffnet es im selben Browserfenster. 4. Nun wenden wir uns dem PHP-Script zu. Das PHP-Script soll das XML-Objekt bzw. die XML-Daten auf dem Bildschirm ausgeben. Dazu benötigen wir folgenden Code: Zuerst muss eine entsprechende Kopfzeile gesendet werden, d.h. dem Browser muss mitgeteilt werden, dass XML-Daten ausgegeben werden. Dies macht die header()Funktion. Da im XML-Objekt Anführungszeichen vorhanden sind, wurden diese mit einem \ (Slash) deaktiviert (escaped). Dies muss man rückgängig machen, indem man die Slashes mit der Funktion stripslashes() aus dem String entfernt. Danach werden die XML-Daten an den Browser ausgegeben. In unserem Fall (mit dem XML-Objekt aus dem Beispiel) würde das so aussehen: <Software> Es kann sein, dass in Ihrem Browser nichts angezeigt wird. Das liegt dann daran, dass der Browser kein XML versteht. Wenn Sie aber in den Quelltext schauen, können Sie zumindest die Struktur erkennen, die Sie zuvor in Flash definiert haben. · HINWEIS
An dieser Stelle könnte man (anstatt die XML-Daten nur auszugeben) auch mit den XML-Funktionen von PHP auf diese Daten zugreifen.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
KAPITEL 8
SERVERSEITIGE ERZEUGUNG VON FLASH-INHALTEN
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
164
Kapitel 8
In diesem Kapitel wird die serverseitige Erzeugung von Flash-Inhalten bzw. SWFs angesprochen. Es werden verschiedene Möglichkeiten gezeigt, von der reinen Neuerstellung des SWF bis hin zur Manipulation von vorgefertigten Templates.
8.1 ... mit Ming und PHP Ming ist eine Bibliothek, mit der man SWF-Files erstellen kann. Eigentlich ist Ming eine C-Bibliothek, allerdings wurden einige Wrapper für populäre Sprachen geschrieben, so auch für PHP. Die aktuelle Version des Moduls für PHP ist Version 0.2a. Mit dieser Version wurden die Beispiele erstellt und getestet. Die Ming-Bibliothek (für Windows und Linux) und andere Tools befinden sich im Ordner Software und Module\Ming\ auf der CD-ROM. Mehr Informationen finden Sie unter: www.opaque.net/ming/
8.1.1 Einbindung des Ming-Moduls Damit man auf die Ming-Funktionen zugreifen kann, muss vorher die Ming-Bibliothek geladen werden. Es ist möglich, dass das Ming-Modul bereits auf manchen Servern global verfügbar ist und ohne Einbinden verwendet werden kann. Dies erfahren Sie bei Ihrem ISP bzw. dessen Administrator. Die Mehrzahl der ISPs wird jedoch das Ming-Modul nicht auf ihren Servern installiert haben, deshalb muss es von Hand dynamisch eingebunden werden. Dies geht mit folgendem Code: Die dl()-Funktion lädt das Ming-Modul dynamisch. Eventuell kann auch das dynamische Laden von Modulen (in diesem Fall das Ming-Modul) fehlschlagen, wenn in der php.ini der Schalter enable_dl auf off gestellt ist. Ob dies der Fall ist, können Sie entweder bei Ihrem ISP bzw. dessen Administrator erfahren oder einfach durch Ausprobieren feststellen. Die Bibliothek wird in diesem Fall eine Fehlermeldung generieren und die Ausführung des Scripts abbrechen.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Serverseitige Erzeugung von Flash-Inhalten
165
Wichtig ist, dass das Einbinden vor dem Zugriff auf die Funktionen des Moduls geschieht. Wird das Modul danach erst eingebunden, sind zum Zeitpunkt der Ausführung die Funktionen noch nicht verfügbar. · HINWEIS
Bibliotheken haben für Linux normalerweise die Endung .so auf NT-Servern bzw. Windows-Rechnern die Endung .dll. Beide Module finden Sie auf der CD-ROM.
Die Funktion dl() int dl (string library) Das Argument für die Funktion ist der Dateiname des Moduls. Tutorial
Zurückgegeben wird von der Funktion entweder true (wahr), wenn die Bibliothek erfolgreich geladen wurde, oder false (falsch) bei einem Fehlschlag. ·
HINWEIS
Sollte PHP im SAFE MODE laufen, so ist es nicht möglich, das Ming-Modul dynamisch einzubinden. In diesem Falle muss der Administrator des betreffenden Servers das Modul statisch einkompilieren.
Der Upload der Bibliothek muss im Binärmodus (Binary Mode) erfolgen. Der Binärmodus stellt sicher, dass die Datei nicht angetastet wird und keine dass systemspezifischen Konvertierungen (Zeilenumbrüche etc.) vorgenommen werden. Sollten Sie die Bibliothek im ASCII-Modus hochladen, so wird sie unbrauchbar.
8.1.2 Wichtige Informationen zu Ming An dieser Stelle möchte ich noch einige Informationen liefern, die Ihnen beim Umgang mit Ming eventuell von Nutzen sein können.
Ming mit Flash 4 Ming läuft ab Version 0.2a standardmäßig mit Flash 5 ActionScript. Wenn Sie Flash 4 ActionScript erzeugen wollen, so müssen Sie folgende Funktion vor der Ausgabe des SWF aufrufen: Der Aufruf dieser Funktion teilt Ming mit, den »alten« Flash 4-Compiler zu verwenden.
Ming mit PHP Version 4.1 Ming läuft momentan noch nicht mit PHP Version > 4.1.0. Dave Hayden ist momentan dabei, das Modul an PHP 4.1.0 anzupassen. Besuchen Sie www.opaque.net/ming/ für mehr Informationen.
Ming Online-Hilfe Da das Ming-Modul einige Klassen umfasst, kann im Rahmen dieses Buches unmöglich auf jede einzelne inklusive deren Funktionen eingegangen werden. Die Online-Hilfe im chm-Format befindet sich auf der beiliegenden CD-ROM. In dieser werden alle Klassen und Funktionen ausführlich erläutert (in englischer Sprache). Die Ming Online-Hilfe befindet sich unter Software und Module\Ming\ming.chm auf der CD-ROM.
Ming-Dokumentation auf php.net Unter www.php.net/manual/en/ref.ming.php finden Sie ebenfalls Informationen zum Ming-Modul und dessen Funktionen.
8.1.3 Beispiel: Leeres SWF erzeugen Dieses Beispiel befindet sich im Ordner Beispiele\Ming\emptySWF\ auf der CD-ROM. Inhalt des PHP-Scripts: Aufbau des Scripts: 1. Erstellen Sie eine neue PHP-Datei. 2. Zuerst muss das Ming-Modul eingebunden werden. Dies geschieht mit folgendem Code: Damit der Browser erkennt, dass jetzt Daten vom Typ Shockwave-Flash kommen und keine Text bzw. HTML-Daten, muss ein entsprechender HTTP-Header gesendet werden. Achten Sie darauf, dass vor der Ausgabe des Headers nichts anderes ausgegeben wird, da sonst das Senden fehlschlägt. Nachdem der Header gesendet wurde, können mit der Funktion output() die Daten des fertigen SWF ausgegeben werden.
8.1.4 Beispiel: Konvertierung eines JPEGs in ein SWF Dieses Beispiel befindet sich im Ordner Applikationen\Ming\jpg2swf\ auf der CD-ROM. HTML-Datei: jpg2swf Bitte wählen Sie eine JPEG-Datei!
PHP-Script (jpg2swf.php):
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
170
Kapitel 8
Das PHP-Script (output.php): <TITLE>jpg2swf > Zuerst wird per include()-Befehl die Datei eingebunden, die die swiPHP-Klasse enthält. Dann wird eine neue Instanz der swiPHP-Klasse erstellt. Obwohl die Klasse ohne weiteres Wissen über die Funktionsweise und die Swift-eigene Sprache benutzt werden kann, ist es eventuell doch sinnvoll, das auf der CD-ROM beigelegte Handbuch zu konsultieren, um eventuelle Fehler in der eigenen Programmierung zu vermeiden bzw. zu beheben.
Bugs und Anregungen Wenn Sie Fehler in der Klasse oder am Code entdecken und Verbesserungen vorschlagen möchten, schreiben Sie an:
[email protected].
8.2.6 Funktionsübersicht Im Folgenden finden Sie das gesamte Funktionsrepertoire der Klasse swiPHP inklusive Beispielen. swiPHP Beschreibung: Erstellt ein neues Objekt der Klasse swiPHP, die den Inhalt einer SWS-Datei und so indirekt den Inhalt einer SWF abbildet. Definition:
new swiPHP (string swiftgenLocation)
Parameter:
string swiftgenLocation Dieser Parameter zeigt den Ort an, an dem sich der Swift-Generator bzw. das cgi befindet. Der Parameter kann entweder ein absoluter URL sein oder ein relativer Pfad. Zurückgegeben wird das neue swiPHP-Objekt.
Anwendung:
• Bei relativem Pfad: • Bei absolutem URL: swiPHP->testRun() Beschreibung: Wenn diese Funktion aufgerufen wird, dann wird das SWF nicht generiert, sondern vor der Generierung gestoppt und der Inhalt der SWS-Datei angezeigt. Definition:
void swiPHP->testRun (void)
Parameter:
Keine.
Anwendung:
swiPHP->displayCopyrights()
Beschreibung: Gibt die Copyright-Informationen des Swift-Generators auf dem Bildschirm aus. Definition:
void swiPHP->displayCopyrights (void)
Parameter:
Keine.
Anwendung:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Serverseitige Erzeugung von Flash-Inhalten
183
swiPHP->setTempDir() Beschreibung: Angabe eines Verzeichnisses zum temporären Speichern der generierten SWS-Dateien. Definition:
void swiPHP->setTempDir (string path)
Parameter:
string path Ein Pfad, wo die dynamisch generierten SWS-Dateien gespeichert werden. Das PHP-Script muss Schreibrechte in diesem Ordner haben!
Anwendung:
Bei diesem Code werden die temporär angelegten SWS-Dateien im selben Verzeichnis gespeichert, in dem dieses Script liegt. swiPHP->mysqlConn()
Beschreibung: Öffnet eine Verbindung zu einem MySQL Server. ·
HINWEIS
Diese Funktion wurde nur übernommen, um das gesamte Befehlsrepertoire des Swift-Generators vollständig im Wrapper widerzuspiegeln. Da PHP MySQL standardmäßig unterstützt, empfehle ich diese Funktionen zu verwenden, falls nichts anderes möglich ist. Die Funktionen von PHP sind einerseits stabiler, als die des Swift-Generators und andererseits werden mehr Möglichkeiten geboten, auf die MySQL-Datenbank zuzugreifen.
Definition:
void swiPHP->mysqlConn (string database [, string host [, string user [, string password [, int port]]]])
Parameter:
string database Der Name der Datenbank. string host Der Server, auf dem sich die Datenbank befindet. Optionaler Parameter. Standard ist localhost.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
184
Kapitel 8
string user Ein Benutzer, der Zugriff auf die Datenbank hat. Optionaler Parameter. Standard ist die momentane User-ID (Unix/Linux). string password Das Passwort des Benutzers. Optionaler Parameter. Standard ist kein Passwort. int port Der Port für den Zugriff auf die Datenbank. Optionaler Parameter. Standard ist 3306. Anwendung:
Dieser Code öffnet eine Datenbankverbindung zur Datenbank database auf dem Server flashtool.de. swiPHP->odbcConn() Beschreibung: Öffnet eine Verbindung zu einer ODBC-Datenquelle. ·
HINWEIS
Diese Funktion wurde nur übernommen, um das gesamte Befehlsrepertoire des Swift-Generators vollständig im Wrapper widerzuspiegeln. Da PHP ODBC standardmäßig unterstützt, empfehle ich diese Funktionen zu verwenden. Die ODBC-Funktionen von PHP sind einerseits stabiler als die des Swift-Generators und andererseits werden mehr Möglichkeiten geboten, auf ODBCDatenquellen zuzugreifen.
Definition:
void swiPHP->odbcConn (string datasource [, string user [, string password]])
Parameter:
string datasource ODBC-Datenquelle. string user Ein Benutzer, der Zugriff auf die Datenquelle hat. Optionaler Parameter. Standard ist die momentane UIN (Unix/Linux).
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Serverseitige Erzeugung von Flash-Inhalten
185
string password Das Passwort des Benutzers. Optionaler Parameter. Standard ist kein Passwort. Anwendung:
Öffnet eine ODBC-Verbindung zur Datenquelle datasource. swiPHP->defineDbQuery()
Beschreibung: Setzt eine Anfrage an die Datenbank (MySQL) bzw. Datenquelle (ODBC) ab. Definition:
void swiPHP->defineDbQuery (string destinationVariable, string query)
Parameter:
string destinationVariable Die Variable, die nachher im SWF oder im SWS-Script das Ergebnis der Datenbankabfrage erhält. string query Der Anfragestring, der an die Datenbank weitergeleitet wird.
Anwendung:
Dieser Code setzt eine Anfrage (SELECT * FROM fruits) an eine Datenbank database auf dem Server flashtool.de ab.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
186
Kapitel 8
swiPHP->defineSound() Beschreibung: Ersetzt einen Sound im Template durch einen anderen. Definition:
void swiPHP->defineSound (string libraryName, string newSoundFile [, int bits])
Parameter:
string libraryName Der Symbolname des Sounds im Template, der ersetzt werden soll. string newSoundFile Der Pfad zu dem Soundfile, das anstelle des alten eingesetzt werden soll. Mögliche Sounddateien sind: · WAV (Microsoft RIFF). Restriktionen: 8 oder 16 Bit PCM; 5.5, 11, 22 oder
44 kHz. · MP3. Restriktionen: 11, 22 oder 44 kHz.
int bits Dieser Parameter bezeichnet die Kompressionsnummer der Bits. Mögliche Werte sind 2, 3, 4 oder 5. Optionaler Parameter. Defaultwert ist 4. Wenn das neue Soundfile eine mp3-Datei ist, wird dieser Parameter ignoriert. Anwendung:
Dieser Code ersetzt einen Sound mit dem Symbolnamen sound.wav im Template durch eine mp3-Datei mit dem Namen newsound.mp3. swiPHP->defineFont()
Beschreibung: Ersetzt eine Schrift im Template durch eine andere. Definition:
void swiPHP->defineFont (int tagId, string fontFileName)
Parameter:
int tagId Die ID der zu ersetzenden Schriftart. Kann im Dump abgelesen werden (siehe Kapitel 8.2.4). string fontFileName Die neue Schriftartendatei.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Serverseitige Erzeugung von Flash-Inhalten
Anwendung:
187
Dieser Code ersetzt den Font mit der ID 1 im Template durch den Font winding.ttf (WingDings). swiPHP->defineImage()
Beschreibung: Ersetzt ein Bild im Template durch ein anderes. Definition:
void swiPHP->defineImage (string oldImage, string newImageFile [, int quality [, int width [, int height [, bool keepRatio]]]])
Parameter:
string oldImage (Datei-)Name des zu ersetzenden Bildes. string newImageFile Name und Pfad der neuen Bilddatei. Mögliche Formate sind JPEG und PNG. Transparenz bei PNG-Dateien bleibt erhalten. int quality Qualität (in Prozent). Gültige Werte sind 10 bis 100. Je höher die Zahl, desto besser die Qualität. Optionaler Parameter. Defaultwert ist 50 (Prozent). int width Breite des Bildes (in Pixel). Optionaler Parameter. Standard ist die gleiche Breite wie das zu ersetzende Bild. int height Höhe des Bildes (in Pixel). Optionaler Parameter. Standard ist die gleiche Höhe wie das zu ersetzende Bild. bool keepRatio Wenn der Wert true (wahr) ist, sorgt dieser Parameter dafür, dass das Seitenverhältnis des neuen Bildes stimmt. Optionaler Parameter. Standardwert ist true, Beibehaltung des Seitenverhältnisses.
Anwendung:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
188
Kapitel 8
Dieser Code ersetzt das im Template gespeicherte Bild old.jpg durch das Bild new.png mit einer Qualität von 75 (Prozent). swiPHP->defineMovieClip() Beschreibung: Ersetzt eine Instanz einer Filmsequenz im Template durch eine in der Bibliothek definierte Filmsequenz. Definition:
void swiPHP->defineMovieClip (string instanceName, string symbolName [, string colorHex [, int balance [, int alpha]]])
Parameter:
string instanceName Der Instanzname der zu ersetzenden Filmsequenz auf der Bühne. string symbolName Der Symbolname einer anderen in der Bibliothek definierten Filmsequenz. string colorHex Ein hexadezimaler Farbwert, den die neue Filmsequenz haben soll. Optionaler Parameter. Standardwert ist Schwarz (#000000). int balance Dieser Parameter beschreibt, welche Menge an originaler Farbe/Alpha zu dem neuen Farbwert hinzugefügt wird. Mögliche Werte sind alle von 0.0 (0%) bis 1.0 (100%). Optionaler Parameter. Defaultwert ist 1.0. Der neue Farbwert errechnet sich folgendermaßen: Neuer Farbwert = alter Farbwert * Balance + Farbe int alpha Dieser Alphawert wird zu dem alten Alphawert inklusive Balance hinzugefügt. Mögliche Werte sind 0 (vollkommene Transparenz) bis 255 (keinerlei Transparenz). Optionaler Parameter. Defaultwert ist 0.
Anwendung:
Dieser Code ersetzt eine Filmsequenz auf der Bühne mit dem Instanznamen oldClip durch die Filmsequenz mit dem Symbolnamen newClip aus der Bibliothek und färbt diese weiß ein.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Serverseitige Erzeugung von Flash-Inhalten
189
swiPHP->defineTtfPath() Beschreibung: Gibt den Schriftartenordner an. Definition:
void swiPHP->defineTtfPath (string path)
Parameter:
string path Pfad zum Schriftartenordner.
Anwendung:
Dieser Code definiert das Schriftartenverzeichnis. Nach der Definition kann auf die Schriftarten in diesem Ordner zugegriffen werden, ohne deren Pfad explizit anzugeben. swiPHP->addReferer()
Beschreibung: Fügt einen erlaubten Referer hinzu. Wenn diese Funktion aufgerufen wird, dürfen nur Server von dieser Domain bzw. von diesen Domains das SWSScript ausführen. · HINWEIS
In diesem Wrapper ist diese Funktion überflüssig, wurde jedoch der Vollständigkeit halber übernommen.
Definition:
void swiPHP->addReferer (string domain)
Parameter:
string domain Eine gültige Domain.
Anwendung:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
190
Kapitel 8
Dieser Code fügt als erlaubte Referer das lokale Netzwerk, flashtool.de und jofe.de zu. Diese Funktion kann beliebig oft aufgerufen werden. Die Referer werden nicht überschrieben, sondern es wird jeweils ein weiterer hinzugefügt. swiPHP->setFrameRate() Beschreibung: Legt die Framerate des Filmes fest. Definition:
void swiPHP->setFrameRate (int rate)
Parameter:
int rate Dieser Parameter legt die Framerate (Bilder pro Sekunde) fest.
Anwendung:
Dieser Code ändert die Framerate des Templates auf 20 Bilder pro Sekunde. swiPHP->defineText()
Beschreibung: Ersetzt einen Text bzw. eine Variable im Template durch einen neuen Wert. Definition:
void swiPHP->defineText (string varName, string newValue)
Parameter:
string varName Die Variable bzw. der Platzhalter, der ersetzt werden soll. Beispiel: {platzhalter} oder {name} etc. string newValue Dieser Parameter ist der Wert, der der Variable bzw. dem Platzhalter zugeordnet wird.
Anwendung:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Serverseitige Erzeugung von Flash-Inhalten
191
Dieser Code ersetzt den Platzhalter {variable} im Template durch den Wert »Neuer Wert!«. swiPHP->defineTextByFile() Beschreibung: Ersetzt einen Text im Template durch den Inhalt einer Datei. Anmerkung: Die Datei-Funktionen in PHP sind einerseits stabiler und andererseits gibt es mehr Möglichkeiten für den Zugriff auf Dateien. Ich empfehle, die Datei-Funktionen von PHP zu verwenden. Diese Funktion wurde nur der Vollständigkeit halber in den Wrapper implementiert. Definition:
void swiPHP->defineTextByFile (string varName, string fileName)
Parameter:
string varName Dieser Parameter ist die Variable, die nachher den Inhalt der Datei enthalten soll. Dies kann entweder eine neue Variable sein, auf die zu einem späteren Zeitpunkt in der SWS-Datei zugegriffen wird, oder eine Variable, die in dem Template bereits definiert ist (z.B. {dateiinhalt}). string fileName Der Inhalt dieser (Text-)Datei wird gelesen und der Variable zugeordnet.
Anwendung:
Dieser Code liest den Inhalt der Datei datei.txt und weist ihn der Variable variable zu. swiPHP->defineTextSection()
Beschreibung: Ersetzt einen Text bzw. einen Platzhalter im Template durch bestimmte Zeilen eines mehrzeiligen Textes. ·
HINWEIS
Definition:
Mit den PHP-eigenen Funktionen lässt sich der Vorgang, den diese Funktion ausführt, sehr viel einfacher bzw. komfortabler bewerkstelligen. Diese Funktion wurde dem Wrapper nur aus Gründen der Vollständigkeit hinzugefügt.
void swiPHP->defineTextSection (string varName, string newMultiLineValue, int fromLine [, int toLine]) DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
192
Kapitel 8
Parameter:
string varName Dieser Parameter ist die Variable bzw. der Platzhalter, der nachher die Zeilen enthalten soll. string newMultiLineValue Dieser Parameter ist der mehrzeilige Text, aus dem bestimmte Zeilen extrahiert werden sollen. Dies können z.B. Daten aus einer Datenbank, Formulardaten oder auch Daten aus einer Datei sein. int fromLine Dieser Parameter legt die untere Grenze fest, ab der Daten zeilenweise extrahiert werden. int toLine Dieser Parameter legt die obere Grenze fest, bis zu der Daten zeilenweise extrahiert werden. Dieser Parameter ist optional. Wird er nicht angegeben, so werden alle Daten von fromLine bis zur letzten Zeile extrahiert.
Anwendung:
Dieser Code weist der Variable variable die Zeilen 2 bis 4 der Variable $text zu. swiPHP->substText()
Beschreibung: Ändert die Eigenschaften und den Inhalt eines Textfeldes im Template. Definition:
void swiPHP->substText (int tagId, string string [, bool carriage [, string align [, int fontId [, int height [, string colorHex [, int alpha [, decimal vspacing [, float kerning]]]]]]]])
Parameter:
int tagId Die ID des Textfeldes, in dem der Text ersetzt werden soll. Diese ID erhält man aus dem Dump. string string Der Text, der in das Textfeld eingefügt werden soll.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Serverseitige Erzeugung von Flash-Inhalten
193
bool carriage Dieser Parameter legt fest, ob nach jeder Textdefinition ein Carriage Return eingefügt werden soll. Dieser Parameter ist optional. Der Standardwert ist false (falsch), also kein Carriage return. string align Dieser Parameter legt die Textausrichtung im Textfeld fest. Erlaubte Werte sind: »left«, »center« und »right«. Dieser Parameter ist optional. Der Defaultwert ist »left«. int fontId Dieser Parameter ist die ID einer Schriftart, die die bisherige Schriftart im Textfeld ersetzen soll. Dieses Argument ist optional. Der Standardwert ist keine Änderung. int height Mit diesem Parameter kann die Schriftgröße eingestellt werden. Dieses Argument ist optional. Standardmäßig wird keine Änderung vorgenommen. string colorHex Mit diesem Argument lässt sich die Textfarbe einstellen. Mögliche Werte sind alle hexadezimalen Farbcodes. Dieses Argument ist optional. Standard ist keine Änderung der Textfarbe. int alpha Mit diesem Argument lässt sich der Alphawert der Schrift einstellen. Mögliche Werte sind 0 (komplett transparent) bis 255 (undurchsichtig). Dieses Argument ist optional. Standard ist keine Änderung. decimal vspacing Mit diesem Argument lässt sich der Zeilenabstand bei einem mehrzeiligen Text beeinflussen. Dieses Argument ist optional. Der Standardwert ist 1.0. float kerning Mit diesem Argument lässt sich der Buchstabenabstand festlegen. Der Wert bezeichnet einen Skalierungsfaktor. Dieses Argument ist optional. Der Standardwert ist 1.0. Um z.B. den doppelten Buchstabenabstand zu bekommen, müsste der Wert 2.0 genommen werden. Anwendung:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
194
Kapitel 8
Dieser Code ersetzt den Text im Textfeld mit der ID 1 durch den Text TEXT, richtet ihn rechts im Textfeld aus und ändert die Schriftgröße auf 10. swiPHP->substTextField() Beschreibung: Ändert Eigenschaften und Inhalt eines mehrzeiligen Textfeldes im Template. Definition:
void swiPHP->substTextField (int tagId, string string [, int height [, string colorHex [, int alpha [, string align]]]])
Parameter:
int tagId Dieses Argument ist die ID des Textfeldes, dessen Inhalt ersetzt werden soll. string string Dieses Argument enthält den String, der in das Textfeld eingefügt werden und den alten Text ersetzen soll. int height Mit diesem Argument lässt sich die Schriftgröße festlegen. Dieses Argument ist optional. Standard ist keine Änderung der Schriftgröße. string colorHex Mit diesem Argument lässt sich die Schriftfarbe verändern. Mögliche Werte sind alle hexadezimalen Farbwerte. Dieses Argument ist optional. Standard ist keine Änderung der Farbe. int alpha Mit diesem Argument lässt sich der Alphawert der Schrift einstellen. Mögliche Werte sind 0 (komplett transparent) bis 255 (undurchsichtig). Dieses Argument ist optional. Standard ist keine Änderung. string align Dieser Parameter legt die Textausrichtung im Textfeld fest. Erlaubte Werte sind: left, center und right. Dieser Parameter ist optional. Der Defaultwert ist left.
Anwendung:
Dieser Code fügt in das Textfeld mit der ID 2 den vierzeiligen Text »Mein Name ist Joscha« ein und stellt die Schriftgröße auf 10.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Serverseitige Erzeugung von Flash-Inhalten
195
swiPHP->defineTemplate() Beschreibung: Legt das zu benutzende Template fest. Definition:
void swiPHP->defineTemplate (string path)
Parameter:
string path Der Pfad zum Template. Kann entweder eine Generator-Vorlage (SWT) oder (notfalls) eine SWF-Datei sein.
Anwendung:
swiPHP->output()
Beschreibung: Gibt das fertige SWF direkt (an den Browser) aus. Definition:
void swiPHP->output ([mixed expiration])
Parameter:
mixed expiration Dieser Parameter bezeichnet das Gültigkeitsdatum bzw. die Gültigkeitsdauer des ausgegebenen SWFs. Mögliche Werte: · ein Datum gemäß RFC1945 (siehe www.w3.org/Protocols/rfc1945/
rfc1945) · ein Zahlenwert (Sekunden)
Anwendung:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
196
Kapitel 8
Dieser Code gibt ein SWF zurück, das genau einen Tag ab Erstellung gültig ist (3600 Sekunden [pro Stunde] mal 24 [Stunden]). swiPHP->save() Beschreibung: Speichert das fertige SWF in einer Datei. Definition:
void swiPHP->save (string pathToFile)
Parameter:
string pathToFile Der Dateiname, unter dem das fertige SWF gespeichert werden soll. Der Swift-Generator benötigt Schreibrechte in diesem Verzeichnis.
Anwendung:
8.2.7 Beispiel: Ersetzen eines Bildes durch ein anderes Dieses Beispiel befindet sich im Ordner Beispiele\swiPHP\picture\ auf der CD-ROM. Der Inhalt des SWF:
Abbildung 8.2: Dieses SWF enthält ein Bild mit dem Namen picture2.jpg, das durch ein anderes ersetzt werden soll.
Der Inhalt des PHP-Scripts: Der Ablauf des Beispiels: Beim Aufruf des PHP-Scripts wird die SWS-Datei gebildet. Als Template wird eine zuvor angefertigte Generator-Vorlage verwendet, in der sich ein Bild mit dem Namen picture2.jpg befindet. Dieses Bild wird vom Swift-Generator durch ein Bild mit dem Namen picture1.jpg ersetzt, und danach wird das fertige SWF an den Browser ausgegeben. Der Aufbau des Beispiels: 1. Erstellen Sie einen neuen Flash-Film. 2. Importieren Sie ein Bild (in diesem Fall picture2.jpg) und platzieren Sie es auf Ebene 0. 3. Exportieren Sie nun den erstellten Film als Generator-Vorlage. 4. Nun müssen Sie noch das Script erstellen. Öffnen Sie eine neue PHP-Datei und fügen Sie folgenden Code ein: Der erste Befehl legt das zu verwendende Template (die zuvor erzeugte GeneratorVorlage) fest. Die zweite Funktion ersetzt das Bild picture2.jpg in der Vorlage durch ein Bild auf dem Server (hier picture1.jpg) und stellt die Qualität des neuen Bildes auf 75 (Prozent) ein. Dann wird das fertige SWF an den Browser ausgegeben.
8.2.8 Beispiel: Ersetzen von Text und ActionScript Dieses Beispiel befindet sich im Ordner Beispiele\swiPHP\simple\ auf der CD-ROM. Aufbau des SWF:
Abbildung 8.3: Das ActionScript in diesem SWF weist dem Textfeld einen Wert zu und fügt je nach {zahl} Ausrufezeichen an den Text an.
Aufbau des PHP-Scripts: Ablauf des Beispiels: Beim Aufruf des PHP-Scripts wird eine SWS-Datei gebildet, die die Platzhalter {name} und {zahl} in der Generator-Vorlage simple.swt durch Werte ersetzt, die vom Besucher übergeben wurden. Danach wird das fertige SWF ausgegeben. Aufbau des Beispiels: 1. Erstellen Sie einen neuen Flash-Film. 2. Auf Ebene 0 fügen Sie ein dynamisches Textfeld mit dem Namen variable ein. 3. Nun fügen Sie im ersten Bild noch folgenden Code ein: //~ ActionScript variable = "Hallo, mein Name ist {name}"; for (i = 0; i < "{zahl}";i++) { variable += "!"; } Die Ausdrücke in den geschweiften Klammern werden vom Swift-Generator erkannt und können dann ersetzt werden. Es ist nicht möglich, Platzhalter zu verwenden, ohne diese in Anführungszeichen zu schreiben, da Flash Variablen mit {} nicht akzeptiert. Dies erscheint etwas komisch, aber da Flash automatisch Typen konvertiert, kann man hier (siehe oben) die Zahl auch in Anführungszeichen schreiben. 4. Nachdem der Film als Generator-Vorlage exportiert wurde, wenden wir uns dem PHPScript zu. Zuerst muss die swiPHP-Klasse eingebunden werden, um auf deren Funktionen zugreifen zu können. Dann muss ein neues Objekt der swiPHP-Klasse erstellt werden:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
200
Kapitel 8
Wenn der Benutzer als Name ($name) »Joscha« eingegeben und für die Anzahl der Ausrufezeichen ($num_exclamation) 3 gewählt hat, dann hat das fertige SWF folgendes ActionScript im ersten Bild: //~ ActionScript variable = "Hallo, mein Name ist Joscha"; for (i = 0; i < "3";i++) { variable += "!"; } Dieser Code gibt dann in dem Textfeld auf Ebene 0 Folgendes aus: Hallo, mein Name ist Joscha!!! Das HTML-Formular ist in Abbildung 8.4 zu sehen.
Abbildung 8.4: In diesem HTML-Formular gibt der Besucher seinen Namen ein und legt fest, wie viele Ausrufezeichen er hinter seinem Namen haben möchte. DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Serverseitige Erzeugung von Flash-Inhalten
201
Das Ergebnis (SWF) sehen Sie in Abbildung 8.5.
Abbildung 8.5: Nachdem das HTML-Formular abgesendet wurde, wird Obiges ausgegeben.
8.2.9 Beispiel: Anwendung aller Funktionen Dieses Beispiel befindet sich im Ordner Beispiele\swiPHP\extended\ auf der CD-ROM. Dieses Beispiel ist sehr komplex. Es werden beinahe alle Funktionen des Wrappers bzw. von Swift-Generator auf ein einziges Template angewendet. Der Aufbau des SWF:
Abbildung 8.6: Dieses Bild zeigt den Aufbau eines Templates, das als .swt-Datei (Generator-Vorlage) exportiert wird. Es erfüllt keinen bestimmten Zweck, sondern dient nur als Beispiel.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
202
Kapitel 8
Die Arbeitsfläche in Flash sieht aus, wie in Abbildung 8.7 gezeigt.
Abbildung 8.7: So sieht das Template auf der Arbeitsfläche in Flash aus. An einigen Stellen sind Platzhalter (markiert mit {platzhalter}) eingefügt.
Das »fertige« SWF ist in Abbildung 8.8 zu sehen.
Abbildung 8.8: Dies ist das Template bzw das fertige SWF nach der Bearbeitung mit dem Swift-Generator.
Die verwendeten Befehle sind alle in der Funktionsreferenz ausreichend erläutert. Dieses Beispiel soll nur noch einmal anhand eines Templates und nicht nur theoretisch die Vorgehensweise zeigen. Alle Quellen (FLA, SWT, PHP, Bilder, Sounds, Schriftarten etc.) sind auf der CD enthalten, und das Script ist ausreichend kommentiert.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Serverseitige Erzeugung von Flash-Inhalten
203
8.3 … mit der JPG2SWF-Klasse Die Klasse JPG2SWF befindet sich im Ordner Klassen\jpg2swf\ auf der CD-ROM. Die Funktionen, die dieser Klasse zu Grunde liegen, wurden von Brun Didier (Foxy) entwickelt. Er bietet die Grundfunktion php_swf_jpg() auf seiner Webseite www.foxaweb.com/ php_swf_jpg/ frei zum Download an. Diese Grundfunktion wurde von mir etwas abgeändert, in eine Klasse umgeformt und benutzerfreundlicher gemacht. Ich möchte mich an dieser Stelle bei Brun Didier bedanken, der mir freundlicherweise erlaubt, hat meine Klasse inklusive seiner (veränderten) Funktionen in diesem Buch zu beschreiben und auf CDROM beizulegen.
8.3.1 Funktionsübersicht JPG2SWF Beschreibung
Instanziiert ein neues Objekt von der JPG2SWF-Klasse, das ein zum SWF konvertiertes JPEG repräsentiert.
Definition
new JPG2SWF
Parameter
Keine.
Anwendung
JPG2SWF->load()
Beschreibung
Lädt den Inhalt eines JPEG und stellt ihn der Klasse zur Verfügung.
Definition
void JPG2SWF->load (string jpgFile)
Parameter
string jpgFile Die JPEG-Datei, die in ein SWF konvertiert werden soll. · HINWEIS
Es können nur unkomprimierte JPEG-Dateien bis zu einer Größe von ca. 400x400 Pixel konvertiert werden.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
204
Kapitel 8
Anwendung
JPG2SWF->save()
Beschreibung
Mit dieser Funktion lässt sich das konvertierte JPEG als SWF auf dem Server ablegen.
Definition
void JPG2SWF->save (string swfFile)
Parameter
string swfFile Dieser Parameter ist der Dateiname, unter dem das konvertierte JPEG gespeichert werden soll.
Anwendung
JPG2SWF->output()
Beschreibung
Mit dieser Funktion lässt sich das konvertierte SWF direkt (an den Browser) ausgeben. Dies ist z.B. auch sinnvoll, wenn das SWF nach der Konvertierung direkt per loadMovie() geladen werden soll.
Definition
void JPG2SWF->output (void)
Parameter
Keine.
Anwendung
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Serverseitige Erzeugung von Flash-Inhalten
205
8.3.2 Restriktionen • Mit dieser Klasse können nur nicht progressiv komprimierte JPEG-Dateien konvertiert werden. • Die maximale Bildgröße einer JPEG-Datei, die konvertiert werden kann beträgt ca. 400x400 Pixel. Obwohl diese Klasse stark eingeschränkt ist (sowohl dadurch, dass nur JPEG-Dateien konvertiert werden können, als auch durch Geschwindigkeit und die oben genannten Restriktionen) hat sie ganz klar einige Vorteile: • Außer PHP wird nichts benötigt, d.h. die Klasse sollte von PHP 3 ab aufwärts reibungslos funktionieren. • Die Klasse läuft auch im SAFE MODE (siehe Ming). • Die Klasse ist (auch für kommerzielle Projekte) frei erhältlich, ohne dass ein Banner eingebunden (siehe Swift-Generator) oder eine Lizenzgebühr entrichtet werden muss.
8.3.3 Beispiel Dieses Beispiel befindet sich im Ordner Beispiele\JPG2SWF\ auf der CD-ROM. Das PHP-Script: Der Aufbau des Scripts: 1. Zuerst muss die Datei mit der Klassendefinition eingebunden werden:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Serverseitige Erzeugung von Flash-Inhalten
· HINWEIS
207
Die JPG2SWF-Klasse benötigt Schreibrechte in dem Verzeichnis, in dem das konvertierte Bild gespeichert werden soll.
Dieses Script konvertiert also eine JPEG-Datei in ein SWF. Allerdings tut es dies nur einmal, bei einem erneuten Aufruf wird zu dem bereits erstellten SWF gesprungen.
8.4 Weitere Alternativen (libswf) libswf existiert nicht für Windows. Die Entwicklung von libswf wurde eingestellt, und der Quellcode ist nicht vorhanden, um libswf auf andere Systeme zu portieren. Da die Entwicklung von libswf schon vor längerer Zeit eingestellt wurde, unterstützt die Bibliothek nur Funktionen von Flash 4. Aufgrund dieser Umstände ist es nicht sinnvoll, noch weiter mit libswf zu arbeiten. Wer dennoch Informationen zu libswf haben möchte, kann hier mehr finden: www.php.net/manual/en/ref.swf.php Die Homepage des Machers von libswf finden Sie unter: reality.sgi.com/grafica/flash/
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
KAPITEL 9
FLASH MX
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
210
Kapitel 9
Seit Flash MX gibt es zur Ein- und Ausgabe von Daten einige neue Funktionen, die den Datenaustausch mit anderen Programmiersprachen (z.B. PHP) stark vereinfacht haben.
9.1 Neue Funktionen zum Datenaustausch Es gibt sehr viele neue Funktionen, und es kann an dieser Stelle unmöglich auf alle eingegangen werden. Allerdings möchte ich hier einige, die wohl häufiger benötigt werden, beschreiben (das LoadVars-Objekt und die dazugehörigen Funktionen) und näher erläutern. Weiter unten finden Sie die Eigenschaften des LoadVars-Objekts.
9.1.1 Funktionsübersicht LoadVars() Beschreibung: Mit dem LoadVars-Konstruktor kann man ein neues LoadVars-Objekt erstellen. In dieses Objekt kann man danach Daten von einem externen Script laden oder Daten aus Flash bzw. aus dem LoadVars-Objekt an ein externes Script senden. Definition:
new LoadVars (void)
Parameter:
Keine.
Anwendung:
//~ ActionScript //~ neues LoadVars-Objekt erstellen LoadVarsObjekt = new LoadVars(); Mit diesem Code wird ein neues LoadVars-Objekt mit dem Namen LoadVarsObjekt erstellt. LoadVars.load()
Beschreibung: Mit dieser Funktion können Sie Daten von einem PHP-Script in das LoadVars-Objekt laden. Bereits vorhandene Daten mit gleichem Namen werden überschrieben. Alle anderen Daten werden dem LoadVars-Objekt hinzugefügt. Die Daten müssen das Format application/x-www-form-urlencoded haben. Dies ist das gleiche Format, wie auch bei loadVariables() und loadVariablesNum() benötigt wird. Weitere Informationen zur korrekten Ausgabe finden Sie in Kapitel 3.1.3.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Flash MX
211
Definition:
void LoadVarsObjekt.load (string url)
Parameter:
string url Dieser Parameter muss entweder ein relativer oder absoluter URL zu einem Script sein, das Daten im korrekten Format (application/x-www-form-urlencoded) ausgibt.
Anwendung:
//~ ActionScript //~ neues LoadVars-Objekt erstellen LoadVarsObjekt = new LoadVars(); // ~ Ladevorgang starten LoadVarsObjekt.load("meinScript.php"); Mit diesem Code wird zuerst ein neues LoadVars-Objekt (LoadVarsObjekt) erstellt, und in dieses werden dann Daten bzw. die Ausgabe des PHP-Scripts meinScript.php geladen. Die Daten sind danach im LoadVars-Objekt verfügbar (siehe Eigenschaft LoadVars.loaded). LoadVars.send()
Beschreibung: Mit dieser Funktion können Daten bzw. Variablen, die im LoadVars-Objekt definiert wurden, an ein Script gesendet werden. ·
HINWEIS
Im LoadVars-Objekt definierte Arrays werden nicht als Array übergeben, sondern als kommaseparierte Liste. Für diese Liste gilt das gleiche Verhalten wie in Kapitel 3.2.5. Das heißt, Elemente mit nicht-numerischem Schlüssel werden nicht übergeben. Weitere Dimensionen werden der Liste angehängt etc.
Definition:
void LoadVarsObjekt.send (string url [, string fenster [, string methode]])
Parameter:
string url Dieser Parameter muss entweder ein relativer oder absoluter URL zu einem Script sein. Die Daten im LoadVars-Objekt werden an dieses Script gesendet und können dort weiterbearbeitet werden. string fenster Der Name eines bereits bestehenden oder neuen Browserfensters, in dem das Script aufgerufen werden soll. Dieser Parameter ist optional. Wenn Sie diesen Parameter nicht angeben, wird die Ausgabe des Scripts einfach übergangen.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
212
Kapitel 9
string methode Dieser Parameter bezeichnet die Übergabeart. Sie können die Daten entweder per GET (anhängen an den URL) oder per POST (in einer eigenen Kopfzeile) an das Script übertragen. Dieser Parameter ist optional, Standard ist POST. Informationen zu den Übergabemethoden finden Sie in Kapitel 3.2.3. Anwendung:
//~ ActionScript //~ neues LoadVars-Objekt erstellen LoadVarsObjekt = new LoadVars(); //~ Daten definieren LoadVarsObjekt.variable1 = "test"; //~ Array definieren array1 = new Array("Flash","PHP"); LoadVarsObjekt.array1 = array1; //~ weiteres Array definieren array2 = new Array(); array2["key"] = "wird nicht übergeben"; LoadVarsObjekt.array2 = array2; //~ Daten an meinScript.php senden LoadVarsObjekt.send("meinScript.php", "_blank", "POST"); Mit diesem Code wird ein neues LoadVars-Objekt erstellt und Daten in dieses eingefügt (eine Variable und zwei Arrays, eines davon assoziativ). Diese Daten werden per POST an das PHP-Script meinScript.php gesendet, das in einem neuen Fenster aufgerufen wird. So sieht der Inhalt von $HTTP_POST_VARS bzw. ab PHP Version 4.1.0 $_POST aus, nachdem der Inhalt des LoadVar-Objekts gesendet wurde: Array ( ( [array2] => [array1] => Flash,PHP [variable1] => test ) LoadVars.sendAndLoad()
Beschreibung: Mit dieser Funktion können Daten aus einem LoadVars-Objekt an ein Script gesendet und kann dessen Ausgabe wiederum in ein anderes LoadVarsObjekt geladen werden.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Flash MX
213
Definition:
void LoadVarsObjekt.sendAndLoad (string url, object zielObjekt [, string methode])
Parameter:
string url Dieser Parameter muss entweder ein relativer oder absoluter URL zu einem Script sein, das korrekt formatierte Daten (application/x-www-form-urlencoded) ausgibt. object zielObjekt Dieser Parameter muss ein LoadVars-Objekt bezeichnen, in das die Ausgabe des Scripts geladen wird. Bereits vorhandene, gleiche Werte in diesem Objekt werden dabei überschrieben. string methode Dieser Parameter bezeichnet die Übergabeart. Sie können die Daten entweder per GET (anhängen an den URL) oder per POST (in einer eigenen Kopfzeile) an das Script übertragen. Dieser Parameter ist optional, Standard ist POST. Informationen zu den Übergabemethoden finden Sie in Kapitel 3.2.3.
Anwendung:
//~ ActionScript //~ neues Objekt erstellen (Objekt zum Senden) LoadVarsObjekt = new LoadVars(); //~ Daten definieren LoadVarsObjekt.variable = "test"; //~ neues Objekt erstellen (Objekt zum Empfangen) LoadVarsObjekt2 = new LoadVars(); /*~ Daten an meinScript.php senden und Ausgabe in LoadVarsObjekt2 speichern */ LoadVarsObjekt.sendAndLoad("meinScript.php",LoadVarsObjekt2, "POST"); Dieser Code erstellt zwei neue LoadVars-Objekte. In einem dieser Objekte wird eine Variable definiert (LoadVarsObjekt) und der Inhalt dieses LoadVars-Objekts per POST an ein Script (meinScript.php) übermittelt. Die Ausgabe dieses Scripts wird in dem LoadVars-Objekt LoadVarsObjekt2 gespeichert. LoadVars.toString()
Beschreibung: Formt alle Elemente eines LoadVars-Objekts in einen URL-kodierten String (application/x-www-form-urlencoded) um und gibt diesen zurück. Definition:
string LoadVarsObjekt.toString (void)
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
214
Kapitel 9
Parameter:
Keine.
Anwendung:
//~ ActionScript //~ neues LoadVars-Objekt erstellen LoadVarsObjekt = new LoadVars(); //~ Daten definieren LoadVarsObjekt.menu = "Fish & Chips"; //~ LoadVars-Objekt zu String konvertieren menuString = LoadVarsObjekt.toString(); //~ String ausgeben trace(menuString); Dieser Code erstellt ein neues LoadVars-Objekt, in dem eine Variable (menu) definiert wird. Dann wird das LoadVars-Objekt zu einem URL-kodierten String umgeformt und mit trace() ausgegeben. In der Flash-Entwicklungsumgebung erscheint dann folgende Ausgabe im Variablenfenster: menu=Fish%20%26%20Chips LoadVars.getBytesLoaded()
Beschreibung: Liefert bei einer gestarteten load()- oder sendAndLoad()-Funktion die bereits in das LoadVars-Objekt geladenen Bytes. Wenn noch keine Funktion gestartet wurde, liefert diese Funktion undefined zurück. Definition:
int LoadVarsObjekt.getBytesLoaded (void)
Parameter:
Keine.
Anwendung:
//~ ActionScript //~ neues LoadVars-Objekt erstellen LoadVarsObjekt = new LoadVars(); // ~ Ladevorgang starten LoadVarsObjekt.load("meinScript.php"); /*~ Intervall setzen, in dem die geladenen Bytes überprüft werden */ setInterval(showLoadedBytes, 1); //~ Funktion zum Überprüfen der geladenen Bytes function showLoadedBytes()
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Flash MX
215
{ //~ geladene Bytes ermitteln var loadedBytes = LoadVarsObjekt.getBytesLoaded(); //~ geladene Bytes ausgeben trace(loadedBytes); } Mit diesem Code wird ein neues LoadVars-Objekt erstellt. In dieses werden dann Daten aus einem PHP-Script (meinScript.php) geladen. In einem Intervall von einer Millisekunde wird die Funktion showLoadedBytes() aufgerufen, die die Anzahl der geladenen Bytes ausgibt. LoadVars.getBytesTotal() Beschreibung: Mit dieser Funktion können Sie die Länge der Ausgabe eines Scripts (in Bytes) ermitteln, die mit der Funktion load() oder sendAndLoad()in ein LoadVars-Objekt geladen wird. Die Funktion liefert undefined zurück, wenn noch keine load()- oder sendAndLoad()-Funktion gestartet wurde oder wenn die Länge der Ausgabe (die Content-Länge; engl.: content-length) nicht ermittelt werden konnte. Andernfalls wird ein numersicher Wert (in Bytes) zurückgeliefert. ·
HINWEIS
Bei einer statischen Datei (z.B. Textdatei mit korrekt formatiertem Inhalt) wird die Content-Länge vom Server übergeben, sobald ein Zugriff auf diese Datei erfolgt. Bei einem PHP-Script ist dies etwas anders, da ja laufend Daten gesendet bzw. ausgegeben werden und zur Laufzeit die endgültige Content-Länge noch nicht feststeht. Somit gibt die Funktion getBytesLoaded() beim Laden von Daten, die von einem PHP-Script ausgegeben werden, den Wert undefined zurück. Um dies zu verhindern, muss vor der Ausgabe der Daten an den Browser die endgültige Länge ermittelt werden. Wie dies funktioniert, ist weiter unten bei der Anwendung beschrieben.
Definition:
int LoadVarsObjekt.getBytesTotal (void)
Parameter:
Keine.
Anwendung:
Dieses Beispiel befindet sich im Ordner Flash 6\loadVars\ auf der CD-ROM.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
216
Kapitel 9
Der Inhalt des SWF: · HINWEIS
Im folgenden Code wird der Event onLoad() verwendet. Weiter unten wird dieser genauer beschrieben.
//~ ActionScript //~ neues LoadVars-Objekt erstellen LoadVarsObjekt = new LoadVars(); //~ Intervall setzen _root.id = setInterval(showLoadedBytes, 1); // ~ Ladevorgang starten LoadVarsObjekt.load("meinScript.php"); //~ onLoad-Funktion zuweisen LoadVarsObjekt.onLoad = stopInterval; function showLoadedBytes() { //~ geladene Bytes ermitteln var loadedBytes = LoadVarsObjekt.getBytesLoaded(); //~ Gesamtlänge ermitteln var totalBytes = LoadVarsObjekt.getBytesTotal(); //~ Überprüfen, ob bereits etwas geladen wurde if (loadedBytes) { //~ Ausgabe der Information trace(loadedBytes+" bytes von "+totalBytes+" bytes geladen."); } //~ end if } function stopInterval() { //~ Inervall beenden clearInterval(_root.id); } Dieser Code erstellt ein neues LoadVars-Objekt. Danach wird ein Intervall festgelegt (1 ms), in dem die Funktion showLoadedBytes() aufgerufen wird. Nachdem der Ladevorgang gestartet wurde, wird dem onLoad-Event des LoadVars-Objekts die Funktion stopInterval() zugewiesen. Dies bedeutet, dass, nachdem die Ausgabe des DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Flash MX
217
Scripts meinScript.php geladen wurde, die Funktion stopInterval() ausgeführt wird, die das Intervall, das zuvor gesetzt wurde, beendet. Die Funktion showLoadedBytes() ermittelt bei jedem Aufruf die Gesamtlänge der Ausgabe und die bereits geladenen Bytes. Diese Information wird ausgegeben. Der Inhalt des PHP-Scripts (meinScript.php): Dieser Code kann dazu verwendet werden, die Länge der Ausgabe eines PHP-Scripts mitzusenden, sodass die Funktion getBytesTotal() die Länge ermitteln kann. Mit der Funktion ob_start() wird dem PHP-Interpreter vermittelt, dass jegliche Ausgabe (an den Browser) in einem Puffer zwischengespeichert werden soll (so wie die Ausgabe der for-Schleife oben). Nachdem die Ausgabe beendet ist, wird die Datenmenge (in Bytes) ermittelt. Daraufhin wird vor der Ausgabe der Daten ein Header gesendet, der die Länge der Ausgabe (in Bytes) angibt. Nachdem dies geschehen ist, wird der Puffer geleert und die Daten (an den Browser) ausgegeben.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
218
Kapitel 9
Die Funktion ob_start() void ob_start ([string output_callback])
Tutorial
ob steht für output buffering – mit dieser Funktion kann man jegliche Ausgabe des Scripts in einem Puffer speichern, auf den man später zugreifen kann. string output_callback Bei diesem Parameter können Sie eine Funktion angeben, der der Inhalt vor dem Ausführen von ob_end_flush() oder am Ende des Scripts automatisch übergeben wird. Die angegebene Funktion muss einen String als Parameter nehmen und auch einen String zurückliefern. Beispiel: Dieser Code gibt auf dem Bildschirm ollaH aus.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Flash MX
219
Die Funktion ob_get_length() string ob_get_length (void)
Tutorial
Diese Funktion gibt die Länge des Ausgabepuffers zurück. Wenn kein Puffer definiert ist, liefert diese Funktion false (falsch). Dieser Code gibt im Browser 5 aus. Der Inhalt des Puffers wird durch die Funktion ob_end_clean() geleert und deshalb nicht ausgegeben.
Die Funktion ob_end_flush() void ob_end_flush (void)
Tutorial
Diese Funktion gibt den Inhalt eines Ausgabepuffers (an den Browser) aus und leert den Puffer. Beispiel: Hallo
9.1.2 Events LoadVars.onLoad() Beschreibung: Dieser Event wird ausgeführt, sobald alle Daten bzw. die Ausgabe eines Scripts, das per load() oder sendAndLoad() geladen wird, komplett in das LoadVars-Objekt geladen wurden. Standardmäßig ist diese Methode undefined, man kann ihr aber eine eigene Funktion zuweisen, die ausgeführt wird, wenn alle Daten geladen wurden. Definition:
bool LoadVarsObjekt.onLoad (bool erfolg)
Parameter:
bool erfolg Dieser Parameter gibt an, ob die load()- oder sendAndLoad()-Funktion erfolgreich war (true) oder nicht (false).
Anwendung:
// ~ ActionScript // ~ neues LoadVars-Objekt erstellen LoadVarsObjekt = new LoadVars(); // ~ Ladevorgang starten LoadVarsObjekt.load("meinScript.php"); //~ onLoad-Funktion zuweisen LoadVarsObjekt.onLoad = end; function end(success) { if (success) { trace("Success - data loaded!"); } else { trace("An error occured!"); } }
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Flash MX
221
Mit diesem Code wird ein neues LoadVars-Objekt erstellt. In dieses werden dann Daten bzw. die Ausgabe eines PHP-Scripts (meinScript.php) geladen. Dem onLoad-Event wird die Funktion end() zugewiesen. Der Parameter success zeigt an, ob der Ladevorgang erfolgreich war. Wenn das Script z.B. nicht gefunden wird, enthält diese Variable den Wert false (falsch). ·
HINWEIS
Das Ausführen des onLoad-Events zeigt nur an, dass der Ladevorgang beendet wurde, aber nicht, ob alle benötigten Daten wirklich geladen wurden. Das heißt: Wenn das Script überhaupt nichts ausgibt und diese Ausgabe korrekt geladen wurde (paradox, nicht? ;-), dann wird der onLoad-Event trotzdem ausgeführt und die Variable success enthält trotzdem den Wert true (wahr).
9.1.3 Eigenschaften LoadVars.contentType Beschreibung: Diese Eigenschaft des LoadVars-Objekts gibt den MIME-Typ an, den die Daten bzw. Variablen im LoadVars-Objekt haben. Dieser Typ wird bei einer send()- oder sendAndLoad()-Funktion an den Server bzw. das Script übermittelt. Der Default MIME-Typ ist application/x-www-form-urlencoded. Definition:
LoadVarsObjekt.contentType = string mime
Parameter:
string mime Ein MIME-Typ.
Anwendung:
// ~ ActionScript // ~ neues LoadVars-Objekt erstellen LoadVarsObjekt = new LoadVars(); // ~ Variable definieren LoadVarsObjekt.variable1 = "test"; //~ MIME-Typ festlegen (hier derselbe wie default) LoadVarsObjekt.contentType = "application/x-www-form-urlencoded"; //~ Daten an meinScript.php senden LoadVarsObjekt.send("meinScript.php", "_self", "POST"); Daten (variable1) werden im angegebenen MIME-Format (application/xwww-form-urlencoded) an das Script meinScript.php gesendet.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
222
Kapitel 9
· HINWEIS
Nachdem der MIME-Typ definiert wurde (selbst wenn es der gleiche wie der Standard ist), dann wird auch dieser zum PHPScript versendet, als sei es eine normale Variable.
LoadVars.loaded Beschreibung: Diese Eigenschaft zeigt an, ob eine gestartete load()- oder sendAndLoad()Funktion bereits alle Daten bzw. die Ausgabe eines Scripts vollständig geladen hat. Standardmäßig ist diese Eigenschaft undefined. Sobald eine load()oder sendAndLoad()-Funktion gestartet wurde, ist ihr Wert false (falsch). Wenn alle Daten korrekt geladen wurden, ist ihr Wert true (wahr). Tritt beim Laden ein Fehler auf, bleibt der Wert der Eigenschaft false (falsch). Definition:
LoadVarsObjekt.loaded = true|false
Parameter:
Keine.
Anwendung:
// ~ ActionScript // ~ neues LoadVars-Objekt erstellen LoadVarsObjekt = new LoadVars(); //~ Hier ist die Eigenschaft undefined trace(LoadVarsObjekt.loaded); // ~ Ladevorgang starten LoadVarsObjekt.load("meinScript.php"); //~ Hier ist die Eigenschaft false (falsch) trace(LoadVarsObjekt.loaded); //~ onLoad-Funktion zuweisen LoadVarsObjekt.onLoad = show; function show() { //~ Ladevorgang wurde beendet //~ Hier ist die Eigenschaft true (wahr) trace(LoadVarsObjekt.loaded); } Die Ausgabe dieses Codes ist: undefined false true Sie sehen also, wie sich nach und nach (im Verlauf des Ladevorgangs) die loaded-Eigenschaft des LoadVars-Objekts LoadVarsObjekt verändert.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
KAPITEL 10
FLASH.INC.PHP
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
224
Kapitel 10
Die flash-Klasse ist eine statische Klasse, sie muss nicht instanziiert werden, um auf die Funktionen zugreifen zu können. Einzig und allein die Datei flash.inc.php muss in die PHPDatei, in der die Funktionen der flash-Klasse zur Verfügung stehen sollen, per include() eingebunden werden. · HINWEIS
Die folgenden Beispiele enthalten als include()-Pfad immer ./includes/flash. inc.php. Dies müssen Sie selbstverständlich an Ihre Bedürfnisse anpassen.
10.1.1 Funktionsübersicht flash::swfHeader() Beschreibung: Diese Funktion schickt eine Kopfzeile, die den Inhalt eines SWF einleitet. Sprich, wenn man on-the-fly ein SWF erzeugt oder ein JPG in ein SWF umwandelt und dieses an den Browser ausgeben möchte, braucht man eine Kopfzeile, die dem Browser sagt: Achtung, jetzt kommt der Inhalt eines SWF. Definition:
void flash::swfHeader (void)
Parameter:
Keine.
Anwendung:
flash::drawExpire()
Beschreibung: Diese Funktion muss ganz zu Beginn einer PHP-Datei, vor jeglicher anderer Ausgabe, aufgerufen werden. Sie sendet Header (Kopfzeilen) mit dem PHPScript, die dem Browser sagen, diese Datei nicht im Cache zu speichern. Dies ist sinnvoll bei Dateien, die oft aufgerufen werden, deren Inhalt sich aber laufend ändern kann. ·
HINWEIS
Viele Browser haben, was das Caching von Dateien betrifft, Bugs, deshalb ist diese Methode nicht hundertprozentig sicher. In den meisten Browsern führt dies zwar zu dem gewünschten Ergebnis, wollen Sie sich aber hundertprozentig sicher sein, so müssen Sie zusätzlich zu diesem Aufruf noch beim Aufruf aus Flash eine zufällige Zahl oder ein Timestamp an den URL anhängen. Dies ist in Kapitel 3.1.6 genau beschrieben.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
flash.inc.php
225
Definition:
void flash::drawExpire (void);
Parameter:
Keine.
Anwendung:
flash::requestArray()
Beschreibung: Wenn man nicht weiß, welche Daten an PHP übergeben werden, dann kann man diese aus den Arrays $HTTP_GET_VARS, $HTTP_POST_VARS und (wenn Cookies gesetzt wurden) aus $HTTP_COOKIE_VARS auslesen. Nach PHP Version 4.1.0 wurden diese Arrays in einem einzigen Array mit dem Namen $_REQUEST zusammengefasst. Diese Funktion gibt alle an PHP übergebenen Daten – sowohl POST, GET als auch COOKIE-Variablen – als Array zurück. Definition:
array flash::requestArray (void)
Parameter:
Keine.
Anwendung:
Dieser Code gibt alle an PHP übergebenen Variablen bzw. den Inhalt des Arrays, das alle Variablen enthält, auf dem Bildschirm aus. flash::maskPath()
Beschreibung: Da bei der Übergabe von relativen Pfadangaben nach Flash Probleme auftreten können, sollten die Pfade maskiert werden. Dies ist mit dieser Funktion möglich. Definition:
string flash::maskPath (string path, string maskChar)
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
226
Kapitel 10
Parameter:
string path Dieser Parameter ist der Pfad, der maskiert werden soll. string maskChar Dieser Parameter ist das Zeichen, das zum Maskieren verwendet werden soll. Es sollte ein Zeichen sein, das sowohl nicht in einem Pfad enthalten sein kann als auch nicht URL-kodiert werden muss. Empfehlung: *
Anwendung:
Dies gibt auf dem Bildschirm nachher aus: &myPath=**/**/path/to/SWF& Um innerhalb von Flash den Pfad wieder in die korrekte Form zu bringen, benötigt man die Funktion redoPath(). Diese ist in Kapitel 3.1.3 beschrieben. flash::echoVar()
Beschreibung: Diese Funktion gibt eine Variable in für Flash korrekt formatiertem Format aus, eventuell werden die Daten URL-kodiert. Definition:
void flash::echoVar (string varName, string varValue [, bool urlEncode])
Parameter:
string varName Dieser Parameter ist der Name, den die Variable nachher in Flash haben soll. string varValue Dieser Parameter ist der Wert der Variable. bool urlEncode Dieser Parameter ist optional, er erlaubt es, den Wert der Variable zu URLkodieren. Der Standard ist false, also keine URL-Kodierung.
Anwendung:
Dies gibt auf dem Bildschirm nachher &menue=Fish+%26+Chips& aus. Sie sehen, dass der Wert URL-kodiert wurde. Wenn Sie den dritten Parameter auf false stellen, wird der Wert nicht URL-kodiert, allerdings würde das in diesem Fall die Ausgabe verfälschen. Wenn Sie also nicht genau wissen, welche Zeichen im Wert vorhanden sein werden, ist es sicherer, ihn kodieren zu lassen. flash::echoArray() Beschreibung: Diese Funktion gibt ein Array in der Form arrayName[key]=value aus. Es kann dann in Flash mit einem Parser wieder zu einem Array zusammengesetzt werden (siehe Kapitel 3.1.4). Definition:
void flash::echoArray (string arrayName, array array [, bool urlEncode])
Parameter:
string arrayName Dieser Parameter ist der Name, den das Array nachher in Flash haben soll. array array Dieser Parameter ist ein in PHP definiertes Array, es kann sowohl ein »normales« als auch ein assoziatives Array sein. bool urlEncode Dieser Parameter ist optional. Er erlaubt es, die Werte aller Elemente zu URL-kodieren. Der Standard ist false, also keine URL-Kodierung.
Anwendung:
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
228
Kapitel 10
Dies gibt auf dem Bildschirm nachher &namen[0]=Joscha& &namen[1]=Hans& &namen[3]=J%FCrgen& aus. In Flash kann dann per Aufruf der Funktion buildArrays() das Array namen erstellt werden. Vorher muss allerdings der ActionScript-Code für diese Funktion eingefügt werden. flash::echoArrayString() Beschreibung: Diese Funktion gibt ein Array in Form einer kommaseparierten Liste aus, die nachher in Flash mit dem Befehl split() wieder zu einem Array zusammengesetzt werden kann. Definition:
void flash::echoArrayString (string varName, array array, string glue [, bool fillEmpty [, bool urlEncode]])
Parameter:
string varName Der Name, den die Variable nachher in Flash haben soll. array array Das Array, das in eine kommaseparierte Liste umgewandelt werden soll. Es können keine assoziativen und keine mehrdimensionalen Arrays übergeben werden. string glue Anhand dieses Strings werden die verschiedenen Elemente getrennt. Hier kann der String mehr als ein Zeichen haben; die split()-Funktion in Flash kann allerdings nur Strings anhand eines einzelnen Zeichens trennen. bool fillEmpty Dieser Parameter ist optional, er legt fest, ob »fehlende» Elemente in einem Array vor dem Ausgeben mit leeren Elementen gefüllt werden. Dies ist sinnvoll, wenn die Elemente ihre Plätze, die sie in PHP haben, auch in Flash behalten sollen. Der Standard ist false, es werden also keine leeren Elemente eingesetzt. bool urlEncode Dieser Parameter ist optional. Er legt fest, ob die Werte der einzelnen Elemente URL-kodiert werden. Standard ist false, also keine URL-Kodierung.
Anwendung:
Dies gibt auf dem Bildschirm &namenString=Joscha,Hans,,J%FCrgen& aus. In Flash kann nach dem Laden per //~ ActionScript namen = namenString.split(","); das Array namen erstellt werden. flash::removeCarriage() Beschreibung: Mit dieser Funktion lassen sich Texte, die unter Windows erstellt wurden und als Zeilenumbruch \r\n haben, auf einen einzelnen Zeilenumbruch (\n) reduzieren. In Flash werden die Zeichen \r\n nämlich jeweils als ein Zeilenumbruch dargestellt, somit ergäbe das einen doppelten Zeilenumbruch. Definition:
string flash::removeCarriage (string text)
Parameter:
string text Dieser Parameter enthält den Text mit dem doppelten Zeilenumbruch \r\n.
Anwendung:
Dies gibt auf dem Bildschirm &text=Hier soll nur EIN Zeilenumbruch stehen& aus.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
230
Kapitel 10
flash::dePrice() Beschreibung: Diese Funktion wandelt einen Preis, der beispielsweise aus einer Datenbank kommt und das Format 0.00 hat, in das Format um, das in Deutschland gebräuchlich ist: 0,00. ·
HINWEIS
Wenn Sie die Preise in dieses Format umwandeln, lässt sich mit ihnen in Flash nicht mehr rechnen. Sollten Sie mit den Preisen noch rechnen wollen, müssen Sie die Umwandlung direkt in Flash vornehmen.
Definition:
string flash::dePrice (int enPrice)
Parameter:
int enPrice Dieser Parameter ist der Preis im Format 0.00.
Anwendung:
gibt auf dem Bildschirm &preis=9,99& aus. flash::showZero()
Beschreibung: Diese Funktion wandelt Zahlen im Format 0 oder 0.0 in das Format 0.00 um. Dies ist sinnvoll bei Integer-Werten, die beispielsweise aus einer Datenbank kommen. Definition:
float flash::showZero (int number)
Parameter:
int number Eine Zahl im Format 0 oder 0.0
Anwendung:
Dies gibt auf dem Bildschirm &preis=0.00& aus. flash::extRequest() Beschreibung: Diese Funktion »simuliert einen Proxy« – normalerweise lässt sich aus Flash nicht auf Scripts zugreifen, die auf anderen Domains liegen (siehe Kapitel 5.1). Mit dieser Funktion ist es sowohl möglich, auf Scripts und Dateien von anderen Servern zuzugreifen, als auch die POST-, bzw. GET-Variablen weiterzuleiten. Definition:
void flash::extRequest (string url)
Parameter:
string url Der URL des extern liegenden Scripts. Dem URL können bereits Variablen angehängt sein.
Anwendung:
Dieser Code überträgt alle Variablen, die per POST oder GET an dieses Script übertragen wurden, und gibt auf dem Bildschirm die Ausgabe des Scripts www.extServer.de/script.php aus.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
ANHANG
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
234
Anhang
A.1 Boni In diesem Kapitel finden Sie Applikationen und Beispiele, die teilweise noch nicht ganz fertig sind oder zu denen keine weitere Beschreibung vorhanden ist als die Quelldateien und/oder eine kurze Befehlsreferenz. Sie dürfen diese Beispiele in Ihren Projekten einsetzen oder aber einfach nur ansehen, um eventuell noch etwas mehr über den Umgang mit Flash und PHP zu erfahren.
A.1.1 flaLittleShop (Onlineshop) Diese Applikation befindet sich im Ordner BONUS\flaLittleShop\ auf der CD-ROM.
Abbildung A.1: Der flaLitteShop in Aktion
In diesem Kapitel werde ich auf den auf der CD-ROM beiliegenden Onlineshop in Flash (flaLittleShop) eingehen. Obwohl der Shop speziell für dieses Buch als Beispiel angefertigt wurde, ist der Aufbau doch recht komplex, deshalb werde ich nur auf die relevanten Stellen eingehen (PHP und Flash). Die PHP- und ActionScript-Programmierung selbst wird in diesem Kapitel nicht erläutert. ·
HINWEIS
Zur Vereinfachung des Beispiels enthält dieser Shop weder Error-Handling, noch verwendet er Session-IDs, ebenfalls werden die Bestelldaten nicht in der Datenbank gespeichert, sondern direkt an den »Verkäufer« per E-Mail gesendet. Obwohl es theoretisch möglich wäre, sollten Sie den Shop in dieser Form nicht zum Verkauf von Waren einsetzen, er dient lediglich als Beispiel und ist in punkto Sicherheit nicht weit genug entwickelt worden.
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Anhang
235
Voraussetzungen • MySQL (www.mysql.com) • PHP 4 • Die JPG2SWF-Klasse (siehe Kapitel 8.3). • Die flash.inc.php Klasse (siehe Kapitel 10). • Optional phpMyAdmin (siehe Kapitel 12.3).
Installation 1. Importieren der Daten Zuerst müssen die Produktdaten in der Datei products.sql in die MySQL-Datenbank importiert werden (Sie können selbstverständlich auch Ihre eigenen Produktdaten verwenden). Ich empfehle phpMyAdmin für den Import (phpmyadmin.sourceforge.net). 2. Anpassung der Konfiguration Nachdem die Daten importiert wurden, öffnen Sie die Datei config_vars.inc.php im Verzeichnis includes. Passen Sie die Zugangsdaten für die MySQL-Datenbank entsprechend an. 3. Rechte setzen Da die SWF-Dateien von der JPG2SWF-Klasse automatisch aus den JPEGS erstellt werden, müssen Sie dem Script im Verzeichnis pictures/swf Schreibrechte geben. 4. php.ini anpassen (nur Windows) Das Script order.php verwendet die mail()-Funktion von PHP. Unter Windows können Sie diese Funktion nur einsetzen, wenn Sie die php.ini-Datei entsprechend anpassen (liegt im Windows-Vezeichnis). Ändern Sie folgende Zeilen: ;----8output() 204 JPG2SWF->save() 204 L LAMP 15 Installation 15 Leerzeichen 24 Lerdorf, Rasmus 14 libswf 177, 207 loadVariables() 20 loadVariablesNum() 19 M Maguma PHP4EE Studio light 241 Maskierung 27 DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Methoden, GET, POST 52 Ming 164 mit Flash 4 165 -Modul 164 Online-Hilfe 166 Multiplayer-Applikation 236 MySQL 76 Ressourcen 239 O ob_end_flush() 219 ob_get_length() 219 ob_start() 218 onClipEvent(data) 44 Onlineshop 234 output buffering 218 P parse_str() 63 Parser 33 PHP 14 -Entwicklungsumgebungen 241 Installation 15 Ressourcen 239 SAFE MODE 16 Session-Funktionen 110 und Swift-Generator 177 Verarbeitung übergebener Daten 65 PHP Coder 242 PHP Edit 242 POST 53 preg_split() 58 Proxy 39 -Scripting 100 S SAFE MODE 50 Scripts, von anderen Servern 100 session_destroy() 119 session_register() 116 session_start() 114 Sessions, mit Flash und PHP 107 set_time_limit() 49 setcookie() 141 Sonderzeichen, ASCII-Werte 27
Index
Sprachauswahl, automatische mit PHP 128 SQL (Structured Query Language) 76 SSL, mit Flash 101 Statistik in Flash 237 Strings, Manipulation 69 strrev() 70 SWF (ShockWave Flash) 19 SWF2PNG 238 swFrog 236 swiffSQL 77 arbeiten mit 84 close() 83 query() 81 setPermissions() 80 Zugriff beschränken 79 swiffSQL() 79 Swift-Generator 177 swiPHP 181 swiPHP->addReferer() 189 swiPHP->defineDbQuery() 185 swiPHP->defineFont() 186 swiPHP->defineImage() 187 swiPHP->defineMovieClip() 188 swiPHP->defineSound() 186 swiPHP->defineTemplate() 195 swiPHP->defineText() 190 swiPHP->defineTextByFile() 191 swiPHP->defineTextSection() 191 swiPHP->defineTtfPath() 189 swiPHP->displayCopyrights() 182 swiPHP->mysqlConn() 183 swiPHP->odbcConn() 184 swiPHP->output() 195 swiPHP->save() 196 swiPHP->setFrameRate() 190 swiPHP->setTempDir() 183 swiPHP->substText() 192 swiPHP->substTextField() 194 swiPHP->testRun() 182
247
swiPHP-Wrapper 180 SWT-Dateien Dumps 179 erstellen 178 T Tags 35 U Übergabe, und <EMBED>-Tag 35 urlencode() 25 V Variablen 55 Versenden verhindern 55 von Flash an PHP übergeben 50 von PHP in Flash laden 18 Verzögerungen 43 if-Abfrage 45 onClipEvent(data) 44 set_time_limit() 49 W WAMP 15 Installation 15 Wrapper 180 X XML 148 -Daten von Flash nach PHP 160 -Daten von PHP nach Flash 154 XML.docTypeDecl 153 XML.load() 148 XML.loaded 152 XML.onLoad() 151 XML.send() 149 XML.sendAndLoad() 150
DYNAMISCHE WEBSEITEN MIT FLASH UND PHP
Copyright Daten, Texte, Design und Grafiken dieses eBooks, sowie die eventuell angebotenen eBook-Zusatzdaten sind urheberrechtlich geschützt. Dieses eBook stellen wir lediglich als Einzelplatz-Lizenz zur Verfügung! Jede andere Verwendung dieses eBooks und zugehöriger Materialien und Informationen, einschliesslich der Reproduktion, der Weitergabe, des Weitervertriebs, der Plazierung auf anderen Websites, der Veränderung und der Veröffentlichung bedarf der schriftlichen Genehmigung des Verlags. Bei Fragen zu diesem Thema wenden Sie sich bitte an: mailto:
[email protected] Zusatzdaten Möglicherweise liegt dem gedruckten Buch eine CD-ROM mit Zusatzdaten bei. Die Zurverfügungstellung dieser Daten auf der Website ist eine freiwillige Leistung des Verlags. Der Rechtsweg ist ausgeschlossen.
Hinweis Dieses und andere eBooks können Sie rund um die Uhr und legal auf unserer Website
(http://www.informit.de) herunterladen