今天遇上這問題目前是順利解決來紀錄一下,稍微查了一下這可能是UTF8 dom的問題,也可能是buffer這部份的問題,總之我是用以下方是解決。
到"C:\Windows"找出php.ini將"output_buffering"修改為On
※O要大寫
; Output buffering allows you to send header lines (including cookies) even
; after you send body content, at the price of slowing PHP's output layer a
; bit. You can enable output buffering during runtime by calling the output
; buffering functions. You can also enable output buffering for all files by
; setting this directive to On. If you wish to limit the size of the buffer
; to a certain size - you can use a maximum number of bytes instead of 'On', as
; a value for this directive (e.g., output_buffering=4096).
output_buffering = On
修改完後別忘了將apache重新啟動
PHP "Cannot modify header information - headers already sent by"
iOS 連接外部資料庫
消失了很久很久
這陣子幾乎都在研究objc+iOS
空餘時間也稍微摸了點Android
退伍前一陣子就沒碰程式
加上當兵的11個月大腦退化
再次開始寫也變得比較吃力
比起javascript、actionscript、java拿objc當作個重新開始更是挑戰
真正開始寫大約是8月初
第一週真的感覺室外星語
第二週xcode+一些簡單語法已經可以自在使用
第三週也就是現在...在資料處理上大致已經可以應付
寫了一個app也在測試階段,預計再不久就可以上架
廢話不多說進入主題
找了相當多相關資料只有一個感覺...有看沒有懂
使用MySQL.framework、使用C#的framework
但是小弟不才....完全給他看不懂
後來就想到過去使用flash remote的方式也算是用HTTP request的方式作中介
這樣也是有些優點
一、前後端的人可以同時進行進行作業(ex:工程師、設計師)
二、傳送資料更加單存純,可以減少封包量(也就是傳輸的資料更小)
三、等我想到再補
基於以上這些好處加上我對objc的不熟悉使用HTTP request是最好的方法
HTTP request簡單來說可以分成GET、POST兩種方式
基本上目前兩種都測試過沒問題,先以POST說明
首先從MySQL開始(由於我懶所以直接用phpMyAdmin)
先建立一個table
內容是怎樣自己而定(口語一點就是「你高興就好」)

基於上圖現在我們知道這table有三個欄位,分別為id、name、url
現再我們只要name欄位
使用php來作中介取得資料庫資料
<?php
$dbhost = "localhost"; //資料庫位置
$dbname = "test"; //資料庫名稱
$dbuser = "isken"; //帳戶名稱
$dbpass = "12345678"; //帳戶密碼
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connection');
mysql_select_db($dbname);
$sql = "select * from userProfile "; //MySQL語法
$result = mysql_query($sql) or die('MySQL query error');
while($row = mysql_fetch_array($result)){
echo $row['name']."||"; //print出來並在每一筆後面加上間隔
}
?>
print出來的結果如下圖,每一筆的中間都加上" || "作為間隔

測試成功後稍微修改一下為POST所使用
我懶...所以就拿帳號密碼改為post方式
<?php
$dbhost = "localhost"; //資料庫位置
$dbname = "test"; //資料庫名稱
$dbuser = $_POST[username]; //帳戶名稱
$dbpass = $_POST[password];; //帳戶密碼
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connection');
mysql_select_db($dbname);
$sql = "select * from userProfile "; //MySQL語法
$result = mysql_query($sql) or die('MySQL query error');
while($row = mysql_fetch_array($result)){
echo $row['name']."||"; //print出來並在每一筆後面加上間隔
}
?>
到這邊在http這邊已經完成準備
接著就是objc/cocoa的部份
首先開啟xcode建立新專案,在此建立最基礎"Window-base Application"即可

設定專案名稱,基本上看個人高興,在此以"connMySQL"為名

建立完成後會看到這畫面,到這都不是重點
右上方那空格內為建立此專案同時幫你創立的檔案

首先找到"connMySQLAppDelegate.m"內的這區域,也是所謂的程式進入點

接下來貼上這串code

請複製,我是個懶人,希望大家也跟我一樣XD
//宣告一個 NSMutableURLRequest 並給予一個記憶體空間
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
//宣告一個 NSURL 並給予記憶體空間、連線位置(放於本機localhost,檔案名稱為iphone.php)
NSURL *connection = [[NSURL alloc] initWithString:@"http://localhost/iphone.php"];
//宣告一個 string
NSString *string;
//宣告兩個字串分別為帳號、密碼,格式為"php端名稱=給予的內容"
NSString *string1=@"username=isken";
NSString *string2=@"&password=12345678";
//將兩個字串合併道地三個字串(其實有點多餘....)
string = [string1 stringByAppendingString:string2];
//宣告一個 NSMutableString 並給予記憶體位置,將內容設定為上面的string
NSMutableString *httpBodyString=[[NSMutableString alloc] initWithString:string];
//設定連線位置
[request setURL:connection];
//設定連線方式
[request setHTTPMethod:@"POST"];
//將編碼改為UTF8
[request setHTTPBody:[httpBodyString dataUsingEncoding:NSUTF8StringEncoding]];
//轉換為NSData傳送
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//看print出來的值
NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
寫好後當然就準備要run!
但是並沒有將內容呈現再畫面中,而是以print的方式所以先打開"Console"來看priont的結果
打開後就帥氣的點下"Build and Run"

按下後預設的模擬器(iphone Simulator)也會一併被開啟(就是畫面中的iphone)
不過他不是重點...因為寫的東西跟他一點關係都沒有,重點在"Console"內
所顯示的"user1||user2||user3||user4||user5||user7||user6||"就是database內的user欄位
當然還可以依照個人要求去下sql語法

