FLEX on PHP , RemoteObject 實作範例 [使用者登入]
前幾篇我們分享了 FLEX on PHP 的 remoting 的用法,我們可以正確無誤的從 SERVER 端取得處理過的字串,也可以正常的取得資料庫的資料,今天 逮灣郎 在 FLEX on PHP , use AMFPHP 取得資料庫資料 發問,提到雖然資料拿的到,資料庫搜得到,但是要怎麼整合呢,沒有個實例總是讓人看得霧颯颯,既然提問了,我也是 逮灣郎 ,除了救棒球還要救資訊,那就放出一個使用者[新增][查詢][刪除]的綜合使用範例吧,中間還穿插一個傳統 AJAX 愛用的帳號驗證寫法供大家參考。
這次的範例一次就把使用者登入,查詢所有使用者資料,以及新增使用者一口氣做完了,但是不用害怕,這樣的功能只用了兩個檔案就完成了,因為 AMFPHP 使用的是 PHP 的 CLASS 寫法,所以所有的方法都可以放在一起,這樣不就清爽多了嘛,雖然以前我在寫 ASP 的時候就常常把可以放在一起的頁面寫在一起,但是總是寫得眼花撩亂,但是現在用 AMFPHP 倒是可以把 MVC 分的很清楚,在開發的速度也會比較快一點。
不過這次為了解決一個問題,反而愈到另一個問題,就是當我寫好以後要放到虛擬主機的時候,上傳到 Hostmonster ,卻發現 AMFPHP 無法正常執行,但是由於太晚了,我也懶得在測試為什麼了,還好上傳到 G型主機 還可以執行,鬆了一口氣,有空再來研究是為什麼吧。
好了,廢話不多說,沒有看一下結果怎麼會知道到底是甚麼呢,不過也請大家手下留情,不要隨便攻擊我的後台啦 @@ ,正當測試一下程式結果就好。
這次一共用了五個方法,分別是[新增客戶][查詢全部客戶][驗證帳號是否註冊過][刪除客戶][驗證登入的帳號密碼],用兩個小時寫好的如果有甚麼問題的話在麻煩通知一下囉,謝謝。我想這樣的範例應該可以很清楚的知道 AMFPHP 與 FLEX 之間的溝通該怎麼做,希望大家都可以了解 ^^
PS. 剛好不知道今天 BLOG 該 PO 甚麼東西 @@"
services\app\users.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | <?php //定義資料庫的資料 define(dburl,"localhost"); define(dbusername,"請用你自己的資料庫帳號"); define(dbpassword,"請用你自己的資料庫密碼"); define(dbname,"資料庫名稱"); class users { //取得所有資料庫內的使用者帳號密碼 public function getUsers(){ $db = new mysqli(dburl,dbusername,dbpassword,dbname); $query = "select * from users"; $result = $db->query($query); $db->close(); return $result; } //檢查帳號密碼是否正確 public function checkUser($dataObject){ $account = $dataObject["account"]; $password = $dataObject["password"]; $db = new mysqli(dburl,dbusername,dbpassword,dbname); $query = "select * from users where account = '$account' and password = '$password'"; $result = $db->query($query); $db->close(); if($result->num_rows > 0){ //如果資料庫有回傳資料表示這個帳戶與密碼通過資料庫驗證 return true; }else{ //沒有資料當然代表這是不合法的帳號與密碼 return false; } } //新增使用者帳號與密碼 public function insertUser($dataObject){ $account = $dataObject["account"]; $password = $dataObject["password"]; $db = new mysqli(dburl,dbusername,dbpassword,dbname); $query = "insert into users (account,password) values ('$account','$password')"; $db->query($query); $db->close(); return true; } //利用AJAX方式檢查使用者帳號是否重複 public function checkUserAjax($dataObject){ $account = $dataObject["account"]; $db = new mysqli(dburl,dbusername,dbpassword,dbname); $query = "select * from users where account = '$account'"; $result = $db->query($query); $db->close(); if($result->num_rows > 0){ //如果資料庫有回傳資料就把按鈕關閉 return false; }else{ //都沒找到資料才打開 return true; } } //刪除使用者帳號與密碼 public function delUser($dataObject){ $account = $dataObject["account"]; $db = new mysqli(dburl,dbusername,dbpassword,dbname); $query = "delete from users where account='$account'"; $db->query($query); $db->close(); return true; } } ?> |
UserLogin.mxml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | <?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" fontSize="14" creationComplete="init()">
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
[Bindable]
private var checkCode:String;
[Bindable]
private var regCheckCode:String;
//初始化->把可以登入的使用者資料拿回來
//並且產生兩組驗證碼->簡易防止機器人行為
private function init():void{
this.usersRemoting.getUsers();
this.checkCode = this.createCode();
this.regCheckCode = this.createCode();
}
//產生驗證碼
private function createCode():String{
var code:String = "";
for(var i:int=0;i<4;i++){
code += (int)(Math.random()*10);
}
return code;
}
//刪除帳號
private function delHandler():void{
if(this.userDG.selectedIndex == -1){
Alert.show("尚未選取使用者","警告");
}else{
var obj:Object = new Object();
obj.account = this.userDG.selectedItem.account;
this.usersRemoting.delUser(obj);
}
}
//新增使用者
private function regUserHandler():void{
if(this.regAccount.text =="" || this.regPassword.text =="" || this.regCode.text==""){
Alert.show("你有欄位尚未填寫","錯誤");
}else{
if(this.regCode.text != this.regCheckCode){
Alert.show("驗證碼錯誤","錯誤");
}else{
var obj:Object = new Object();
obj.account = this.regAccount.text;
obj.password = this.regPassword.text;
this.usersRemoting.insertUser(obj);
}
}
}
//新增使用者成功
private function insertUserResult():void{
this.usersRemoting.getUsers();
this.regAccount.text = "";
this.regPassword.text = "";
this.regCode.text = "";
this.regCheckCode = this.createCode();
Alert.show("新增資料成功","訊息");
}
//利用 AJAX 的方式檢查帳號是否存在
//->叫做 AJAX 有點白癡,因為整個 FLEX 都是 AJAX 阿....
private function regAccountAjax():void{
var obj:Object = new Object();
obj.account = this.regAccount.text;
this.usersRemoting.checkUserAjax(obj);
}
//如果帳號沒人用過才把新增的按鈕打開
private function checkUserAjaxResult(event:ResultEvent):void{
this.regUserBtn.enabled = event.result;
}
//檢驗帳號登入成功與否
private function checkUserHandler():void{
if(this.loginAccount.text =="" || this.loginPassword.text =="" || this.loginCode.text==""){
Alert.show("你有欄位尚未填寫","錯誤");
}else{
if(this.loginCode.text != this.checkCode){
Alert.show("驗證碼錯誤","錯誤");
}else{
var obj:Object = new Object();
obj.account = this.loginAccount.text;
obj.password = this.loginPassword.text;
this.usersRemoting.checkUser(obj);
}
}
}
//顯示後端驗證的結果
private function checkUserResult(event:ResultEvent):void{
if(event.result){
//重新建立驗整碼
this.loginCode.text = "";
this.checkCode = this.createCode();
Alert.show("您輸入資料為\n\n帳號:"+this.loginAccount.text+"\n密碼:"+this.loginPassword.text,"使用者密碼驗證成功");
}else{
Alert.show("您輸入的帳號或密碼錯誤,請重新再試","錯誤!");
}
}
]]>
</mx:Script>
<mx:HBox width="620">
<mx:VBox width="50%">
<mx:Panel width="300" height="250" layout="vertical" title="使用者登入">
<mx:Form width="100%" height="100%">
<mx:FormItem label="帳號">
<mx:TextInput id="loginAccount" maxChars="8" restrict="a-zA-Z0-9"/>
</mx:FormItem>
<mx:FormItem label="密碼">
<mx:TextInput id="loginPassword" maxChars="8" restrict="a-zA-Z0-9"/>
</mx:FormItem>
<mx:FormItem label="驗證碼">
<mx:Label text="{this.checkCode}"/>
<mx:TextInput id="loginCode" maxChars="4" restrict="0-9"/>
</mx:FormItem>
<mx:FormItem>
<mx:Button label="送出" click="checkUserHandler()"/>
</mx:FormItem>
</mx:Form>
</mx:Panel>
<mx:Panel width="300" height="250" layout="vertical" title="新增使用者">
<mx:Form width="100%" height="100%">
<mx:FormItem label="帳號">
<mx:TextInput id="regAccount" change="regAccountAjax()" maxChars="8" restrict="a-zA-Z0-9"/>
</mx:FormItem>
<mx:FormItem label="密碼">
<mx:TextInput id="regPassword" maxChars="8" restrict="a-zA-Z0-9"/>
</mx:FormItem>
<mx:FormItem label="驗證碼">
<mx:Label text="{this.regCheckCode}"/>
<mx:TextInput id="regCode" maxChars="4" restrict="0-9"/>
</mx:FormItem>
<mx:FormItem>
<mx:Button id="regUserBtn" label="新增" click="regUserHandler()" enabled="false"/>
</mx:FormItem>
</mx:Form>
</mx:Panel>
</mx:VBox>
<mx:Panel width="300" height="100%" layout="vertical" title="目前資料庫內可登入的帳號與密碼">
<mx:Button label="刪除" click="this.delHandler()"/>
<mx:DataGrid id="userDG" width="100%" height="100%" dataProvider="{this.usersRemoting.getUsers.lastResult}">
<mx:columns>
<mx:DataGridColumn headerText="帳號" dataField="account"/>
<mx:DataGridColumn headerText="密碼" dataField="password"/>
</mx:columns>
</mx:DataGrid>
</mx:Panel>
</mx:HBox>
<mx:RemoteObject id="usersRemoting" destination="amfphp" source="app.users">
<mx:method name="getUsers"/>
<mx:method name="delUser" result="this.usersRemoting.getUsers();Alert.show('刪除成功','訊息');"/>
<mx:method name="insertUser" result="insertUserResult()"/>
<mx:method name="checkUserAjax" result="checkUserAjaxResult(event)"/>
<mx:method name="checkUser" result="checkUserResult(event)"/>
</mx:RemoteObject>
</mx:Application> |
Random Posts
Loading…
相關文章 :










