如何通过CI会话实现Flash(AS2/AS3)与MySQL的登录用户数据交互?
实现SWF与CI会话+MySQL的分数提交方案
核心逻辑
SWF无法直接连接MySQL,必须通过CodeIgniter后端接口中转,利用已有的CI登录会话验证学生身份,避免伪造数据。以下分后端接口和前端SWF代码两部分实现:
一、CodeIgniter后端接口实现
创建application/controllers/Score.php控制器,实现两个接口:获取当前学生信息、提交分数。
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Score extends CI_Controller { public function __construct() { parent::__construct(); // 验证是否为登录学生,非学生直接拒绝 if (!$this->session->userdata('student_id') || $this->session->userdata('role') != 'student') { echo json_encode(['status' => 'error', 'msg' => '未授权访问']); exit; } $this->load->database(); } // 获取当前登录学生的姓名 public function get_user_info() { $student_name = $this->session->userdata('student_name'); echo json_encode([ 'status' => 'success', 'name' => $student_name ]); } // 提交分数到数据库 public function submit_score() { $score = $this->input->post('score'); // 验证分数合法性 if (!is_numeric($score) || $score < 0 || $score > 100) { echo json_encode(['status' => 'error', 'msg' => '分数格式错误']); return; } $student_id = $this->session->userdata('student_id'); // 插入数据库(假设表名为student_scores,字段:student_id, score, created_at) $data = [ 'student_id' => $student_id, 'score' => $score, 'created_at' => date('Y-m-d H:i:s') ]; if ($this->db->insert('student_scores', $data)) { echo json_encode(['status' => 'success', 'msg' => '分数提交成功']); } else { echo json_encode(['status' => 'error', 'msg' => '提交失败,请重试']); } } }
二、前端SWF代码实现
情况1:AS3版本代码
在SWF最后一帧添加以下代码(假设已有txtName(显示姓名)、txtScore(显示分数)文本框,btnSubmit提交按钮):
import flash.net.URLLoader; import flash.net.URLRequest; import flash.net.URLRequestMethod; import flash.net.URLVariables; import flash.events.Event; import flash.events.MouseEvent; // 后端接口地址(根据你的CI项目路径调整) const GET_USER_URL:String = "http://你的CI域名/index.php/score/get_user_info"; const SUBMIT_SCORE_URL:String = "http://你的CI域名/index.php/score/submit_score"; // 初始化:获取学生姓名 var userLoader:URLLoader = new URLLoader(); var userRequest:URLRequest = new URLRequest(GET_USER_URL); userLoader.addEventListener(Event.COMPLETE, onUserInfoLoaded); userLoader.load(userRequest); function onUserInfoLoaded(e:Event):void { var result:Object = JSON.parse(e.target.data); if (result.status == "success") { txtName.text = "姓名:" + result.name; } else { txtName.text = "获取信息失败"; } } // 假设分数是SWF内部计算得到的,这里用示例值,实际替换成你的分数变量 var studentScore:Number = 85; txtScore.text = "分数:" + studentScore; // 提交按钮点击事件 btnSubmit.addEventListener(MouseEvent.CLICK, onSubmitClick); function onSubmitClick(e:MouseEvent):void { var submitLoader:URLLoader = new URLLoader(); var submitRequest:URLRequest = new URLRequest(SUBMIT_SCORE_URL); submitRequest.method = URLRequestMethod.POST; var vars:URLVariables = new URLVariables(); vars.score = studentScore; submitRequest.data = vars; submitLoader.addEventListener(Event.COMPLETE, onSubmitComplete); submitLoader.load(submitRequest); } function onSubmitComplete(e:Event):void { var result:Object = JSON.parse(e.target.data); trace(result.msg); // 调试用,可替换成弹窗提示 // 比如:Alert.show(result.msg); }
情况2:AS2版本代码
在SWF最后一帧添加以下代码(同样假设已有txtName、txtScore、btnSubmit):
// 后端接口地址 var GET_USER_URL:String = "http://你的CI域名/index.php/score/get_user_info"; var SUBMIT_SCORE_URL:String = "http://你的CI域名/index.php/score/submit_score"; // 获取学生姓名 var user_lv:LoadVars = new LoadVars(); user_lv.onLoad = function(success:Boolean) { if (success && this.status == "success") { txtName.text = "姓名:" + this.name; } else { txtName.text = "获取信息失败"; } }; user_lv.load(GET_USER_URL); // 示例分数,替换成实际计算的分数 var studentScore:Number = 85; txtScore.text = "分数:" + studentScore; // 提交按钮点击 btnSubmit.onRelease = function() { var submit_lv:LoadVars = new LoadVars(); submit_lv.score = studentScore; submit_lv.onLoad = function(success:Boolean) { if (success) { trace(this.msg); // 调试提示 // 可添加弹窗:getURL("javascript:alert('"+this.msg+"')"); } else { trace("提交请求失败"); } }; submit_lv.send(SUBMIT_SCORE_URL, "_self", "POST"); };
关键注意事项
- 会话保持:SWF在浏览器中运行时会自动携带浏览器的Cookie,CI的Session会自动识别当前登录学生,无需手动传递Session ID。
- 数据验证:后端必须对提交的分数做合法性校验,防止恶意提交非法数据。
- 路径调整:将代码中的
http://你的CI域名替换成实际的CI项目访问地址。 - 调试:AS代码中的
trace语句可在Flash调试器中查看输出,AS2也可通过getURL调用JS弹窗提示用户。
内容的提问来源于stack exchange,提问作者ownrisk
相关产品推荐
相关产品推荐