不過這還是有問題...並沒有去把記憶體作釋放
簡單來說只要有給記憶體位置就要去釋放,不然程式多寫一點會常常crash(執行到一半跳出來)
有在".h"file 內宣告過的也必須在dealloc前釋放
看到內容有錯(紅色驚嘆號)、警告(黃色三角)其實要很開心,當你看不到他們還是一直crash才真的想哭
download example
AMFPHP flash in AS2
前面兩篇介紹了amfphp介面與php端
最後來介紹最重要的flash端(畢竟最主要是flash要連資料庫嘛...)
因為AS3到現在熟悉程度還是有限`
AS2...也只是略知一二....|||
切入正題
AS2裡面若要作Remote需要先import "RemotingClasses"元件至元件庫
*update 20110928
發現"RemotingClasses在"flash cs4"已經消失,不過已經找到原來的Class檔案,使用方式為檔案解壓縮後將資料夾檔案與publish的sef檔放在同一層目錄即可。
RemotingClasses 立即下載
接著是code部份就由以下範例解說
php端
<?php
class test{
var $dbhost = "localhost";
var $dbname = "test";
var $dbuser = "root";
var $dbpass = "12345678";
var $conn;
function getData(){
$this->conn = mysql_connect($this->dbhost, $this->dbuser, $this->dbpass);
mysql_select_db ($this->dbname, $this->conn);
$rs=mysql_query("SELECT * FROM myTest", $this->conn);
return $rs;
}
}
?>
先看看service端是否有抓到資料

確定有抓到資料後
接著是flash端
import mx.remoting.*;
import mx.rpc.*;
//gateway位置 也就是在amfphp資料夾下的gateway.php
var gatewayUrl:String = "http://localhost/amfphp/gateway.php"
//新增一個service
//var 新增service:Service = new Service(gatewayUrl, null, 'amfphp內service名稱');
var myService:Service = new Service(gatewayUrl, null, 'test');
//var 自訂:PendingCall = 新增service.amfphp內function名稱;
var myTest:PendingCall = myService.getData();
//自訂.responder = new RelayResponder(this, "成功後執行function", "成功後執行function");
myTest.responder = new RelayResponder(this, "handleGet", null);
//成功後執行function
/*
function handleGet(自定:ResultEvent){
var 同amfphp內function名稱:RecordSet = RecordSet(自定.result);
變數 = 同amfphp內function名稱.getItemAt(第幾比資料).資料庫欄;
^^^^^^^^^
從0開始算
}
*/
function handleGet(r:ResultEvent){
var getData:RecordSet = RecordSet(r.result);
myVar = getData.getItemAt(0).number;
trace("myVar = "+myVar);
}
在trace後確認有抓到變數

這樣就完成最基礎的Remoting
AMFPHP php端
首先開啟任意一個文字編輯器並輸入以下程式碼
< ?php
class HelloWorld
{
//我是註解
function say($sMessage)
{
return '結果是.... ' . $sMessage;
}
}
?>
其實很不想用hello world當範例...
下圖為amfphp與php function間的對應

class HelloWorld 橘色線段
function say 紅色線段
($sMessage) 紫色線段
return '結果是.... ' . $sMessage; 藍色線段
有需要注意部份有幾點 1. class "HelloWorld" =>這一定要與檔案名稱相同 ex: helloworld.php 2. function 後接著就是function的名稱,可依照個人習慣而定
3. 如範例:function say ($sMessage) 後面括號中即為變數不限定數量,只要使用" , "來區隔即可
ex: $a, $b, ......
4. 若沒有要使用變數(只需取得值)括號內就不需要填任何東西
5. return 後面即為最後所需的值
以上為只使用php內語法
但若需要連結資料庫呢?
下面這範例提供參考
< ?php
class test{
var $dbhost = "localhost"; //資料庫位置
var $dbname = "myTest"; //資料庫名稱
var $dbuser = "test"; //使用者名稱
var $dbpass = "12345678"; //使用者密碼
var $conn;
function getData(){
$this->conn = mysql_connect($this->dbhost, $this->dbuser, $this->dbpass);
mysql_select_db ($this->dbname, $this->conn);
$rs=mysql_query("SELECT 欄 FROM 表單 WHERE 位)", $this->conn);
return $rs;
}
}
?>
這樣即可獲得到資料庫的資料如下範例

MySQL的語法在此就不多作說明
若有興趣google一下即可獲得
看似很難的東西其實也能很簡單
AMFPHP 1.9b 基本介紹
最近打混有點大...有點良心不安...
進入正文
Flash若想要與資料庫連結有不少方式
現在就先介紹這一種透過php與MySQL連結
AMFPHP官方網頁
其實網路上有不少這方面相關資源
中文、英文、法文、西班牙文都有不少相關資料
但說實在話...當我剛接觸時還真是搞得一團亂
現在稍微有點心得來分享一下
以下當作對於架設環境有基本了解(apache、MySQL...)
首先去官方網站下載主程式
因為版本很多...不過還是推薦目前最新的1.9b(介面實在好太多..功能也強大)
下圖為下載完解壓縮後

接著就直接使用瀏覽器來觀看(如下圖)
輸入http://localhost/amfphp/ or http://127.0.0.1/amfphp/

點選Browser後及進入介面
下圖為首次進入出現的選項

Gateway location 為amfphp內的gateway的位置(預設位置一般來說可以不用變)
Encoding 預設部份也不用去動(兩個好像為新舊版差異)
Set table after call 這部份也無須去更動,只是差別在call function時先呈現哪一個
進入後基本介面(下圖)

按下call後所呈現如下




假若過程中有需要輸入變數也可以直接在這測試

接下來兩篇將介紹裡面service寫法及flash端如何來取得以及寫入資料