อยากถามผู้รู้ทุกท่านเกี่ยวกับการทำให้แฟลซลิ้งค์กับดาต้าเบสในการทำการสั่งซื้อสินค้าผ่านหน้าเว็บแฟลซ ผมจะทำจุลนิพนธ์ นะคับ อยากให้พี่ป้าน้าอา ช่วยเหลือผมด้วยนะคับ :46:
:09: ผมเคยใช้ flash ติดต่อ พวก asp หรือ php แล้วค่อยเอา asp หรือ php นั่นไปติดต่อฐานข้อมูลอีกทีนึงนะครับ
เขียนให้ flash ติดต่อกับ php หรือ asp พวกนั้น ในการรับส่งกับ DB อีกทีครับ
ว่าแต่ จุลนิพนธ์คืออะไรครับ ??
เฮีย top สอนหน่อยสิงับ
อ้างคำพูดจาก: Layiji เมื่อ 26 ส.ค. 2007, 01:17 น.
เฮีย top สอนหน่อยสิงับ
ลองตั้งโจทย์มาสิครับ ว่าอยากให้มันทำอะไร ?
สมมุติว่ามีข้อมูลใน Database แล้ว + สามารถเขียน PHP query ค่ามันออกมาได้
เราควร query ให้มันออกมาแบบไหนดีครับ
สมมุติว่า ค่ามันคือ ชื่อคน กับ comment (แอบมีตัวอัษรแปลกๆเช่น " ด้วย)
แล้ว เราจะเขียน action ยังไงเพื่อดึงค่าเหล่านี้ออกมาใช้ครับ :46:
เข้ามาเรียนด้วยครับ :25:
ประเด็นคือต้องสร้างภาครับ ภาคส่ง (และตัวเก็บค่า)
- ภาคส่ง ออกแบบโค้ดยังไงให้มันส่งค่า
- ภาครับ เขียนแฟลชอย่างไรให้ดูดค่านั้น
- ตัวเก็บข้อมูล (มีเรื่องของภาษาไทยด้วยดีไหมครับ)
เหมือนกับที่อ.เขาเคยเขียนไว้ในหนังสือ inspire ไหมครับ
อ้างคำพูดจาก: จักรพรรดิโรเนียว เมื่อ 26 ส.ค. 2007, 23:39 น.
เหมือนกับที่อ.เขาเคยเขียนไว้ในหนังสือ inspire ไหมครับ
แปลว่าผมไม่ต้องทำไรเพิ่มใช่มั๊ยครับ :P
เดี๋ยวมาเขียนให้ตามที่ว่ามานะครับ แต่ตอนนี้ไม่สบายครับ ขอพักก่อนนะครับ หายดีแล้วจะมาจัดการให้ครับ
ส่งเจ๊กัมไปช่วยลดพิษไข่ด้วน เอ้ย พิษไข้ด่วน
ในกรณีใช้แบบจริง ๆ จัง ๆ นะครับ
ผมแนะนำให้ใช้ amfphp ครับ www.amfphp.com (http://www.amfphp.com)
เป็น library สำหรับทำ flash remoting บน php ครับ ข้อดีของการใช้ flash remoting คือ เราสามารถ โยน Object ที่เป็น php Object (รวมทั้ง Array) ออกมาจาก php ได้เลย โดยที่ Flash ก็จะมี function parse ให้ object ที่โยนออกมานั้น แปลงกลับเป็น object หรือ array ใน flash
ยกตัวอย่างง่าย ๆ นะครับ เช่น เราอยากได้ result set ที่มาจาก mysql โดยที่เรา query อะไรซักอย่าง ถ้าเราใช้ function ของ php สำหรับ get result ของ mysql เล่น mysql_fetch_array เราจะได้ result set ออกมาเป็น array เลย เราก็เอา array นี้โยนใส่ amfphp ให้มัน return กลับมาที่ flash แล้ว flash ก็จะเอาใช้โดยมองมันเป็น array ได้เลย
ถ้าเราไปใช้ function ของ flash เช่น loadVar จะใช้เป็น array ไม่ได้เลยต้องกำหนดเป็น pair value เท่านั้น (a=123&b=456)
ลองศึกษาดูนะครับ ถ้ามีคำถามอะไรลองถามมาดูแล้วกัน :17:
ลืมบอกไปนิดครับ flash remoting จะมีข้อดีมาก ๆ อีกข้อคือ มันจัดการเรื่อง concurrent ทั้ง 2 ฝั่งให้ด้วย ในกรณีที่การใช้งานเยอะ ๆ (หลาย ๆ user พร้อม ๆ กัน) มันจะทำงานได้ดีกว่าการใช้ loadVar แบบธรรมดาครับ
ใช้ amfphp มะเป็น งิ
ลองหัดดูครับไม่ยาก
ถ้าใช้ php + action script เป็นอยู่แล้ว ศึกษาไม่นานน่าจะใช้ได้
ถ้ามีอะไรติดขัดลองถามได้ครับ ผมก็เริ่มใช้ไปได้ไม่เท่าไหร่
ขอบคุณครับ :27: เพิ่งรู้ว่ามันมีแบบนี้ด้วย+
สอนคร่าวๆได้มั้ยครับ
ผมเคยเห็นนานแล้ว แต่ไม่มีโอกาสได้ใช้เลย
เผื่ออ่านคร่าวๆแล้ว get จะได้ลองเอามาเล่นครับ :46:
คร่าว ๆ amfphp จะประกอบด้วย 3 ส่วนนะครับ
1. action script + lib ของ amfphp ซึ่งเป็น flash remoting เอาไว้ call method ที่เขียนไว้บน server ที่เป็น php
2. ส่วนของ server ในการจัดการ service ที่เขียนไว้เป็น php
3. code ของ php ที่เราเขียนขึ้นมาเอง ซึี่่งจะถูกเรียกใช้ในส่วนที่ 2
1 + 2 เราสามารถ download ได้จาก web site เค้าได้เลย
1. เป็น include file สามารถใช้ได้เลย
2. เป็น package เราต้องเอามา install เอง ถ้าใช้ server ที่เป็น linux ก็ unzip + tar ก็ใช้ได้เลย (ไม่เคยลองบน windows นะ แต่ิคิดว่าใช้ได้เหมือนกัน)
เมื่อเรา install package ใน ข้อ 2 แล้วมันจะมี tool เป็น web application ให้เรา สามารถ test function ที่เราเขียนขึ้นได้ง่าย ๆ ก่อนที่เราจะเอาไปเรียกใช้จริง ๆ จาก ข้อ 1 เช่น พวก hello world (ลองเอามา install แล้วลองเปิด tool มันดูถ้าเขียน php เป็นเห็นแล้วจะเข้าใจทันที)
การทำงานก็อย่างที่บอกมี 3 ส่วน
[ Flash ] ----> [ Service Manager ] ----> [ php code ] <--> [ DB ]
ทีนี้มันง่ายตรงไหนถ้าใช้ flash remoting
มันง่ายตรงการรับส่งค่าระหว่าง Flash <---> php จากเดิมที่เราใช้ loadVar หรืออะไรก็แล้วแต่ php หรือ server script ต้อง return ออกมาเป็น pair value เช่น a=123&b=345 อะไรทำนองนี้ แต่ถ้าเราใช้ lib ที่บอก เราสามารถ return result set จากการ query ออกมาได้เลย เช่น
/* syntax ไม่รู้ถูกเปล่านะเขียนสด ๆ เลย >< */
$rows = mysql_fetch_rows($rs);
return $rows
ตัว service manager จะทำการ serialize ออกเป็น string ยาว ๆ คล้าย ๆ กลับการใช้ ajax แล้วก็ส่งกับไปทาง flash โดย flash ก็จะ unserialize กลับเป็น object สามารถใช้งานได้ทันที
ใน flash ก็จะอ้างเป็น $rows["fieldname"] ..... อะไรก็ว่าไป
ประมาณนี้แหละครับ
return ออกมาเป็นอาร์เรย์ธรรมดาๆ ก็ได้ใช่มั้ยครับ
น่าสนแฮะ :04:
ป.ล. จะเอาวิธีแบบ manual อยู่มั้ยครับ? เดี๋ยวผมทำ Tutorial ให้
เอาครับ :25:
มาด้วยความรวดเร็ว :42:
Code ต่อไปนี้ทำเพื่อสอนเป็นตัวอย่างครับ ไม่ได้เสร็จสมบูรณ์ทั้งหมด (การเช็คตัวอักษร, ความถูกต้อง ฯลฯ)
แต่สามารถนำไป Apply และเพิ่มเติมได้เองครับผม
=========================
ไฟล์ทั้งหมด- test_query.php (เอาไปไว้ใน Appserv\www\.... ครับ)
- fl_db.fla (ผมทำใน Flash CS3 ครับ แต่ Save เป็น Flash 8 ให้)
- fl_db.swf
โปรแกรมที่ใช้- Flash MX ขึ้นไป (แนะนำ Flash 8 ขึ้นไปครับ จะได้โหลดไฟล์ของผมไปดูได้)
- Text Editor เช่น Editplus, Notepad หรือจะ Dreamweaver สำหรับทำ PHP
- Appserv สำหรับจำลองเครื่องเพื่อทดสอบ PHP
-------------------------------------
PHPทำส่วนของ PHP ก่อนนะครับ จะได้ไม่งง ^^
**อ่านก่อน**
1. ให้สร้าง Database พร้อมตารางและข้อมูลครับ หรือถ้ามีอยู่แล้วก็เลือกไว้ในใจเลยนะครับ
2. ใช้ code ด้านล่าง ปรับแต่งให้ตรงกับ Username/Password และฐานข้อมูล รวมถึงตารางและ Attribute ของตารางที่ใช้อยู่ด้วยนะครับ
**********
สำหรับฐานข้อมูลของผม มีโครงสร้างตามนี้ครับ
ฐานข้อมูล: test
ตาราง: highscore
มี 3 Fields (Attributes) ครับคือ id, user, และ score
>>
id เป็น Primary key, Auto increment ชนิด INT(2)
>>user ชนิด VARCHAR(20)
>>score ชนิด INT(6)
SQL ทั้งหมด (ตั้งแต่สร้างตารางและเพิ่มข้อมูลลงในตาราง)CREATE DATABASE `test` DEFAULT CHARACTER SET tis620 COLLATE tis620_thai_ci;
USE `test`;
--
-- Table structure for table `highscore`
--
CREATE TABLE `highscore` (
`id` int(2) NOT NULL auto_increment,
`user` varchar(20) NOT NULL,
`score` int(6) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
INSERT INTO `test`.`highscore` (`id` ,`user` ,`score`)
VALUES (NULL , 'korstudio', '152075'), (NULL , 'aloha', '78520');
**หมายเหตุ**
โดยปกติแล้ว เมื่อลง Appserv จะมีฐานข้อมูลที่ชื่อ test ให้อัตโนมัติครับ
ใน PHP ครับ
<?
$conn_sv = "localhost"; //Host โดยปกติจะเป็น localhost
$conn_user = "root"; //Username สำหรับเชื่อมต่อไปยัง SQL
$conn_pw = "1234"; //Password
$conn_db = "test"; //Database name
@mysql_connect($conn_sv,$conn_user,$conn_pw)or die("Cannot connect to database");
@mysql_select_db($conn_db)or die("Cannot select database");
@mysql_db_query($conn_db,"SET NAMES tis620"); //เนื่องจาก MySQL 5ขึ้นไปจะใช้ Encoding แบบ UTF8 แต่เผื่อมีการติดต่อโดยใช้ encoding เป็น TIS-620 และเพื่อไม่ให้เกิดปัญหากับภาษาไทยในฐานข้อมูล โดยที่ข้อมูลเป็น TIS-620ครับ
//เริ่ม Query ข้อมูล
$sql = "select * from `highscore` where `id` = 1"; //เอาข้อมูลที่ id เป็น 1 ออกมา
$rs = mysql_query($sql) or die("Cannot query"); //สั่งทำ SQL
$rt = mysql_fetch_array($rs); //รับข้อมูลที่ Query ออกมาในรูปแบบ Array
$data_id = $rt["id"]; //รับข้อมูลที่คอลัมน์ id
$data_user = $rt["user"]; //รับข้อมูลที่คอลัมน์ user
$data_score = $rt["score"]; //รับข้อมูลที่คอลัมน์ score
//ส่งค่าออกไปให้ Flash
echo "score_id=".$data_id."&user=".$data_user."&scores=".$data_score;
?>(http://korstudio.27cstudio.com/tutorials/loadvars/SNAG-0000.jpg)
ถ้าไม่เกิดปัญหาอะไร เมื่อทดสอบรัน PHP แล้วจะได้ผลลัพธ์ออกมาตามนี้ครับ
อ้างอิงscore_id=1&user=korstudio&scores=152075
(http://korstudio.27cstudio.com/tutorials/loadvars/SNAG-0003.jpg)
ไปลุยใน Flash ต่อเลยครับ
-----------------------------
FLASH**อ่านก่อน**
1. สร้างไฟล์ กว้าง-ยาวเท่าไหร่ก็ได้ครับ (ในตอนนี้จะให้ trace ออกมาทาง Output อย่างเดียว)
2. สำหรับ Flash CS3 เวลาสร้างไฟล์ใหม่ ให้เลือก
Flash File (ActionScript 2.0) ครับ
**********
AS หลักๆ ที่ใช้
- LoadVars class -> สำหรับการติดต่อกับไฟล์ PHP ครับผม (จริงๆ แล้วติดต่อกับไฟล์ได้หลายชนิดครับ เช่น ASP, JSP, TXT, ...)
**ไว้ผมจะอธิบาย LoadVars class ทีหลังนะครับ (ThaiFlashDev ก็ไม่เปิดซะที - -")
ลุย Script ครับ
Flash AS (Frame 1)stop(); //กันไหลไปเฟรมอื่น
var test_lv = new LoadVars(); //สร้างตัวแปร LoadVars
/////สร้าง function ที่จัดการเมื่อทำการติดต่อ+ดึงข้อมูลกับ PHP เสร็จแล้ว
test_lv.onLoad = function(done){
if(done){
//เมื่อการดึงข้อมูลเสร็จสมบูรณ์ไร้ปัญหา
trace("*****ข้อมูลที่อ่านได้จากฐานข้อมูล 'test' ตาราง 'highscore' ที่ 'id' = 1*****");
trace("id: "+this.score_id); //trace ตัวแปร score_id ที่มาจาก PHP
trace("user: "+this.user); //trace ตัวแปร user ที่มาจาก PHP
trace("scores: "+this.scores); //trace ตัวแปร scores ที่มาจาก PHP
trace("**********************************************************************");
}else{
//ถ้าไม่สำเร็จ ก็ว่ากันไป -..-
}
}
/////สั่งดึงข้อมูลจากไฟล์ PHP
test_lv.load("http://localhost/kstests/test_query.php");(http://korstudio.27cstudio.com/tutorials/loadvars/SNAG-0001.jpg)
เมื่อรันแล้วจะได้ผลตามด้านล่างครับ
อ้างอิง*****ข้อมูลที่อ่านได้จากฐานข้อมูล 'test' ตาราง 'highscore' ที่ 'id' = 1*****
id: 1
user: korstudio
scores: 152075
**********************************************************************
(http://korstudio.27cstudio.com/tutorials/loadvars/SNAG-0002.jpg)
เสร็จแล้ว ^^
==============================
จุดสังเกต1. ที่ PHP บรรทัดที่มีการ echo จะต้อง
echo ออกมาในรูปแบบ pair value ครับ คือ ตัวแปร1=ค่าตัวแปร1&ตัวแปร2=ค่าตัวแปร2
2. ถ้าใน PHP เราจัดการ echo ในชื่อตัวแปรอะไร ใน Flash ก็ต้องเรียกใช้ชื่อนั้นครับ เช่น จากโค้ดที่ผมทำ
echo "score_id=".$data_id."&user=".$data_user."&scores=".$data_score;
ใน Flash ผมก็เรียกใช้ตัวแปรพวกนั้นตามนี้ครับ
trace("id: "+this.score_id);
trace("user: "+this.user);
trace("scores: "+this.scores);
3. อย่าลืมแก้ Path ของไฟล์ PHP ที่จะดึงด้วยนะครับ
==========================
สำหรับข้อมูลที่ส่งมาหลายๆ ตัว ต้อง Serialize หรือนำข้อมูลที่มีมาต่อๆ กันโดยใช้ตัวคั่นด้วยครับ เช่น
echo "score_id=1||2||3||4&user=korstudio||aloha||testuser||aaaa&scores=150725||70528||112635||125000";แล้วใน Flash ค่อยทำการ Split ค่าที่ได้อีกทีครับ :42:
ดาวน์โหลดไฟล์ตัวอย่างloadvars.zip (http://korstudio.27cstudio.com/tutorials/loadvars/loadvars.zip)
:07b: ++
โอเค ขอบคุณมากครับ :12:
อ้างคำพูดจาก: korstudioXD เมื่อ 28 ก.ย. 2007, 15:18 น.
return ออกมาเป็นอาร์เรย์ธรรมดาๆ ก็ได้ใช่มั้ยครับ
น่าสนแฮะ :04:
ป.ล. จะเอาวิธีแบบ manual อยู่มั้ยครับ? เดี๋ยวผมทำ Tutorial ให้
ใช่แล้วครับ เพราะ เดี๋ยวมันก็ถูกแปลงเป็น object ใน flash เอง จริง ๆ แล้ว array ใน flash ก็ เป็น object แบบนึงนะ
:46: มากราบขออภัยที่บอกไว้ว่าจะมาทำ Tutorial ให้ แต่ไม่ได้เข้ามาทำให้สักที
จริงๆ ทำไว้ครึ่งๆ กลางๆ แล้วพอดีไม่สบายมาเดือนนึงแล้วครับ ช่วงนี้หมอไม่ให้ทำงานหน้าคอมนานๆ
แต่วิธีหลักๆ พื้นฐานที่ไม่ต้องลงอะไรเพิ่มเลย การรับ/ส่งก็แบบที่ KorStudioXD เขียนครับ
กรณีที่เราต้องการส่ง record มากกว่า 1 record หลายคนจะใช้วิธีสร้างตัวแปรต่อๆกันไป แบ่งด้วย ; เป็นต้น
แล้วเข้ามาแยกใน Flash เป็นต้น
หลังๆ วิธีที่นิยมใช้คือใช้ XML เข้าร่วม เพราะจัดข้อมูลให้อยู่ในรูป record อยู่แล้ว
คล้ายๆ กับที่ทำให้ดูตัวอย่าง XML ที่อ่าน RSS อันก่อนครับ
อีกวิธีที่ไม่ต้องลงอะไรเพิ่มคือการใช้ serialize ส่งข้อมูลจาก PHP เข้า Flash เป็น Array ก็จะได้ record ทั้งหมดได้เหมือนกัน
แต่วิธีนี้ผมเคยใช้แล้ว มันไม่ work กับภาษาไทยครับ อาจจะต้องมีการแก้ไขเพิ่มเติมเพื่อให้ใช้ได้
วิธีที่สะดวกสุด คือ เอา record ทั้งหมดที่ query มาใช้ใน Flash ทำให้ Flash สามารถเลือก record มาใช้ได้
เหมือนมองเห็น DB ก็คือใช้ตัว amfphp เพิ่มเข้าไปให้สามารถจัดการตรงนั้นได้แบบที่คุณ Wutty แนะนำครับ
ซึ่งก็จะเหมาะกับคนที่สามารถเพิ่มส่วนนี้ในการใช้งานได้
กรณีที่ไม่สามารถเพิ่มส่วนต่อเติมเข้าไปได้ ผมใช้แบบ XML ในการส่งเข้า Flash ครับ :46:
อ้างคำพูดจาก: X Saint เมื่อ 29 ก.ย. 2007, 04:20 น.
อีกวิธีที่ไม่ต้องลงอะไรเพิ่มคือการใช้ serialize ส่งข้อมูลจาก PHP เข้า Flash เป็น Array ก็จะได้ record ทั้งหมดได้เหมือนกัน
แต่วิธีนี้ผมเคยใช้แล้ว มันไม่ work กับภาษาไทยครับ อาจจะต้องมีการแก้ไขเพิ่มเติมเพื่อให้ใช้ได้
check encoding ก่อนเป็นอย่างแรกเลยครับ
ถ้าจำไม่ผิดนะครับ ภาษาไทยใน flash จะต้องใช้ UTF8 ดังนั้น web server ยกตัวอย่าง apache นะครับ (iis ผมใช้ไม่เป็น :29:) ถ้าไม่อยากมีปัญหาให้ set default charset เป็น UTF8 ด้วย
ในส่วนของ DB เช่น mysql
1. check ก่อนว่า DB และ Table ที่สร้างขึ้น collation เป็น UTF8 หรือเปล่า ถ้าไม่ใช่ ต้องแก้ให้เป็น UTF8 นะครับ
2. check input เข้า DB เป็น UTF8 หรือเปล่า (ถ้าใช้ php ให้ดูใน php.ini)
3. query ออกมา เป็น UTF8 หรือเปล่า mysql ใช้ function "Set Name UTF8" ก่อน query (name มี s หรือเปล่าไม่น่าใจ UTF-8 หรือ UTF8 เฉย ๆ ลองเองนะขออภัยที่จำแบบแน่ ๆ ไม่ได้)
วิธี check ฝั่ง DB
1. check ว่า data ที่อยู่ใน database เป็น UTF8 หรือเปล่าให้ใช้ คำสั่ง ที่ command line "mysqldump" จะมี option set-defaul-charset กำหนดให้เป็น UTF8 นะครับ จะได้ UTF8 ออกมาชัวร์ ๆ จากนั้นลองเอาเข้า text editor ที่สามารถอ่าน UTF8 ได้ใช่ notepad++ (notepad++ ไม่มี font ภาษาไทยก็จริงแต่ถ้าเป็นภาษาไทยจะเห็นเป็น character แบบที่ไม่ font ไม่ใช่เห็นเป็นขยะแปลก ๆ)
2. check ว่าขาเข้าถูกต้องก็ลองเขียน php insert ข้อมูลที่เป็นภาษาไทยดู แล้วลองทำตามข้อ 1
การ test ในข้อ 1 ไม่ควรใช้ tool เช่น phpmyadmin dump ออกมา เพราะว่าเราต้องไป check ว่า phpmyadmin มัน set collation ที่ติดต่อกับ mysql เป็นอะไร (จริง ๆ ก็ check ได้จาก config ของ phpmyadmin นั่นแหละ) บางที ใน DB เป็น UTF8 ถูกแล้วแต่ว่าใน phpmyadmin connect ด้วย TIS620 มัน dump ออกมาก็ผิดอยู่ดี ใช้ mysqldump ชัวร์กว่า
อ่า... คือ serialize ที่บอกมันไม่ได้มีปัญหาเรื่องการแสดงผลภาษาหน่ะครับ คือแสดงได้ถูกต้องเพราะเป็น UTF8
แต่คำสั่ง serialize ของ PHP มันจะเป็นการสร้างรูปแบบตัวแปรต่างๆ ให้อยู่ในรูป String แล้วส่งให้ Flash ซึ่งพอเป็นภาษาไทยมันมีการ count ผิดหน่ะครับ อันนี้คือพูดถึงอีกตัวนะครับ ไม่ใช่พูดถึงตัว amfphp ตัวนั้นครับ
ok ครับ มาแก้ตัวให้ จะทำให้ดูทุกแบบเลยนะครับ ถ้าต้องการ...
ผมทำแบบที่ไม่ต้องลงอะไรเพิ่มก่อน เรียก record เข้ามาได้หลายๆ record ในรูปของ XML นะครับ
ใช้ฟังก์ชั่นเดิมสั้นๆ ที่เคยเขียนไว้ตอนทำ rssReader ในตัวอย่างที่แล้ว
ผมจะแยกไฟล์เป็น 2 ส่วน คือ ส่วนแสดงผล และส่วนเพิ่มค่าลงใน DB เพื่อให้เข้าใจง่าย
ด้านซ้ายจะเป็นส่วนเพิ่มเข้าไป comment insert และด้านขวาจะเป็นส่วนแสดงผล comment display ครับ
http://www.x-sense.com/project/asExam/xmlDB/cmtInsert.swfhttp://www.x-sense.com/project/asExam/xmlDB/cmtDisplay.swf
ในส่วนของการใส่ค่าเข้า DB ก่อนทางด้านซ้าย
ส่วน Flash
var urlRead:String = "http://www.x-sense.com/project/asExam/xmlDB/cmtInsert.php";
var lvComment:LoadVars = new LoadVars();
var error:Boolean=false;
lvComment.onLoad = function(success:Boolean) {
if(success) {
inpName.text="";
inpComment.text="";
} else {
inpName.text="";
inpComment.text="error";
}
};
btnSent.onPress = function() {
if(inpName.text==""||inpName.text=="Enter Name"){
inpName.text="Enter Name";
error=true;
}
if(inpComment.text==""||inpComment.text=="Enter Comment"){
inpComment.text="Enter Comment";
error=true;
}
if(!error) {
lvComment.inpName = inpName.text;
lvComment.inpComment = inpComment.text;
lvComment.sendAndLoad(urlRead,lvComment,"POST");
} else {
error=false;
}
}
ส่วนนี้จะเห็นว่าไม่มีอะไรมาก ปกติการเพิ่มค่า เราเพิ่มทีละ record อยู่แล้ว ก็ส่งตัวแปรผ่านทางออปเจ็ค loadVars ไปให้กับ php ได้เลย
ในส่วนของปุ่ม btnSent นั้น แค่มีการเช็คว่ามีการใส่ค่าให้กับ textField หรือยัง ถ้ามีค่าแล้วก็ส่งเข้าไปทางเมธอด sendAndLoad ซึ่งเป็นการส่ง และรับค่ากลับ ในที่นี้เรารับค่ากลับจาก php ว่าการบันทึกข้อมูลสำเร็จหรือไม่
ถ้าสำเร็จจะไปทำงานที่ lvComment.onLoad ส่วน success เพื่อเคลียร์ค่าใน Text Field สำหรับเตรียมรอรับค่าใหม่ต่อไป
ส่วน PHP
<?
//CONNECT DB
require("connection.inc.php");
$name = $_POST['inpName'];
$comment = $_POST['inpComment'];
$qstring = "INSERT INTO testComment (name,comment) VALUES ('$name','$comment')";
$query = mysql_query($qstring) or die ("pass=0");
print "pass=1";
?>
ในส่วนของ php จะเห็นว่าไม่มีอะไร โดยปกติผมจะพยายามสร้างภาระไว้ที่ Flash ใน PHP จะทำงานน้อยๆ เฉพาะที่จำเป็น
จุดนี้ก็คือให้เอาค่าเขียนลงไปใน DB ตรงๆ แล้วส่งค่า pass กลับเพื่อบอกว่าสำเร็จหรือไม่
ส่วนการแสดงผล
ส่วน Flash
var urlRead:String = "http://www.x-sense.com/project/asExam/xmlDB/cmtRead.php";
var lvComment:LoadVars = new LoadVars();
var xmlComment:XML = new XML();
xmlComment.ignoreWhite = true;
function getNodeText(inNode:XMLNode, tagName:String):String {
if (inNode.nodeName == tagName) {
return inNode.firstChild.toString();
} else if (inNode.nextSibling != null) {
return getNodeText(inNode.nextSibling, tagName);
}
}
function dispData(xmlData:XMLNode):Void {
var aItem:Array = xmlData.childNodes;
for(var j:Number=0;j<aItem.length;j++) {
var sName:String = getNodeText(aItem[j].firstChild, "name");
var sComment:String = getNodeText(aItem[j].firstChild, "comment");
dispComment.htmlText += "<b>Name</b> : "+ sName+"\n";
dispComment.htmlText += "<b>Comment</b> : "+ sComment+"\n\n";
}
}
lvComment.onLoad = function(success:Boolean) {
if(success) {
dispComment.text="";
xmlComment.parseXML(this.flashVar);
dispData(xmlComment.firstChild);
} else {
dispComment.text="error";
}
};
btnReload.onPress = function() {
lvComment.load(urlRead);
}
lvComent.load(urlRead);
ในส่วนนี้นอกจากใช้ออปเจ็ค loadVars แล้ว จะเห็นว่าผมสร้างออปเจ็ค XML ขึ้นมาด้วย เพื่อใช้รับค่าที่ได้กลับมาจาก PHP ครับ
การทำงานจริงๆ จะอยู่ที่ส่วนฟังก์ชั่น dispData ที่ถูกเรียกใช้เมื่อได้มีการโหลดค่าจาก PHP กลับเข้ามายัง onLoad ของ lvComment แล้ว แล้วก็เอาค่า XML มากระจายเข้าให้อยู่ในรูป Array แล้วแสดงผลออกไปบน Text Field ที่วางไว้
กลไกตรงนี้เอาฟังก์ชั่นสั้นๆ getNodeText จากตัวอย่างก่อนกลับมาใช้ตรงๆ โดยไม่ต้องแก้อะไรเลย ฟังก์ชั่นนี้ทำมาให้เพื่อสะดวกในการดึงค่าของ TAG ที่ระบุชื่อเข้าไปออกมาให้กับตัวแปรชั่วคราวเพื่อแสดงผลครับ
ส่วน PHP
<?
//CONNECT DB
require("connection.inc.php");
$qstring = "SELECT * FROM testComment ORDER BY id";
$query = mysql_query($qstring) or die ("flashVar=error");
$record="<?xml version=\"1.0\"?>";
$record.="<recordSet>";
while($rec = mysql_fetch_array($query)) {
$record.="<record>";
$record.="<name>".$rec['name']."</name>";
$record.="<comment>".$rec['comment']."</comment>";
$record.="</record>";
}
$record.="</recordSet>";
print "flashVar=".urlencode($record);
?>
ส่วน PHP นี่ก็จะ query ค่าทั้งหมดใน table นั้นออกมา แล้วมาจัดเรียงค่าให้อยู่ในรูป XML แบบง่ายๆ แล้วก็ส่งกลับให้อยู่ภายในตัวแปร flashVar ซึ่ง Flash จะมองเห็นเป็น String แล้วเราก็เอาไป parseXML เพื่อเปลี่ยนให้อยู่ในรูป XML ภายใน Flash ครับ
ตัว amfphp นั้นติดไว้ก่อนครับ เครื่องผมมีแต่ flash cs3 ซึ่ง adobe เอา flash remoting ออกไปแล้ว
จริงๆ เหมือนว่าจะเอา class lib จาก flash 8 มาใส่ได้ แต่เครื่องผมก็ไม่มี flash 8 แล้วเช่นกัน เลยยังไม่ได้ทำครับ
ถ้าใครมีก็ขอไฟล์หน่อยนะครับ :46:
อ้างคำพูดจาก: X Saint เมื่อ 30 ก.ย. 2007, 01:25 น.
อ่า... คือ serialize ที่บอกมันไม่ได้มีปัญหาเรื่องการแสดงผลภาษาหน่ะครับ คือแสดงได้ถูกต้องเพราะเป็น UTF8
แต่คำสั่ง serialize ของ PHP มันจะเป็นการสร้างรูปแบบตัวแปรต่างๆ ให้อยู่ในรูป String แล้วส่งให้ Flash ซึ่งพอเป็นภาษาไทยมันมีการ count ผิดหน่ะครับ อันนี้คือพูดถึงอีกตัวนะครับ ไม่ใช่พูดถึงตัว amfphp ตัวนั้นครับ
จากที่อ่านผมเข้าใจว่าให้ php serialize ออกมาแล้ว แล้วมันใช้ภาษาไทยไม่ได้ใช่มั้ยครับ
ถ้าผมเข้าใจถูกก็คือต้อง check web server ครับว่าใส่ header ออกมาเป็นอะไร
๊และอีกอย่าง UTF8 ภาษาไทย 3 byte นะครับ (maximun ของ UTF8 อยู่ที่่ 4 byte) ถ้าคิดแค่ 2 byte ไป convert เองใน flash จะผิดได้
อ้างคำพูดจาก: X Saint เมื่อ 30 ก.ย. 2007, 17:07 น.
ตัว amfphp นั้นติดไว้ก่อนครับ เครื่องผมมีแต่ flash cs3 ซึ่ง adobe เอา flash remoting ออกไปแล้ว
จริงๆ เหมือนว่าจะเอา class lib จาก flash 8 มาใส่ได้ แต่เครื่องผมก็ไม่มี flash 8 แล้วเช่นกัน เลยยังไม่ได้ทำครับ
ถ้าใครมีก็ขอไฟล์หน่อยนะครับ :46:
class amfphp ที่เป็น flash remoting download จากที่นี่เลยครับ http://www.adobe.com/products/flashremoting/downloads/components/ (http://www.adobe.com/products/flashremoting/downloads/components/)
เหมือนกับว่าผมจะทำอะไรสักอย่างพัง :44:
อ้างคำพูดจาก: WuTtY เมื่อ 30 ก.ย. 2007, 19:52 น.
จากที่อ่านผมเข้าใจว่าให้ php serialize ออกมาแล้ว แล้วมันใช้ภาษาไทยไม่ได้ใช่มั้ยครับ
ถ้าผมเข้าใจถูกก็คือต้อง check web server ครับว่าใส่ header ออกมาเป็นอะไร
๊และอีกอย่าง UTF8 ภาษาไทย 3 byte นะครับ (maximun ของ UTF8 อยู่ที่่ 4 byte) ถ้าคิดแค่ 2 byte ไป convert เองใน flash จะผิดได้
class amfphp ที่เป็น flash remoting download จากที่นี่เลยครับ http://www.adobe.com/products/flashremoting/downloads/components/ (http://www.adobe.com/products/flashremoting/downloads/components/)
อ้า... ไม่ใช่ครับ แสดงผลเป็นภาษาไทยครับ แต่ serialize ใน php มันจะ return ค่าของตัวแปรแต่ละตัวมาพร้อมกับจำนวน string กำกับไว้ด้วย ที่เคยลองคร่าวๆ พอใช้ภาษาไทย (ซึ่งเป็น UTF-8 แน่นอนครับ เพราะใช้กับวิธีอื่นก็ไม่มีปัญหา) มันจะนับมามากกว่าตัวอักษรไทย ทำให้พอ flash ไป unserialize มันเลยเลยเถิดไปถึงตัวแปรตัวถัดๆ ไปด้วยครับ ตัวที่นับผิดนี่ผมดูแล้วมันผิดตั้งแต่ php จากคำสั่ง serialize ตรงๆ ยังไม่ได้เข้า flash ครับ...ถ้ามีวิธีแก้แนะนำด้วยนะครับ
ตัว remoting ที่บน adobe นั้นผมลองโหลดแล้วเหมือนกันครับ เหมือนมันลงกับ cs3 ไม่ได้หรือเปล่าครับ
พอกด install มันก็เหมือนว่าพยายามหา หาไม่เจอก็เลยให้ finish ... ลอง search ในเน็ทดูแล้วเหมือนกัน มีคนที่ใช้ cs3 มีปัญหานี้กันเยอะ มีคนทำเป็น zip ให้ แต่เหมือน link มันตายไปแล้ว
อ้างคำพูดจาก: X Saint เมื่อ 01 ต.ค. 2007, 01:05 น.
อ้า... ไม่ใช่ครับ แสดงผลเป็นภาษาไทยครับ แต่ serialize ใน php มันจะ return ค่าของตัวแปรแต่ละตัวมาพร้อมกับจำนวน string กำกับไว้ด้วย ที่เคยลองคร่าวๆ พอใช้ภาษาไทย (ซึ่งเป็น UTF-8 แน่นอนครับ เพราะใช้กับวิธีอื่นก็ไม่มีปัญหา) มันจะนับมามากกว่าตัวอักษรไทย ทำให้พอ flash ไป unserialize มันเลยเลยเถิดไปถึงตัวแปรตัวถัดๆ ไปด้วยครับ ตัวที่นับผิดนี่ผมดูแล้วมันผิดตั้งแต่ php จากคำสั่ง serialize ตรงๆ ยังไม่ได้เข้า flash ครับ...ถ้ามีวิธีแก้แนะนำด้วยนะครับ
ปัญหานี้ผมเคยเจอคล้าย ๆ กันนะครับ แต่ไม่ได้เจอกับ function serialize ปัญหาที่ผมเจอเกิดจากการ UTF8 ของ ภาษาไทย 1 character มัน 3 Byte ครับ อย่างที่บอกไปก่อนหน้านี้ แล้วเวลาส่งไปให้ โปรแกรมอื่นแปลงกลับมันจะนับ byte ผิดครับทำให้แปลงผิด
วิธี check ลองใช้พวก tools ที่มันอ่าน hex ได้แล้วลองเปิดตาราง unicode เทียบดูครับ ถ้ามี linux ใช้ ord ลองก็ได้
พอจะมีตัวอย่างที่ serialize ออกมามั้ยครับจะได้ลองดูหน่อยว่ามันเป็นยังงัย
ส่วน package ผม เคย install ไว้ในเครื่องอีกเครื่องครับ เดี๋ยวจะกลับบ้านไปหาก่อนนะครับ ไม่แน่ใจว่าตัว package ที่เป็น zip ยังมีอยู่หรือเปล่า จำได้ว่าคราวที่แล้วผมลง manual เหมือนกัน ต้อง copy แล้วไปแตกใส่ library ของ as2 เอาเอง
ใช่ครับ สำหรับ cs3 ต้องลง manual เอาเอง เห็นใน net บาง forum เค้าจะมีคน zip ให้ แล้วก็บอกว่าใส่ไฟล์ไหนไว้ folder ไหน แต่ผมเข้าไปโหลด link พวกนั้นมันตายไปหมดแล้ว
ใช่ครับปัญหา byte ต่างกันนั่นแหล่ะครับ ซึ่งผมสังเกตว่าตัวอักษรไทยแต่ละตัวให้ byte นับออกมาไม่เท่ากันด้วย
ลองง่ายๆ ครับใช้ serialize($array) ใน php ไม่ต้องลงอะไรเพิ่มเลย แล้วก็ print มันออกมา จะเห็นว่าส่ง byte count แต่ละ ตัวแปร หรือแต่ละ member ของ array ไว้ด้วย
อ้างคำพูดจาก: X Saint เมื่อ 01 ต.ค. 2007, 12:20 น.
ใช่ครับ สำหรับ cs3 ต้องลง manual เอาเอง เห็นใน net บาง forum เค้าจะมีคน zip ให้ แล้วก็บอกว่าใส่ไฟล์ไหนไว้ folder ไหน แต่ผมเข้าไปโหลด link พวกนั้นมันตายไปหมดแล้ว
ใช่ครับปัญหา byte ต่างกันนั่นแหล่ะครับ ซึ่งผมสังเกตว่าตัวอักษรไทยแต่ละตัวให้ byte นับออกมาไม่เท่ากันด้วย
ลองง่ายๆ ครับใช้ serialize($array) ใน php ไม่ต้องลงอะไรเพิ่มเลย แล้วก็ print มันออกมา จะเห็นว่าส่ง byte count แต่ละ ตัวแปร หรือแต่ละ member ของ array ไว้ด้วย
ถ้าภาษาไทยเลยนะครับ codepage อยู่ใน range ของภาษาไทยทั้งหมด จะเป็น 3 byte ครับ เช่น
ตัวอักษร "ก" ถ้าเป็น unicode ก็คือ "0x0E01" แต่เวลาใช้จริง ๆ มันต้องถูกแปลงให้เป็น 3 byte โดยมันก็จะมีวิธีตัดของมัน เช่น เอา 6 bit แรกไปป่ะ "00" 6 bit ถัดมาไปแป๊ะ "01" อะไรทำนอง ยำกันจนได้ออกมาเป็น 3 byte ครับ
เท่าที่รู้ ภาษาอังกฤษ เป็น 1 byte ภาษาญี่ปุ่นเป็น 3 byte เหมือนภาษาไทย
ดังนั้นส่ิ่งที่มันส่งผลคือ database ที่เราสร้างไว้ เช่นเป็น Varchar 1000 มันจะเก็บตัวอักษรได้ไม่ถึง 1000 ตัวขึ้นกับ ภาษาที่เราเก็บว่าเป็นภาษาอะไรด้วย
:48: ตามอ่านไม่ทันเลย :05:
ไม่เป็นไรเดี่ยวให้ทุกคนพิมพ์ซ้ำอีกรอบ
lib ของ flash remoting นะครับ
คิดว่าเป็นอันนี้
ลองเอาไปลงดูก่อนนะครับ
http://www.google.co.th/search?q=flash++database (http://www.google.co.th/search?q=flash++database)
---------
ถ้า database ไม่ใหญ่และเป็นเด็กรุ่นใหม่(สงสัยไม่รวมผม)
แนะนำ AIR + SQLite
http://danny-t.co.uk/index.php/2007/06/23/what-is-an-air-database/ (http://danny-t.co.uk/index.php/2007/06/23/what-is-an-air-database/)
http://www.adobe.com/devnet/air/flash/articles/insult_dueler_04.html (http://www.adobe.com/devnet/air/flash/articles/insult_dueler_04.html)
http://blog.everythingflex.com/2007/06/11/air-embedded-database-sample-application/ (http://blog.everythingflex.com/2007/06/11/air-embedded-database-sample-application/)
http://blog.everythingflex.com/2007/06/12/air-embedded-database-code-exerpts-1/ (http://blog.everythingflex.com/2007/06/12/air-embedded-database-code-exerpts-1/)