Zurück   Flashforum > Flash und Server > PHP und MySQL

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 29-05-2011, 14:26   #1 (permalink)
Neuer User
 
Registriert seit: May 2011
Beiträge: 10
Question Flex Webanwendung -> mySQL Backend Anbindung

Hallo,

ich beschäftige mich erst seit zwei Wochen mit Flex. Ich möchte gerne eine Webanwendung erstellen, mit der ich Daten aus einer mySQL-Datenbank lesen und auch schreiben kann.

Nach längeren suchen bin ich auf das folgende Videotutorial gestoßen: Create an Admin MySQL Backend in less than 5 minutes with Flex 4 , PHP and Zend AMF | Rima's Tech Blog . Das Video beschreibt wie man mit Hilfe von XAMPP, Zend Framework und den in Flex 4.5 eingebauten Wizards eine solche einfache Webanwendung erstellt.

In diesem Video wird zu 100% das aufgebaut was ich benötige. Ich habe auch soweit alles durchgeführt wie es beschrieben wird. Leider funktioniert die Webanwendung nicht wie im Video.

Folgender Aufbau:
- ApacheFriends XAMPP (Basispaket) version 1.7.4
installiert in C:\xampp
- Zend Framework 1.11.6 Release (r24018)
enpackt nach C:\xampp\htdocs\ZendFramework
- Adobe® Flash® Builder™ 4.5 (Testlizenz)

Per phpMyAdmin habe ich eine einfache Datenbank (name: flexSQL) die eine Tabelle besitzt (name: testtabelle) und in dieser sind die die drei Einträge "ID", "Vorname" und "Nachname" befinden. Der Eintrag "ID" zählt automatisch hoch und ist der Primärschlüssel.

Das durchlaufen der Wizards in Flex läuft wie im Video gezeigt sauber durch. Im Serviceordner des Projektes befindet sich jetzt eine testtabelleService.php und unter Daten/Dienste sind die wichtigsten funktionen erstellt worden.
Ich kann auch wie vorgegeben ein Datagrid erstellen und auch das Create Formular generieren mit dem neue Einträge in die Datenbank gemacht werden können.

Beim Ausführen der Anwendung wird das DataGrid aktualisiert und auch die richtigen Daten aus der Datenbank eingelesen (Hatte testhalber zwei Einträge gemacht).

Jetzt zum Problem! Und zwar funktioniert das generieren von neuen Einträgen nicht. Ich kann den Creatbutton drücken so oft ich möchte, da passiert nichts!
Ich habe auch ein Delete- und ein Updateformular erstellen lassen. Bei diesen beiden wird zwar das DataGrid akualisiert aber änderungen in der mySQL-Datenbank kommen nicht an.

Wenn ich die Methoden unter Flex teste funktioniert alles reibungslos. Ich kann Einträge erzeugen löschen und modifizieren und alles überträgt sich auf die Datenbank.

Wo ist da jetzt das Problem? Ist der Code den Flex automatisch erzeugt fehlerhaft oder habe ich eine wichtige Kleinigkeit vergessen?


Hier einmal der generiert PHP-Code
PHP-Code:
<?php

/**
 *  README for sample service
 *
 *  This generated sample service contains functions that illustrate typical service operations.
 *  Use these functions as a starting point for creating your own service implementation. Modify the 
 *  function signatures, references to the database, and implementation according to your needs. 
 *  Delete the functions that you do not use.
 *
 *  Save your changes and return to Flash Builder. In Flash Builder Data/Services View, refresh 
 *  the service. Then drag service operations onto user interface components in Design View. For 
 *  example, drag the getAllItems() operation onto a DataGrid.
 *  
 *  This code is for prototyping only.
 *  
 *  Authenticate the user prior to allowing them to call these methods. You can find more 
 *  information at http://www.adobe.com/go/flex_security
 *
 */
class TesttabelleService {

    var 
$username "root";
    var 
$password "";
    var 
$server "localhost";
    var 
$port "3306";
    var 
$databasename "flexSQL";
    var 
$tablename "testtabelle";

