前端采用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;
    }
}
?>
---------------------------------------------------------------------------------------------------------