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…
相關文章 :










感謝您熱心提供^^
我晚上下課時,會抓下來好好研究一番,感謝在先.
M~
因為寫之前喝了杯咖啡
寫完後整個就失眠了~
恍神中~~ 呵呵
哇。。我才正想要學FLEX而已ㄋ。OTZ~
真的很羨慕說。XD
看到這篇文章真的很受用呢!感謝Ausir的教學。
另外CORA的平面設計也很厲害呢!
我雖然會網頁和平面。。。不過平面沒辦法像CORA那樣。@_@
希望可以儘快將FLEX學會。^^
M~
希望可以幫助更多人學習 RIA 喔~^^
基礎學習的話可以先從 HttpService 取得 XML 來寫會比較容易~
不過我暫時還沒有資料
有空再來 PO 一些 HttpService 的資料
不好意思又來打擾囉.想跟您請教一下,關於http://localhost/phpmyadmin的登入資料庫密碼是否是必要設定的? account和password是users資料表的欄位嗎? PHP這方面沒研究過..所以很多不懂 打擾囉^^
密碼如果你沒設定可以塞入空值
就是兩個引號中間不要打字
這篇文章我忘記補充資料庫定義的部分
我只有兩個欄位
account 帳號 varchar 10 位 [主鍵]
password 密碼 varchar 10 位
應該就是這樣了~~
^_^
感謝,我以為只要把定義dbpassword刪掉就可,終於可以抓到資料庫了..^^
祝你成功,AMFPHP成功之後可以再繼續玩 ZENDAMF
我在正在把資料發佈中~ 晚點應該就可以看到了
呵呵~
我朋友有給我ㄧ套WampServer2,好像也不錯.非常感謝您的幫忙
感謝您熱心幫助,我朋友也介紹一套WampServer2好像不錯用.
Fannie :
謝謝你的讚美
設計是需要無限的熱情
承受客戶無情的摧殘
一起加油吧
我想我們是打不死的蟑螂
呵,感謝您的熱心相助.有不會的再向您請教^^
CORA:
對呀!很認同。
設計最容易碰到的問題就是。。。設計出來的東西本身就很ok了。經過客戶校對之後。。。他卻比較喜歡”俗”的東西。。有時真的會很ooxx。(但是,客戶的需求,有時候還是得體諒的,因為他不喜歡,妳也不能強逼他,總不能跟錢過意不去。XD)
不過,有時候興趣和工作真的得分開。
就像,身心跟精神,有時候還是得分開,才不會打結。
我一直很希望能夠做像妳那樣感覺的設計呢!
很有國際水準唷!
希望妳能夠繼續保持下去,並且,愈做愈好唷!
下次我會在我的部落格上面,PO一個廣告插畫公司的作品。
常常在想,做設計的人,腦子真的都滿強的呢!(我就不行了。腦子單純的很。XD)
Ausir :
HttpService ~@_@~ 這個是什麼?
像你們在用的XAMPPS,我也會用唷!^^
當初想說學PHP,灌了LINUX(Ubuntu),不過現在沒主機可以灌linux系統了。。所以。。就把xampps灌在xp底下,以前的話,應該不行。。沒想到資訊進步這麼神速。。連xp都可以直接測試mysql、phpadmin了。(因為早期有用過RedHat。。但無法上網,最後就是放棄啦!)
所以,寫程式。。。對我來說最困難的,就是得放棄html的語法,常常會打結。(因為早期寫網頁的時候,就是HTML開始的,一開始悟道,後期想要接觸程式部份,就很容易打結。XD)
Httpservice 是 FLEX 另一種向後端索取資料的方式
方法比 remoteobject 簡單
但是效能比較差
但是卻比 remoteobject 有彈性
簡單來說就是向 AJAX 是向後端索取 XML 檔案
所以後端用甚麼語言相較之下彈性許多
@Fannie
你說我有國際水準
我覺得很汗顏ㄟ
不過還是謝謝你的讚美
我會再繼續努力的
Ausir您好:
想跟您請教,如果說,我想網路demo使用者登入的範例,以自己電腦當伺服器,有固定IP,要如何操作呢? PS:並非上傳到網路上的空間
你好~
如果你想要用自己家裡的 ADSL 來架設 SERVER 供人家連線
請問你是否使用 IP分享器撥接 ( 1.是 2.否 )
1.是
那你必須要先連線到你的 IP 分享器設定開啟 PORT 對應(或是稱為 虛擬主機)
你必須先把你的電腦設定一個固定的內部 IP
然後開啟對應 PORT TCP 80 -> 你電腦的 IP 的 TCP 80
之後你就可以用你外部的 IP 來瀏覽你的 WEB SERVER 了
2.否
表示你每次上線都要用電腦撥接 PPPOE 來上網
這樣子你要架設 SEVER 會比較不方便 因為 PPPOE 有時候會自動幫你斷線
不過也是無所謂
這時候你的 XP 或是 VISTA 應該會開啟防火牆
你必須將防火牆停用 或是 增加例外 ( TCP 80 PORT )
如此一來就可以從外部的 IP 連線到你的電腦瀏覽網頁
:::
不知道你問的是這個嗎??
對!! 謝謝您的說明,終於了解,原來用IP分享器還要加以設定.
多謝幫忙,謝謝囉!
@逮灣郎
不客氣
今天要收工了 ^_^
想請問一下,如有我有二個頁面,
我想要由a頁面登入後轉到b頁面,在flex裡面如何實作呢?
用 FLEX 要做到這個功能的話
先用 HTTPService 或是 RemoteObject 先驗證是否成功
如果成功
在用 navigateToURL 的功能 然後再相同視窗開啟連結即可
這是我的做法….
當然其他頁面你要記得使用 SESSION 判斷是否登入過
還有很多作法啦 ^_^
好厲害 正是我想學的
請問如何讓輸入密碼時 顯示不出輸入的值
一般都是顯示*******
請問要怎麼改
謝謝
@lan
Dear lan
如果你要讓 textinput 只出現 *
你只要在 textinput 的屬性增加一個 displayAsPassword
並且設定為 true 即可
例如
版主您好,感謝您精采的範例,小弟接觸FLEX與AMFPHP不久測試過版主的範例後一執行就出現以下錯誤問題,想請問是因為我AMFPHP資料庫設定有錯誤嗎?還是PHP檔案放的位置有誤呢,小弟放的位置為C:\xampp\htdocs\amfphp\services\app\users.php,不好意思 打擾版主囉
@pig
建議你可以先參考這篇
http://blog.corausir.org/programing/flex/ausir-573
因為看錯誤訊息應該是你 Channel 的設定有錯誤~
你要檢查看看是否有依照你的環境設定喔~~
@Ausir
恩~感謝版主回答 小弟有先從您http://blog.corausir.org/programing/flex/ausir-573此例題去架設環境~也可正常執行,但目前這例題還是有一些錯誤!小弟在去測試看看 感謝版主
@pig
微薄之力
沒能幫上甚麼忙 ^^
您好
很感謝您的範例
讓我了解許多
我在使用你這個範例並修改某部分
但發現以下錯誤訊息
(Object)#0
message = “faultCode:INVALID_AMF_MESSAGE faultString:
‘Invalid AMF message’ faultDetail:’
Fatal error: Class ‘mysqli’ not found in C:\AppServ\www\amfphp\services\test\name.php on line 11
‘”
name = “Error”
rootCause = (null)
請問一下這是發生了甚麼錯誤?
麻煩您告訴我
謝謝您
@稀飯
你的錯誤訊息就是
你的 PHP 是 4 版
但是我用到了類別 mysqli
這個資料庫讀取類別是 PHP 5 才有的樣子
還是 PHP 4.5 ?? 是這樣嘛~~
呵呵~ 總之是你 PHP 版本太低了 ^^
您好
我再請問一個問題
Dreamweaver是不是只提供到PHP4?
好像Dreamweaver CS4有提供到PHP5
可以跟我說有哪些軟體可以support PHP5
謝謝您
那不是 dreamweaver 的問題吧
是 WEB SERVER 的問題
你是用哪一套 PHP WEB SERVER
你抓 XAMPP 就是 PHP5
你可以參考我前面的文章 ^^
我是用Apache 2.2
不能使用dreamweaver 去撰寫php
您還是建議我使用XAMPP嗎?
@稀飯
使用 XAMPP 會比較方便 ^^
我想在請問一下
請問修改資料要怎麼下手?
我現在有DataGrid顯示了
我想直接在上面做修改
可是一直無法更新到資料庫裡
請指點一下
謝謝
@稀飯
使用 itemrender 使用 textinput 替代文字內容
如此一來就可以修改了
@Ausir
恩恩 謝謝您
不好意思
再請問一下
我已經把我的flex做好了
我有固定IP
我想放在網路上瀏覽
可以讓我在其他電腦上網瀏覽使用
我把swf和html放在www資料夾下
可是瀏覽時不能Run
簡單會員登入不行
192.192.155.77/PCM.swf(html)
麻煩老師指點一下
謝謝您
@稀飯
抱歉喔~ 這兩天東主有喜~
所以比較晚回 ^_^
錯誤訊息 http://192.192.155.77/PCM.swf 無法從 http://localhost/amfphp/gateway.php 載入資料
有安全性違規喔~
你要更改 xml 把 localhost 改成 192.192.155.77
請問是改services-config.xml嗎?
如果是改這個話
我改了
可是他還是不行= =
我現在是把bin-debug整個資料丟到www裡
http://192.192.155.77/bin-debug/PCMS.html
@稀飯
不好意思 麻煩你了
恭喜恭喜 哈哈
@稀飯
不好意思
我解決了 謝謝你
@稀飯
處理 OK 就好 ^_^~~
嗨 有沒有推薦PHP的書阿 用eclipse的
因為我之前沒用過PHP想說打點底
@Forgot
書喔~
其實 PHP 並沒有很難
至於說要找 eclipse 的書 應該是沒有 XD
我有問題 這邊使用new mysqli
跟你之前做的$conn = mysql_connect
是另一種語法嗎
我知道了 是不是版本的不同?
@Forgot
mysql 與 mysqli 只是類別不同
mysqli 還支援多連線的寫法喔
算是進階一點的吧
如果在新的語法會用 PDO 的方式建立連線
可以解釋ㄧ下$dataObject在程式中的意思嗎
是傳值的意思嗎 把帳號跟密碼儲存然後傳值
@Forgot
對阿~
打包以後再一起傳到 AMFPHP
所以算是物件導向嗎?
因為我不太懂
$account = $dataObject["account"];
$password = $dataObject["password"];
表示可以存以個以上的值嗎?