    var 
$connection;

    
/**
     * The constructor initializes the connection to database. Everytime a request is 
     * received by Zend AMF, an instance of the service class is created and then the
     * requested method is invoked.
     */
    
public function __construct() {
          
$this->connection mysqli_connect(
                                  
$this->server,  
                                  
$this->username,  
                                  
$this->password
                                  
$this->databasename,
                                  
$this->port
                              
);

        
$this->throwExceptionOnError($this->connection);
    }

    
/**
     * Returns all the rows from the table.
     *
     * Add authroization or any logical checks for secure access to your data 
     *
     * @return array
     */
    
public function getAllTesttabelle() {

        
$stmt mysqli_prepare($this->connection"SELECT * FROM $this->tablename");        
        
$this->throwExceptionOnError();
        
        
mysqli_stmt_execute($stmt);
        
$this->throwExceptionOnError();
        
        
$rows = array();
        
        
mysqli_stmt_bind_result($stmt$row->ID$row->Vorname$row->Nachname);
        
        while (
mysqli_stmt_fetch($stmt)) {
          
$rows[] = $row;
          
$row = new stdClass();
          
mysqli_stmt_bind_result($stmt$row->ID$row->Vorname$row->Nachname);
        }
        
        
mysqli_stmt_free_result($stmt);
        
mysqli_close($this->connection);
    
        return 
$rows;
    }

    
/**
     * Returns the item corresponding to the value specified for the primary key.
     *
     * Add authorization or any logical checks for secure access to your data 
     *
     * 
     * @return stdClass
     */
    
public function getTesttabelleByID($itemID) {
        
        
$stmt mysqli_prepare($this->connection"SELECT * FROM $this->tablename where ID=?");
        
$this->throwExceptionOnError();
        
        
mysqli_stmt_bind_param($stmt'i'$itemID);        
        
$this->throwExceptionOnError();
        
        
mysqli_stmt_execute($stmt);
        
$this->throwExceptionOnError();
        
        
mysqli_stmt_bind_result($stmt$row->ID$row->Vorname$row->Nachname);
        
        if(
mysqli_stmt_fetch($stmt)) {
          return 
$row;
        } else {
          return 
null;
        }
    }

    
/**
     * Returns the item corresponding to the value specified for the primary key.
     *
     * Add authorization or any logical checks for secure access to your data 
     *
     * 
     * @return stdClass
     */
    
public function createTesttabelle($item) {

        
$stmt mysqli_prepare($this->connection"INSERT INTO $this->tablename (Vorname, Nachname) VALUES (?, ?)");
        
$this->throwExceptionOnError();

        
mysqli_stmt_bind_param($stmt'ss'$item->Vorname$item->Nachname);
        
$this->throwExceptionOnError();

        
mysqli_stmt_execute($stmt);        
        
$this->throwExceptionOnError();

        
$autoid mysqli_stmt_insert_id($stmt);

        
mysqli_stmt_free_result($stmt);        
        
mysqli_close($this->connection);

        return 
$autoid;
    }

    
/**
     * Updates the passed item in the table.
     *
     * Add authorization or any logical checks for secure access to your data 
     *
     * @param stdClass $item
     * @return void
     */
    
public function updateTesttabelle($item) {
    
        
$stmt mysqli_prepare($this->connection"UPDATE $this->tablename SET Vorname=?, Nachname=? WHERE ID=?");        
        
$this->throwExceptionOnError();
        
        
mysqli_stmt_bind_param($stmt'ssi'$item->Vorname$item->Nachname$item->ID);        
        
$this->throwExceptionOnError();

        
mysqli_stmt_execute($stmt);        
        
$this->throwExceptionOnError();
        
        
mysqli_stmt_free_result($stmt);        
        
mysqli_close($this->connection);
    }

    
/**
     * Deletes the item corresponding to the passed primary key value from 
     * the table.
     *
     * Add authorization or any logical checks for secure access to your data 
     *
     * 
     * @return void
     */
    
public function deleteTesttabelle($itemID) {
                
        
$stmt mysqli_prepare($this->connection"DELETE FROM $this->tablename WHERE ID = ?");
        
$this->throwExceptionOnError();
        
        
mysqli_stmt_bind_param($stmt'i'$itemID);
        
mysqli_stmt_execute($stmt);
        
$this->throwExceptionOnError();
        
        
mysqli_stmt_free_result($stmt);        
        
mysqli_close($this->connection);
    }


    
/**
     * Returns the number of rows in the table.
     *
     * Add authorization or any logical checks for secure access to your data 
     *
     * 
     */
    
public function count() {
        
$stmt mysqli_prepare($this->connection"SELECT COUNT(*) AS COUNT FROM $this->tablename");
        
$this->throwExceptionOnError();

        
mysqli_stmt_execute($stmt);
        
$this->throwExceptionOnError();
        
        
mysqli_stmt_bind_result($stmt$rec_count);
        
$this->throwExceptionOnError();
        
        
mysqli_stmt_fetch($stmt);
        
$this->throwExceptionOnError();
        
        
mysqli_stmt_free_result($stmt);
        
mysqli_close($this->connection);
        
        return 
$rec_count;
    }


    
/**
     * Returns $numItems rows starting from the $startIndex row from the 
     * table.
     *
     * Add authorization or any logical checks for secure access to your data 
     *
     * 
     * 
     * @return array
     */
    
public function getTesttabelle_paged($startIndex$numItems) {
        
        
$stmt mysqli_prepare($this->connection"SELECT * FROM $this->tablename LIMIT ?, ?");
        
$this->throwExceptionOnError();
        
        
mysqli_stmt_bind_param($stmt'ii'$startIndex$numItems);
        
mysqli_stmt_execute($stmt);
        
$this->throwExceptionOnError();
        
        
$rows = array();
        
        
mysqli_stmt_bind_result($stmt$row->ID$row->Vorname$row->Nachname);
        
        while (
mysqli_stmt_fetch($stmt)) {
          
$rows[] = $row;
          
$row = new stdClass();
          
mysqli_stmt_bind_result($stmt$row->ID$row->Vorname$row->Nachname);
        }
        
        
mysqli_stmt_free_result($stmt);        
        
mysqli_close($this->connection);
        
        return 
$rows;
    }
    
    
    
/**
     * Utility function to throw an exception if an error occurs 
     * while running a mysql command.
     */
    
private function throwExceptionOnError($link null) {
        if(
$link == null) {
            
$link $this->connection;
        }
        if(
mysqli_error($link)) {
            
$msg mysqli_errno($link) . ": " mysqli_error($link);
            throw new 
Exception('MySQL Error - '$msg);
        }        
    }
}