不好意思
我又有問題問你
就是我在DataField抓取日期丟到資料庫
obj1.date = this.date.selectedDate;
結果是一些數字
請問這個要怎麼解決?
@Forgot
應該不算是物件導向
只是先用 OBJECT 把兩個屬性包起來一起傳值 比較方便
@稀飯
試著用 DATE 類別把數字轉換回來
你可能要看看 dateField 的 API 看看他收的數值得意義
我下了一個如果錯誤會跳出錯誤訊息的指令
然後,我執行的時候他會跳出錯誤訊息
請問這是什麼問題呢?
mysql_num_rows():
supplied argument is not a valid MySQL result resource
阿!! 請幫我把上面那個刪掉!! 我好像找到問題了
另外 又有一個問題 我寫了一個類似的程式
是在textbox裡面輸入帳號及密碼,然後按下button使datagrid裡面顯示帳號及密碼
(講的有點不清楚),不知道聽得懂嗎?下面是我的程式,一直出不來
query($query);
$db->close();
return $result;
return true;
}
}
?>
FLEX
@Forgot
return $result 之後不需要 return true
可是還是出不來耶 下面是的php
public function getUsers($dataObject){
$account = $dataObject["account"];
$password = $dataObject["password"];
$db = new mysqli(dburl,dbusername,dbpassword,dbname);
$query = “select * from users where account =’$account’ and password =’$password’”;
$result = $db->query($query);
$db->close();
return $result;
}
@稀飯
稀飯 是怎麼解決的呢? 我遇到同樣的問題了
不好意思~看到大大的文章真令我感動
有個問題想請教一下~
就是如大大所示範的
那我該如何單單只把會員帳號的dataprovider部分取出來存到arraycollection中呢?
在下對於dataprovider還不是很上手~
還請大大指點一下了!
大大的範例測試後終於成功抓取出來擲了
但是傳回來的Result是否可以在FLEX轉成Array或ArrayCollection使用?
因為我想要把抓回來的Facebook的ID拿來抓取使用者資料
但是Facebook的函式是使用Array來抓取使用者資料,所以需要把PHP傳回來的東西再轉成Array使用才可以
@疾風烈神
抱歉這麼晚回你
基本上你應該要把你的資料放在 ArrayCollection
其他的元件在取用這個 ARRAY 比較正確
@呆呆
如果你要把 RESULT 轉為 ARRAYCOLLECION ( 本來是 ARRAY )
你就要手動轉才可以喔~
但是基本上不會很難阿
而且用 ARRAY 也沒甚麼關係阿 ^^
你好,想請問一下如果我把你的這些程式碼都call好了,也貼到我的flex3上面囉,可是執行網頁的時候,在新增會員那邊,最後無法按新增,那請問是什麼問題?是沒有架資料庫的關係嘛?
先前有朋友提到 AMFPHP 似乎有版本上須要調整的
可能要注意一下~