You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:15:13