?>

Hier der Flex-Code nur mit DataGrid und Create-Formular
Code:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx"
			   xmlns:testtabelleservice="services.testtabelleservice.*"
			   xmlns:valueObjects="valueObjects.*"
			   minWidth="955" minHeight="600">
	<fx:Script>
		<![CDATA[
			import mx.controls.Alert;
			import mx.events.FlexEvent;
			
			protected function dataGrid_creationCompleteHandler(event:FlexEvent):void
			{
				getAllTesttabelleResult.token = testtabelleService.getAllTesttabelle();
			}
			
			
			protected function button_clickHandler(event:MouseEvent):void
			{
				var testtabelle2:Testtabelle = new Testtabelle();
				testtabelle2.ID = parseInt(iDTextInput.text);
				testtabelle2.Vorname = vornameTextInput.text;
				testtabelle2.Nachname = nachnameTextInput.text;
				
				createTesttabelleResult.token = testtabelleService.createTesttabelle(testtabelle2);
			}
			
		]]>
	</fx:Script>
	<fx:Declarations>
		<s:CallResponder id="getAllTesttabelleResult"/>
		<testtabelleservice:TesttabelleService id="testtabelleService"
											   fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
											   showBusyCursor="true"/>
		<valueObjects:Testtabelle id="testtabelle"/>
		<s:CallResponder id="createTesttabelleResult"/>
		<!-- Platzieren Sie nichtvisuelle Elemente (z. B. Dienste, Wertobjekte) hier -->
	</fx:Declarations>
	<s:DataGrid id="dataGrid" x="19" y="10"
				creationComplete="dataGrid_creationCompleteHandler(event)" requestedRowCount="4">
		<s:columns>
			<s:ArrayList>
				<s:GridColumn dataField="ID" headerText="ID"></s:GridColumn>
				<s:GridColumn dataField="Vorname" headerText="Vorname"></s:GridColumn>
				<s:GridColumn dataField="Nachname" headerText="Nachname"></s:GridColumn>
			</s:ArrayList>
		</s:columns>
		<s:typicalItem>
			<fx:Object ID="ID1" Nachname="Nachname1" Vorname="Vorname1"></fx:Object>
		</s:typicalItem>
		<s:AsyncListView list="{getAllTesttabelleResult.lastResult}"/>
	</s:DataGrid>
	<s:Form x="10" y="147" defaultButton="{button}">
		<s:FormItem label="ID">
			<s:TextInput id="iDTextInput" text="{testtabelle.ID}"/>
		</s:FormItem>
		<s:FormItem label="Vorname">
			<s:TextInput id="vornameTextInput" text="{testtabelle.Vorname}"/>
		</s:FormItem>
		<s:FormItem label="Nachname">
			<s:TextInput id="nachnameTextInput" text="{testtabelle.Nachname}"/>
		</s:FormItem>
		<s:Button id="button" label="CreateTesttabelle" click="button_clickHandler(event)"/>
	</s:Form>
	<s:Form x="11" y="347">
		<s:FormItem label="CreateTesttabelle">
			<s:TextInput id="createTesttabelleTextInput"
						 text="{createTesttabelleResult.lastResult as int}"/>
		</s:FormItem>
	</s:Form>
