Flash Lite 1.1 + MySQL + PHP データベースに保存・読み込み
Flash lite1.1 でゲームを作っていて、ゲームのスコアをloadVariables関数で,
PHPにデータを渡してテキストデータ(.txt)に保存しようと思ったが
ランキングスコアのソート処理とか排他処理
(複数のユーザからアクセス要求が出された時に同時書き込みを防ぐ)
の部分で問題が出てくるということで、
PHPもろくにできない状態で、データベースの勉強を初めてしつつ
Flash lite とPHP、MySQLの連動 ができました。(制作 まる 2日)
トライアンドエラーでかなりloadVariablesの部分と
PHPのプログラム,文字コードでやられました。
なんとかできたと思うのでメモしておきます。
各携帯キャリアなどでチェックしていないのでなんともいえませんがね・・・
ちなみに私のはD705iです。
デモはこちらのQRコードから
ご覧ください。
(恐らくエラーが出るとおもうんですよね。)
バグやプログラム不備があったら教えていただけると助かります。
■今回の流れ
1.Flash lite 1.1 でテキスト入力
2.入力した内容をloadVariablesを使ってPHPにデータを受け渡す
3.PHPでFlashから受け取ったデータをデータベース(MySQL)に保存する
4.PHPでデータベース(MySQL)から必要なデータを呼び出す
5.Flashにデータを返す
■Flash Lite 1.1
それでは、具体的に今回作成したメモを、
Flash Lite1.1で作成 (サイズ 240×320)
ダイナミックテキストが正しいのですが、
今回は面倒だったのでここもテキスト入力タイプにした。
あくまでもDB連動の練習なので。
3.テキスト入力情報を送信するためのボタン
loadVariablesはボタンを押すタイプからでないと作動できないらしいのでデータ送信用ボタン。
(タイムライン上からのloadVariablesができてしまうと
自動的に携帯情報をゲットできてしまうからなどがあるらしいです。)
このボタンに
次のアクションスクリプトを書きます。
■送信ボタン アクションスクリプト
requrlにPHPの置いてあるアドレスを書きます。
そして、Flash liteからPHPに渡すデータをphp?の後に書きます。
score に テキスト入力から得た変数cntのデータを
nameに 変数NMから得たデータを送ります。
ここでのscore,nameという名前は自由です。
あとでPHPで受け取るための名前です。
で、
loadVariables(外部アクセスURL、外部からの戻り値を受け取る場所)
requrlで外部PHPにアクセスして、
その戻り値を"rank_clip"というムービークリップ内にします。
gotoAndPlay("loading")は、
PHPにアクセスして
戻り値が戻ってこない時に表示させるものです。
4.ランキングレイヤーにムービークリップ"rank_clip"を作成
ここではスコアと名前を表示させるダイナミックテキストのテキストエリアを配置します。
各テキストエリアに上記図のような変数をつけます。
それと、endという変数のテキストエリアを画面外に作成しました。
これは、PHPからの戻り値がちゃんと帰ってきたよーと知らせる
ために作成しました。別になくていいと思います。
後ほど説明します。
5.labelフレームを作成
3フレームにloadingというラベル名で
5フレームにrankというラベル名で作成。
6.各フレームにアクションを書きます
①スコア用のムービークリップは最初必要ないので隠しておきます。
②送信ボタンを押すまでこのフレームでストップ
③loading用のスクリプト(PHPから戻り値を待つ)
④PHPからの戻り値を待つ用の繰り返し処理(flash lite1.1 onEnterFrameが使えないため)
⑤スコア用のムービークリップを表示
⑥ストップ
以上でFlash Lite側はおしまい。
■PHP側(ranking.php)
早速コードを。文字コードはEUCで保存しています。
PHPのコードを書きましたが、
私自身、PHPもMySQLもド素人でして、今回初めてだったのですが、
この本がかなり役に立ちました。
話がそれてしまいました。元にもどりまして、
ソースの説明に、まず
1.header("Content-type:text/plain");
ですが、auでloadVariablesが動かないらしいとのことで、
動くようにはこの1文章を入れるといいというらしいです。
実際にこのFlashがauの携帯で動くのすら不明ですがね(笑)
だれかチェックしてもらえると嬉しいです。
2.$SCR = addslashes($_GET['score']);
$Name = addslashes($_GET['name']);
flash側 で送信ボタンのactionscriptに書いた
requrlのphp?以降の値がココに入ります。
また、カンマや¥マークなどが入力された時に
DBなどで問題が出ないようにaddslashes関数を使います。
3.$conn =
mysql_connect('MySQLURL','接続ユーザ','接続パスワード') or die(mysql_error());
mysql_connect()という関数で、簡単にDBに接続が行えます。
DBそのものがなんなのか分からない方はお勉強ですね。
私も良く分かっていません。。。できると便利ですね。
$connに接続IDを設定
4.mysql_select_db('データベース名',$conn) or die(mysql_error());
mysql_select_db関数で、使用するデータベースを選択します。
ちなみに or dieというのは、mysql_select_db()関数にエラーがあったら
PHPスクリプトの実行を終了するものです。
5.$sql = <<<EOS
INSERT INTO データベースのテーブル(id,score,name)
VALUES(NULL,'$SCR','$Name')
EOS;
PHPからデータをテーブルに挿入するためのSQL文です。
データベースのテーブルid,score,nameに
NULL,$SCR,$Nameを挿入します。
iここでのidは必要ありません。scoreとnameだけでもOKです。
データベースのテーブルはどうやってつくるの?
となると思うんですが、
私はphpMyAdminという便利なものでサクサク作成いたしました。
6.$sql = mb_convert_encoding($sql,"UTF-8","auto");
ここでは、携帯で入力された文字をUTF8にしてデータベースに保存するために
文字コードを変換しています。
携帯の文字コードはShift-JISらしいのですが、携帯から入力された文字が
PHPに読み込まれた時はEUCになるのかなど、よく分からず、色々試していたんですが、
分からなくて、悩んでいたら、"auto"というのが使えるらしいということをしって、
"auto"にしました。正直、これが合ってるのか分かりません。
私の携帯ではちゃんと表示されているから、これでって言う感じです。
7.$res = mysql_query($sql,$conn);
5.で設定したデータを挿入するためのコード$sqlを
mysql_query()関数を使って実行します。
この段階でFlashから受け取ったスコアデータと名前のデータが
データベースに登録されます。
8.$sql = <<<EOS
SELECT score,name
FROM データベースのテーブル
ORDER BY score ASC
LIMIT 0,5
EOS;
データベースからデータを呼び出してくるためのSQL文です。
scoreとname(フィールド名)を選択(SELECT)、
どこから?
データベースのテーブルから(FROM)
ORDER BY 列名 ASC で
指定した項目を昇順でソートする。
今回の場合はscoreの低い数ほど上にきます。
(0が一番上)
LIMITは呼び出してくる数です。
9. $res = mysql_query($sql,$conn);
7.と同じですね。今回は
mysql_query()を使って8.で設定したデータを呼び出してきます
10.$rank = array();
$name = array();
$a = 0;
とりあえずランキング用の配列と名前用の配列を新しく作成。
$aも後ほど説明します。
11.while($row = mysql_fetch_array($res,MYSQL_ASSOC)){
$rank[$a] = "$row[score]";
$name[$a] = "$row[name]";
$name[$a] = mb_convert_encoding($name[$a],"SJIS","auto");
$a++;
}
ここが一番はまりました。
1.Flash lite 1.1 でテキスト入力
2.入力した内容をloadVariablesを使ってPHPにデータを受け渡す
3.PHPでFlashから受け取ったデータをデータベース(MySQL)に保存する
4.PHPでデータベース(MySQL)から必要なデータを呼び出す
5.Flashにデータを返す
■Flash Lite 1.1
それでは、具体的に今回作成したメモを、
Flash Lite1.1で作成 (サイズ 240×320)
1.bgレイヤーに背景画像を配置
2.inputレイヤーに、『名前』と『スコア』入力用のテキストエリアを配置
名前用のテキストエリア 変数をNMとした。
スコア用のテキストエリア 変数をcntとした。
実際にはスコア用のテキストエリアはスコアが入力されるので2.inputレイヤーに、『名前』と『スコア』入力用のテキストエリアを配置
名前用のテキストエリア 変数をNMとした。
スコア用のテキストエリア 変数をcntとした。
ダイナミックテキストが正しいのですが、
今回は面倒だったのでここもテキスト入力タイプにした。
あくまでもDB連動の練習なので。
3.テキスト入力情報を送信するためのボタン
loadVariablesはボタンを押すタイプからでないと作動できないらしいのでデータ送信用ボタン。
(タイムライン上からのloadVariablesができてしまうと
自動的に携帯情報をゲットできてしまうからなどがあるらしいです。)
このボタンに
次のアクションスクリプトを書きます。
■送信ボタン アクションスクリプト
on (press, keyPress "0") {
//PHPのアドレス
requrl = "http://自分のサイトアドレス/ranking.php?score=" add cnt add "&name=" add NM;
loadVariables(requrl,"rank_clip");
gotoAndPlay("loading");
}
//PHPのアドレス
requrl = "http://自分のサイトアドレス/ranking.php?score=" add cnt add "&name=" add NM;
loadVariables(requrl,"rank_clip");
gotoAndPlay("loading");
}
requrlにPHPの置いてあるアドレスを書きます。
そして、Flash liteからPHPに渡すデータをphp?の後に書きます。
score に テキスト入力から得た変数cntのデータを
nameに 変数NMから得たデータを送ります。
ここでのscore,nameという名前は自由です。
あとでPHPで受け取るための名前です。
で、
loadVariables(外部アクセスURL、外部からの戻り値を受け取る場所)
requrlで外部PHPにアクセスして、
その戻り値を"rank_clip"というムービークリップ内にします。
gotoAndPlay("loading")は、
PHPにアクセスして
戻り値が戻ってこない時に表示させるものです。
4.ランキングレイヤーにムービークリップ"rank_clip"を作成
ここではスコアと名前を表示させるダイナミックテキストのテキストエリアを配置します。
各テキストエリアに上記図のような変数をつけます。
それと、endという変数のテキストエリアを画面外に作成しました。
これは、PHPからの戻り値がちゃんと帰ってきたよーと知らせる
ために作成しました。別になくていいと思います。
後ほど説明します。
5.labelフレームを作成
3フレームにloadingというラベル名で
5フレームにrankというラベル名で作成。
6.各フレームにアクションを書きます
①スコア用のムービークリップは最初必要ないので隠しておきます。
//スコアを表示する"rank_clip"を隠す
rank_clip._visible = false;
rank_clip._visible = false;
②送信ボタンを押すまでこのフレームでストップ
//ストップ
stop();
stop();
③loading用のスクリプト(PHPから戻り値を待つ)
//PHPの戻り値でendの値が空だったら"loading"へ移動
//PHPの戻り値でendの値が1だったら"rank"へ移動
if(rank_clip.end == ""){
gotoAndPlay("loading");
}else if(rank_clip.end == 1){
gotoAndPlay("rank");
}
//PHPの戻り値でendの値が1だったら"rank"へ移動
if(rank_clip.end == ""){
gotoAndPlay("loading");
}else if(rank_clip.end == 1){
gotoAndPlay("rank");
}
④PHPからの戻り値を待つ用の繰り返し処理(flash lite1.1 onEnterFrameが使えないため)
//loading用
gotoAndPlay(_currentframe-1);
gotoAndPlay(_currentframe-1);
⑤スコア用のムービークリップを表示
//"rank_clip"を表示
rank_clip._visible = true;
rank_clip._visible = true;
⑥ストップ
//ストップ
stop();
stop();
以上でFlash Lite側はおしまい。
■PHP側(ranking.php)
早速コードを。文字コードはEUCで保存しています。
<?php
//1.au 対策 (auはPHPで文字列をechoする前にヘッダーの出力をしないと駄目)
header("Content-type:text/plain");
//2.スコアをflashからGETで受け取る
// 'や¥などの文字対策でaddslashesを使う
$SCR = addslashes($_GET['score']);
//名前をflashから受け取る
$Name = addslashes($_GET['name']);
//3.MySQLに接続
$conn =
mysql_connect('MySQLのサーバURL','MySQL に接続する際のユーザ名','接続パスワード') or die(mysql_error());
//4.データベースを選択
mysql_select_db('MySQL のデータベース名',$conn) or die(mysql_error());
//5.保存(INSERT) SQL文の組み立て
$sql = <<<EOS
INSERT INTO データベースのテーブル(id,score,name)
VALUES(NULL,'$SCR','$Name')
EOS;
//6.文字コードをデータベース用にUTF8に変換
$sql = mb_convert_encoding($sql,"UTF-8","auto");
//7.SQL文を実行
$res = mysql_query($sql,$conn);
$insert_flag = 1;
//データベースに保存したら
if($insert_flag == 1){
//8.呼び出し(SELECT) SQL文の組み立て
$sql = <<<EOS
SELECT score,name
FROM データベースのテーブル
ORDER BY score ASC
LIMIT 0,5
EOS;
//9.SQL文を実行
$res = mysql_query($sql,$conn);
//10.スコア用の配列を作成
$rank = array();
//名前用の配列を作成
$name = array();
//DBデータ保存配列用
$a = 0;
//11.問い合わせ結果を表示。繰り返し処理
while($row = mysql_fetch_array($res,MYSQL_ASSOC)){
//flash liteは一回しかデータが送れないためにDBのデータを配列に格納$row['score1']の方法でやろうと思ったがうまくいかなかった。
$rank[$a] = "$row[score]";
$name[$a] = "$row[name]";
文字コードをautoで携帯用shiftJISに変換
$name[$a] = mb_convert_encoding($name[$a],"SJIS","auto");
//繰り返す度に1プラス
$a++;
}
//12.Flash Liteに送る
echo "rank1=$rank[0]&rank2=$rank[1]&rank3=$rank[2]&rank4=$rank[3]&rank5=$rank[4]&name1=$name[0]&name2=$name[1]&name3=$name[2]&name4=$name[3]&name5=$name[4]&end=1";
}
//13.メモリー開放
mysql_free_result($res);
//接続を閉じる
mysql_close($conn);
?>
//1.au 対策 (auはPHPで文字列をechoする前にヘッダーの出力をしないと駄目)
header("Content-type:text/plain");
//2.スコアをflashからGETで受け取る
// 'や¥などの文字対策でaddslashesを使う
$SCR = addslashes($_GET['score']);
//名前をflashから受け取る
$Name = addslashes($_GET['name']);
//3.MySQLに接続
$conn =
mysql_connect('MySQLのサーバURL','MySQL に接続する際のユーザ名','接続パスワード') or die(mysql_error());
//4.データベースを選択
mysql_select_db('MySQL のデータベース名',$conn) or die(mysql_error());
//5.保存(INSERT) SQL文の組み立て
$sql = <<<EOS
INSERT INTO データベースのテーブル(id,score,name)
VALUES(NULL,'$SCR','$Name')
EOS;
//6.文字コードをデータベース用にUTF8に変換
$sql = mb_convert_encoding($sql,"UTF-8","auto");
//7.SQL文を実行
$res = mysql_query($sql,$conn);
$insert_flag = 1;
//データベースに保存したら
if($insert_flag == 1){
//8.呼び出し(SELECT) SQL文の組み立て
$sql = <<<EOS
SELECT score,name
FROM データベースのテーブル
ORDER BY score ASC
LIMIT 0,5
EOS;
//9.SQL文を実行
$res = mysql_query($sql,$conn);
//10.スコア用の配列を作成
$rank = array();
//名前用の配列を作成
$name = array();
//DBデータ保存配列用
$a = 0;
//11.問い合わせ結果を表示。繰り返し処理
while($row = mysql_fetch_array($res,MYSQL_ASSOC)){
//flash liteは一回しかデータが送れないためにDBのデータを配列に格納$row['score1']の方法でやろうと思ったがうまくいかなかった。
$rank[$a] = "$row[score]";
$name[$a] = "$row[name]";
文字コードをautoで携帯用shiftJISに変換
$name[$a] = mb_convert_encoding($name[$a],"SJIS","auto");
//繰り返す度に1プラス
$a++;
}
//12.Flash Liteに送る
echo "rank1=$rank[0]&rank2=$rank[1]&rank3=$rank[2]&rank4=$rank[3]&rank5=$rank[4]&name1=$name[0]&name2=$name[1]&name3=$name[2]&name4=$name[3]&name5=$name[4]&end=1";
}
//13.メモリー開放
mysql_free_result($res);
//接続を閉じる
mysql_close($conn);
?>
PHPのコードを書きましたが、
私自身、PHPもMySQLもド素人でして、今回初めてだったのですが、
この本がかなり役に立ちました。
話がそれてしまいました。元にもどりまして、
ソースの説明に、まず
1.header("Content-type:text/plain");
ですが、auでloadVariablesが動かないらしいとのことで、
動くようにはこの1文章を入れるといいというらしいです。
実際にこのFlashがauの携帯で動くのすら不明ですがね(笑)
だれかチェックしてもらえると嬉しいです。
2.$SCR = addslashes($_GET['score']);
$Name = addslashes($_GET['name']);
flash側 で送信ボタンのactionscriptに書いた
requrlのphp?以降の値がココに入ります。
また、カンマや¥マークなどが入力された時に
DBなどで問題が出ないようにaddslashes関数を使います。
3.$conn =
mysql_connect('MySQLURL','接続ユーザ','接続パスワード') or die(mysql_error());
mysql_connect()という関数で、簡単にDBに接続が行えます。
DBそのものがなんなのか分からない方はお勉強ですね。
私も良く分かっていません。。。できると便利ですね。
$connに接続IDを設定
4.mysql_select_db('データベース名',$conn) or die(mysql_error());
mysql_select_db関数で、使用するデータベースを選択します。
ちなみに or dieというのは、mysql_select_db()関数にエラーがあったら
PHPスクリプトの実行を終了するものです。
5.$sql = <<<EOS
INSERT INTO データベースのテーブル(id,score,name)
VALUES(NULL,'$SCR','$Name')
EOS;
PHPからデータをテーブルに挿入するためのSQL文です。
データベースのテーブルid,score,nameに
NULL,$SCR,$Nameを挿入します。
iここでのidは必要ありません。scoreとnameだけでもOKです。
データベースのテーブルはどうやってつくるの?
となると思うんですが、
私はphpMyAdminという便利なものでサクサク作成いたしました。
6.$sql = mb_convert_encoding($sql,"UTF-8","auto");
ここでは、携帯で入力された文字をUTF8にしてデータベースに保存するために
文字コードを変換しています。
携帯の文字コードはShift-JISらしいのですが、携帯から入力された文字が
PHPに読み込まれた時はEUCになるのかなど、よく分からず、色々試していたんですが、
分からなくて、悩んでいたら、"auto"というのが使えるらしいということをしって、
"auto"にしました。正直、これが合ってるのか分かりません。
私の携帯ではちゃんと表示されているから、これでって言う感じです。
7.$res = mysql_query($sql,$conn);
5.で設定したデータを挿入するためのコード$sqlを
mysql_query()関数を使って実行します。
この段階でFlashから受け取ったスコアデータと名前のデータが
データベースに登録されます。
8.$sql = <<<EOS
SELECT score,name
FROM データベースのテーブル
ORDER BY score ASC
LIMIT 0,5
EOS;
データベースからデータを呼び出してくるためのSQL文です。
scoreとname(フィールド名)を選択(SELECT)、
どこから?
データベースのテーブルから(FROM)
ORDER BY 列名 ASC で
指定した項目を昇順でソートする。
今回の場合はscoreの低い数ほど上にきます。
(0が一番上)
LIMITは呼び出してくる数です。
9. $res = mysql_query($sql,$conn);
7.と同じですね。今回は
mysql_query()を使って8.で設定したデータを呼び出してきます
10.$rank = array();
$name = array();
$a = 0;
とりあえずランキング用の配列と名前用の配列を新しく作成。
$aも後ほど説明します。
11.while($row = mysql_fetch_array($res,MYSQL_ASSOC)){
$rank[$a] = "$row[score]";
$name[$a] = "$row[name]";
$name[$a] = mb_convert_encoding($name[$a],"SJIS","auto");
$a++;
}
ここが一番はまりました。
データベースの問い合わせ結果を連想配列(MYSQL_ASSOC)に格納して表示して、
$row['score0']でscoreの一つ目が取得できるみたいな事が書いてあったのですが、
うまいこといかず、また、Flash Liteの場合は一度に一回しか通信ができないと
いうことで、echo一回で一度に全てのデータを送るようにしなくてはと色々試した結果
今回のような形になりました。すごい無理やり感があります。
Whileで繰り返し、配列$rankにデータベースのスコアデータを代入、
配列$nameに名前データを代入、また、名前の方は漢字やカタカナなどの文字も
使われる可能性があるということで、文字コードを携帯用にShift-JISに変換しています。
12.echo
"rank1=$rank[0]&rank2=$rank[1]&rank3=$rank[2]&rank4=$rank[3]&rank5=$rank[4]
&name1=$name[0]&name2=$name[1]&name3=$name[2]&name4=$name[3]&name5=$name[4]&end=1";
ここでFlashにデータを送ります。
Flash上のloadVariables(requrl,"rank_clip")で
指定した"rank_clip"内のテキストに
各データが挿入されます。
また、この文の最後にend=1という文がありますが、
この文がFlash側に読み込まれますと、
loading画面からランキング画面に移行するようになっています。
以上で、Flash Lite 1.1のloadVariables
を使ったPHPとMySQLのメモを終わりにします。