前端采用AS3,通过Zend_Amf调用PHP类,并且取得MYSQL的数据库数据,而发回as3的datagrid,但datagrid 只能显示MYSQL数据库的英文字符,不能显示中文,我将my.ini 全改成uft8或GBK都不行,是什么原因呢?
一、AS3程序:import fl.managers.StyleManager;
import fl.data.DataProvider;
import fl.controls.dataGridClasses.DataGridColumn;
import fl.controls.DataGrid;
import fl.controls.Button;
import fl.controls.TextInput;
import fl.events.ListEvent;//当查询操作返回结果时调用该函数
function getData_Result(re:Object):void
{
//首先删除employeeList组件中的原有数据,然后再填充
this.employeeList.removeAll();
//根据返回的数据构建一个DataProvider对象
//该对象可以作为DataGrid组件的数据提供者
var dp:DataProvider;
try
{
dp=new DataProvider(re);
}
catch (err:Error)
{
firstName_txt.text="有错误发生,请稍后再试";
}
//填充DataGrid组件数据
this.employeeList.dataProvider=dp;
}//当查询操作返回错误时调用该函数
function getData_Fault(er:Object):void
{
firstName_txt.text="有错误发生,请稍后再试";
}//响应按钮单击事件
function getEmployeesInfo(arg1:String,arg2:String,arg3:Number):void
{
//调用远程服务并处理响应
var my_nc:NetConnection = new NetConnection();
//注意设置编码格式为AMF3
NetConnection.defaultObjectEncoding=ObjectEncoding.AMF3;
my_nc.connect("http://localhost/ZendAMF/gateway.php");
var responder:Responder = new Responder(getData_Result,getData_Fault);
// 设置一个回调函数。
my_nc.call('manageEmployees.getEmployeesInfo',responder,arg1,arg2,arg3);
// 调用PHP类方法
}
//下面定义按钮的单击事件
function onGetClick(evt:MouseEvent):void
{
getEmployeesInfo(firstName_txt.text,lastName_txt.text,age_txt.text);
}this.getItem_btn.addEventListener("click",onGetClick);//初始化组件function init():void
{
//设置组件的样式,这里我们设置全局样式
var tf:TextFormat = new TextFormat();
tf.size=12;
StyleManager.setStyle("textFormat", tf);
//下面用于构建DataGrid组件的列,将列名和数据列对应起来
//注意这里仅显示两个列
var firstNameCol:DataGridColumn = new DataGridColumn();
firstNameCol.headerText="姓氏";
firstNameCol.dataField="firstName";
this.employeeList.addColumn(firstNameCol);
// ========================================================
var lastNameCol:DataGridColumn = new DataGridColumn();
lastNameCol.headerText="名字";
lastNameCol.dataField="lastName";
this.employeeList.addColumn(lastNameCol);
//定义DataGrid组件标题行的高度
this.employeeList.headerHeight=20;
}
System.useCodepage=true;
init();
stop();
---------------------------------------------------
2.网关gateway.php
<?php
// [01]首先引用Zend_Amf服务器类
require_once 'Zend/Amf/Server.php';
// [02]引用业务逻辑类,可以引入多个
require_once 'AMFApp/org/zhangyafei/HelloWorld.php';
require_once 'AMFApp/org/zhangyafei/ManageEmployees.php';
require_once 'AMFApp/org/zhangyafei/Employees_paged.php';// [03]创建服务器组件实例
$server = new Zend_Amf_Server();
// [04]为调用准备远程服务,可以使用类,也可以使用函数,甚至目录
$server->setClass('HelloWorld')
->setClass('HelloWorld', 'org.zhangyafei')
->setClass('HelloWorld', 'amf');
$server->setClass('ManageEmployees');
$server->setClass('Employees_paged');
// [05]调用handle方法准备好请求和响应
$response = $server->handle();
// [06]返回响应
echo $response;
?>
-------------------------------------------------------------------------------------------------------------
被调用的PHP类,它将数据库的数据返回给as3:<?php
/*
* 更改,以支持中文
* C:\php\library\Zend\Amf\Parse\Amf0\Serializer.php
* $this->_stream->writeUTF($data);
* 改为
* $this->_stream->writeUTF(iconv("GB2312", "UTF-8", $data));
*/
class ManageEmployees { var $dbhost = "localhost";
var $dbport = "3306";
var $dbname = "myDatabase";
var $dbuser = "root";
var $dbpass = "verysecret"; function __construct() {
// 创建一个PDO对象,初始化数据库连接
$this->dbh = new PDO("mysql:host=".$this->dbhost.";port=".
$this->dbport.";dbname=".$this->dbname,
$this->dbuser,$this->dbpass);
$this->dbh->exec("SET CHARACTER SET gb2312");
// 设置出错处理模式,注意常量的使用
$this->dbh->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
}
// 该函数用于获取数据库雇员记录
/**
* @param string $firstName
* @param string $EmpType
* @param integer $age
* @return Array
*/
function getEmployeesInfo($firstName,$lastName,$age)
{
$result = NULL;
// MySQL的参数必须转换成GB2312才能传递
// 所以在这里进行一下预处理
$firstName = iconv("UTF-8", "GB2312", $firstName);
$lastName = iconv("UTF-8", "GB2312", $lastName);
try
{
// [01]获取参数,根据参数构造查询字符串
if ($firstName == "" && $lastName == "" && $age == 0)
{
// 注意这里,如果传入的是类如空值的参数,那么就返回所有记录
$sql = "SELECT firstName, lastName, EmpType, age FROM " .
" employees";
// 准备预处理语句
$sth = $this->dbh->prepare($sql);
}
else
{
$sql = "SELECT firstName, lastName, EmpType, age FROM " .
" employees WHERE firstName LIKE ?" .
" AND lastName LIKE ? AND age >=?";
// 准备预处理语句
$sth = $this->dbh->prepare($sql);
$sth->bindValue(1, $firstName, PDO::PARAM_STR);
$sth->bindValue(2, $lastName, PDO::PARAM_STR);
$sth->bindValue(3, $age, PDO::PARAM_INT);
}
// [02]查询数据库
// 执行预处理语句,并将结果保存在$sth中
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_ASSOC);
// 显式的关闭PDO连接
$this->dbh = NULL;
} catch (PDOException $err) {
echo("出错,请重试或者联系管理员:[email protected]");
die();
}
// [03]返回结果
return $result;
}
// 增加雇员
/**
* @param string $firstName
* @param string $lastName
* @param string $EmpType
* @param integer $age
* @return boolean
*/
function newEmployeesInfo($firstName,$lastName,$EmpType,$age)
{
$result = false;
// 这里创建一个SQL INSERT语句
$sql = "INSERT INTO employees ".
" (firstName,lastName,EmpType,age) VALUES (?,?,?,?)"; // MySQL的参数必须转换成GB2312才能传递
// 所以在这里进行一下预处理
$firstName = iconv("UTF-8", "GB2312", $firstName);
$lastName = iconv("UTF-8", "GB2312", $lastName);
$EmpType = iconv("UTF-8", "GB2312", $EmpType);
try{
// 准备预处理语句
$sth = $this->dbh->prepare($sql);
$sth->bindValue(1, $firstName, PDO::PARAM_STR);
$sth->bindValue(2, $lastName, PDO::PARAM_STR);
$sth->bindValue(3, $EmpType, PDO::PARAM_STR);
$sth->bindValue(4, $age, PDO::PARAM_INT);
// 执行插入操作并将是否成功的结果保存在一个变量中
$result = $sth->execute();
// 显式的关闭PDO连接
$this->dbh = NULL;
$result = true;
} catch (PDOException $err) {
echo("出错,请重试或者联系管理员:[email protected]");
die();
}
return $result;
}
// 删除雇员
/**
* @param string $firstName
* @param string $lastName
* @return boolean
*/
function deleteEmployeesInfo($firstName,$lastName)
{
$result = false; // MySQL的参数必须转换成GB2312才能传递
// 所以在这里进行一下预处理
$firstName = iconv("UTF-8", "GB2312", $firstName);
$lastName = iconv("UTF-8", "GB2312", $lastName); // 这里创建一个SQL DELETE语句
$sql = "DELETE FROM employees WHERE firstName=? AND lastName=?"; try{
// 准备预处理语句
$sth = $this->dbh->prepare($sql);
$sth->bindValue(1, $firstName, PDO::PARAM_STR);
$sth->bindValue(2, $lastName, PDO::PARAM_STR);
// 执行删除操作并将是否成功的结果保存在一个变量中
$result = $sth->execute();
// 显式的关闭PDO连接
$this->dbh = NULL;
$result = true;
} catch (PDOException $err) {
echo("出错,请重试或者联系管理员:[email protected]");
die();
}
return $result;
}
}
?>
---------------------------------------------------------------------------------------------------------
一、AS3程序:import fl.managers.StyleManager;
import fl.data.DataProvider;
import fl.controls.dataGridClasses.DataGridColumn;
import fl.controls.DataGrid;
import fl.controls.Button;
import fl.controls.TextInput;
import fl.events.ListEvent;//当查询操作返回结果时调用该函数
function getData_Result(re:Object):void
{
//首先删除employeeList组件中的原有数据,然后再填充
this.employeeList.removeAll();
//根据返回的数据构建一个DataProvider对象
//该对象可以作为DataGrid组件的数据提供者
var dp:DataProvider;
try
{
dp=new DataProvider(re);
}
catch (err:Error)
{
firstName_txt.text="有错误发生,请稍后再试";
}
//填充DataGrid组件数据
this.employeeList.dataProvider=dp;
}//当查询操作返回错误时调用该函数
function getData_Fault(er:Object):void
{
firstName_txt.text="有错误发生,请稍后再试";
}//响应按钮单击事件
function getEmployeesInfo(arg1:String,arg2:String,arg3:Number):void
{
//调用远程服务并处理响应
var my_nc:NetConnection = new NetConnection();
//注意设置编码格式为AMF3
NetConnection.defaultObjectEncoding=ObjectEncoding.AMF3;
my_nc.connect("http://localhost/ZendAMF/gateway.php");
var responder:Responder = new Responder(getData_Result,getData_Fault);
// 设置一个回调函数。
my_nc.call('manageEmployees.getEmployeesInfo',responder,arg1,arg2,arg3);
// 调用PHP类方法
}
//下面定义按钮的单击事件
function onGetClick(evt:MouseEvent):void
{
getEmployeesInfo(firstName_txt.text,lastName_txt.text,age_txt.text);
}this.getItem_btn.addEventListener("click",onGetClick);//初始化组件function init():void
{
//设置组件的样式,这里我们设置全局样式
var tf:TextFormat = new TextFormat();
tf.size=12;
StyleManager.setStyle("textFormat", tf);
//下面用于构建DataGrid组件的列,将列名和数据列对应起来
//注意这里仅显示两个列
var firstNameCol:DataGridColumn = new DataGridColumn();
firstNameCol.headerText="姓氏";
firstNameCol.dataField="firstName";
this.employeeList.addColumn(firstNameCol);
// ========================================================
var lastNameCol:DataGridColumn = new DataGridColumn();
lastNameCol.headerText="名字";
lastNameCol.dataField="lastName";
this.employeeList.addColumn(lastNameCol);
//定义DataGrid组件标题行的高度
this.employeeList.headerHeight=20;
}
System.useCodepage=true;
init();
stop();
---------------------------------------------------
2.网关gateway.php
<?php
// [01]首先引用Zend_Amf服务器类
require_once 'Zend/Amf/Server.php';
// [02]引用业务逻辑类,可以引入多个
require_once 'AMFApp/org/zhangyafei/HelloWorld.php';
require_once 'AMFApp/org/zhangyafei/ManageEmployees.php';
require_once 'AMFApp/org/zhangyafei/Employees_paged.php';// [03]创建服务器组件实例
$server = new Zend_Amf_Server();
// [04]为调用准备远程服务,可以使用类,也可以使用函数,甚至目录
$server->setClass('HelloWorld')
->setClass('HelloWorld', 'org.zhangyafei')
->setClass('HelloWorld', 'amf');
$server->setClass('ManageEmployees');
$server->setClass('Employees_paged');
// [05]调用handle方法准备好请求和响应
$response = $server->handle();
// [06]返回响应
echo $response;
?>
-------------------------------------------------------------------------------------------------------------
被调用的PHP类,它将数据库的数据返回给as3:<?php
/*
* 更改,以支持中文
* C:\php\library\Zend\Amf\Parse\Amf0\Serializer.php
* $this->_stream->writeUTF($data);
* 改为
* $this->_stream->writeUTF(iconv("GB2312", "UTF-8", $data));
*/
class ManageEmployees { var $dbhost = "localhost";
var $dbport = "3306";
var $dbname = "myDatabase";
var $dbuser = "root";
var $dbpass = "verysecret"; function __construct() {
// 创建一个PDO对象,初始化数据库连接
$this->dbh = new PDO("mysql:host=".$this->dbhost.";port=".
$this->dbport.";dbname=".$this->dbname,
$this->dbuser,$this->dbpass);
$this->dbh->exec("SET CHARACTER SET gb2312");
// 设置出错处理模式,注意常量的使用
$this->dbh->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
}
// 该函数用于获取数据库雇员记录
/**
* @param string $firstName
* @param string $EmpType
* @param integer $age
* @return Array
*/
function getEmployeesInfo($firstName,$lastName,$age)
{
$result = NULL;
// MySQL的参数必须转换成GB2312才能传递
// 所以在这里进行一下预处理
$firstName = iconv("UTF-8", "GB2312", $firstName);
$lastName = iconv("UTF-8", "GB2312", $lastName);
try
{
// [01]获取参数,根据参数构造查询字符串
if ($firstName == "" && $lastName == "" && $age == 0)
{
// 注意这里,如果传入的是类如空值的参数,那么就返回所有记录
$sql = "SELECT firstName, lastName, EmpType, age FROM " .
" employees";
// 准备预处理语句
$sth = $this->dbh->prepare($sql);
}
else
{
$sql = "SELECT firstName, lastName, EmpType, age FROM " .
" employees WHERE firstName LIKE ?" .
" AND lastName LIKE ? AND age >=?";
// 准备预处理语句
$sth = $this->dbh->prepare($sql);
$sth->bindValue(1, $firstName, PDO::PARAM_STR);
$sth->bindValue(2, $lastName, PDO::PARAM_STR);
$sth->bindValue(3, $age, PDO::PARAM_INT);
}
// [02]查询数据库
// 执行预处理语句,并将结果保存在$sth中
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_ASSOC);
// 显式的关闭PDO连接
$this->dbh = NULL;
} catch (PDOException $err) {
echo("出错,请重试或者联系管理员:[email protected]");
die();
}
// [03]返回结果
return $result;
}
// 增加雇员
/**
* @param string $firstName
* @param string $lastName
* @param string $EmpType
* @param integer $age
* @return boolean
*/
function newEmployeesInfo($firstName,$lastName,$EmpType,$age)
{
$result = false;
// 这里创建一个SQL INSERT语句
$sql = "INSERT INTO employees ".
" (firstName,lastName,EmpType,age) VALUES (?,?,?,?)"; // MySQL的参数必须转换成GB2312才能传递
// 所以在这里进行一下预处理
$firstName = iconv("UTF-8", "GB2312", $firstName);
$lastName = iconv("UTF-8", "GB2312", $lastName);
$EmpType = iconv("UTF-8", "GB2312", $EmpType);
try{
// 准备预处理语句
$sth = $this->dbh->prepare($sql);
$sth->bindValue(1, $firstName, PDO::PARAM_STR);
$sth->bindValue(2, $lastName, PDO::PARAM_STR);
$sth->bindValue(3, $EmpType, PDO::PARAM_STR);
$sth->bindValue(4, $age, PDO::PARAM_INT);
// 执行插入操作并将是否成功的结果保存在一个变量中
$result = $sth->execute();
// 显式的关闭PDO连接
$this->dbh = NULL;
$result = true;
} catch (PDOException $err) {
echo("出错,请重试或者联系管理员:[email protected]");
die();
}
return $result;
}
// 删除雇员
/**
* @param string $firstName
* @param string $lastName
* @return boolean
*/
function deleteEmployeesInfo($firstName,$lastName)
{
$result = false; // MySQL的参数必须转换成GB2312才能传递
// 所以在这里进行一下预处理
$firstName = iconv("UTF-8", "GB2312", $firstName);
$lastName = iconv("UTF-8", "GB2312", $lastName); // 这里创建一个SQL DELETE语句
$sql = "DELETE FROM employees WHERE firstName=? AND lastName=?"; try{
// 准备预处理语句
$sth = $this->dbh->prepare($sql);
$sth->bindValue(1, $firstName, PDO::PARAM_STR);
$sth->bindValue(2, $lastName, PDO::PARAM_STR);
// 执行删除操作并将是否成功的结果保存在一个变量中
$result = $sth->execute();
// 显式的关闭PDO连接
$this->dbh = NULL;
$result = true;
} catch (PDOException $err) {
echo("出错,请重试或者联系管理员:[email protected]");
die();
}
return $result;
}
}
?>
---------------------------------------------------------------------------------------------------------
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货