</s:Application>
CyTrond ist offline   Mit Zitat antworten
Alt 29-05-2011, 14:51   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.147
Funktioniert denn das Erzeugen, wenn du eine Generierung händisch anstößt?
Omega Psi ist offline   Mit Zitat antworten
Alt 29-05-2011, 15:18   #3 (permalink)
Neuer User
 
Registriert seit: May 2011
Beiträge: 10
Eine wichtige Information wird aus dem ersten Post wohl nicht ganz klar. Ich beschäftige mich generell erst zwei Wochen mit jeder Softwarekomponente die ich aufgezählt habe

Das ist jetzt wohl auch der Grund, warum ich nicht genau verstehe was du mit "eine Generierung händisch anstößt" meinst. Meinst du in Flex oder PHP oder mit phpMyAdmin?

Wenn ich in Flex unter "Daten/Dienste" rechtsklick auf eine (von Flex automatisch generierten) Funktionen mache und dort "Methode testen..." wähle, kann ich so alles in meiner Datenbank ändern. Dort funktioniert alles.

Ich weiß nicht, ob das deine Frage beantworten konnte.
CyTrond ist offline   Mit Zitat antworten
Alt 31-05-2011, 19:23   #4 (permalink)
Neuer User
 
Registriert seit: May 2011
Beiträge: 10
Gut hat sich erledigt!

Ich hab mir Flash Builder 4.5 for PHP geladen und dazu ein gutes Beispiel wie eine mySQL-Datenbank angebunden wird. Das kann ich als Basis für meine Anwendung nehmen.
CyTrond ist offline   Mit Zitat antworten
Alt 26-01-2012, 19:09   #5 (permalink)
Schwarzbunt
 
Registriert seit: Apr 2003
Ort: Punxsutawney
Beiträge: 256
neue Erkenntnisse?

Liebe Flasher und Flexer,

der Thread ist zwar schon etwas älter, aber ich habe gerade exakt das gleiche Problem und bin via google hier gelandet (und immer wieder beeindruckt, für wieviele Themen außerhalb von Flash dies hier die erste Adresse ist ).
Auch ich habe ein Video-Tutorial "nachgebaut" und dabei die wizards vom Flash-Builder (4.5.1) verwendet. Alle lesenden Zugriffe funktionieren damit, nur sobald etwas in die Datenbank geschrieben werden soll, passiert gar nichts.
Das sollte doch eigentlich auch mit der "normalen" Version funktionieren, und nicht nur mit der "Flash Builder 4.5 for PHP", oder?
Ich poste gern noch meinen (automatisch generierten) code, allerdings unterscheidet der sich nicht großartig von dem des Threaderstellers.

Ach ja: Wenn ich die Funktion im php-script "createXXX($item)" von anderswo aufrufe (z.B. ein anderes php-skript), wird ein Eintrag in die DB geschrieben - am php-Teil scheint es also nicht zu liegen.

Wäre toll, wenn hier jemand Rat weiß - das würde mir bei meinem aktuellen Projekt sehr helfen.

Gruß und danke im voraus,
falk07
__________________
Wer das hier gelesen hat, braucht sich vor nichts mehr zu fürchten.

Geändert von falk07 (26-01-2012 um 19:12 Uhr)
falk07 ist offline   Mit Zitat antworten
Alt 26-01-2012, 21:34   #6 (permalink)
Inventar
 
Benutzerbild von Nightflyer
 
Registriert seit: Jul 2002
Beiträge: 6.882
Das Problem von Tutorials im Allgemeinen ist immer dass sie ab einem gewissen Zeitpunkt nicht mehr aktuell sind. Wird irgendwo etwas geändert funktioniert das Teil nicht mehr und du musst den Fehler suchen - ohne grundlegendes Verständnis was die Software macht natürlich ein schwieriges Unterfangen.

Debugging:
- Mit dem Firebug ( Addon für Firefox ) kannst du schön sehen welche Daten dein Flashscript / Flex / Javascript an deinen Server ( deine PHP ) sendet und ob und was dein Server zurück sendet. Hier als erstes prüfen ob die Informationen Sinn machen.
__________________
(\__/)
(='.'=)
(")_(")
Nightflyer ist offline   Mit Zitat antworten
Alt 27-01-2012, 10:59   #7 (permalink)
Schwarzbunt
 
Registriert seit: Apr 2003
Ort: Punxsutawney
Beiträge: 256
Ja, das Tutorial ist sicher schon alt, aber die Wizard-Funktionen zur Datenanbindung stehen in meiner IDE ja weiterhin zur Verfügung (auch in der aktuellen Version 4.6, wie ich jetzt festgestellt habe - das Ergebnis bleibt aber das gleiche).

Der Einsatz von Firebug (danke für den Tipp!) zeigt mir, dass gar keine Kommunikation mit dem PHP-Script stattfindet, im Gegensatz zu lesenden Zugriffen - da wird auf eine Datei namens "gateway.php" zugegriffen. Etwas konkreter:
Code:
protected function button_clickHandler(event:MouseEvent):void
			{
				var style2:Style = new Style();
				style2.style_id = parseInt(style_idTextInput.text);
				style2.attribute_set_id = parseInt(attribute_set_idTextInput.text);
				style2.status_id = parseInt(status_idTextInput.text);
				style2.manage_stock = manage_stockTextInput.text;
				style2.price = parseFloat(priceTextInput.text);
				style2.style_name = style_nameTextInput.text;
				style2.weight = parseFloat(weightTextInput.text);
				style2.tax_class_id = parseInt(tax_class_idTextInput.text);
				
								
				createStyleResult.token = styleService.createStyle(style2);
				
			}
			
			
			protected function button2_clickHandler(event:MouseEvent):void
			{
				getStyleByIDResult.token = styleService.getStyleByID(parseInt(itemIDTextInput.text));
			}
Der button2_clickHandler macht was er soll, der erste nicht. Im Debugger kann ich sehen, dass das style2-Objekt mit den richtigen Werten gefüllt ist, nur die Anweisung in der letzten Zeile (styleService.createStyle(style2)) wird aus irgendeinem Grund nicht oder nicht richtig ausgeführt.

Aber du hast schon recht: Das Zusammenspiel zwischen Applikation, Services, Frameworks, etc. ist mir beim Flashbuilder eher unklar... ich hatte eher gehofft, dass jemand das (scheinbar öfter auftretende) Problem bereits mit einem "Du musst nur bei XYZ ein Häkchen setzen" gelöst hat

Gruß,
falk07
__________________
Wer das hier gelesen hat, braucht sich vor nichts mehr zu fürchten.
falk07 ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
mysql php zend framework

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Flex-Appl. mit SOAP-Anbindung läuft nicht auf Tomcat reckert Flex allgemein 3 23-06-2009 15:36
Flex Backend Systeme rgbg5 Flex allgemein 1 08-03-2007 10:07
MYSQL anbindung MyWayMyLife Flex allgemein 10 01-12-2006 15:23
MySQL-Anbindung in Flash Striker Flash MX 2004 1 19-08-2005 10:55
php turnierscript mit MySQL anbindung Acrylic0815 PHP und MySQL 1 19-01-2005 09:34


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:14 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele