问题描述:

项目属于MVC设计模式,技术和框架采用了php5.6 + Yii2.0 + MongoDB。
在我从Controller中调用Model 的 findAll([]) 方法获取数据打印到屏幕上时,报错:

exception 'DOMException' with message 'Invalid Character Error' in /home/user/YiiProject/src/vendor/yiisoft/yii2/web/XmlResponseFormatter.php:94
Stack trace:
#0 /home/user/YiiProject/src/vendor/yiisoft/yii2/web/XmlResponseFormatter.php(94): DOMElement->__construct('$id')
#1 /home/user/YiiProject/src/vendor/yiisoft/yii2/web/XmlResponseFormatter.php(83): yii\web\XmlResponseFormatter->buildXml(Object(DOMElement), Array)
#2 /home/user/YiiProject/src/vendor/yiisoft/yii2/web/XmlResponseFormatter.php(63): yii\web\XmlResponseFormatter->buildXml(Object(DOMElement), Object(MongoId))
#3 /home/user/YiiProject/src/vendor/yiisoft/yii2/web/Response.php(925): yii\web\XmlResponseFormatter->format(Object(yii\web\Response))
#4 /home/user/YiiProject/src/vendor/yiisoft/yii2/web/Response.php(312): yii\web\Response->prepare()
#5 /home/user/YiiProject/src/vendor/yiisoft/yii2/base/Application.php(381): yii\web\Response->send()
#6 /home/user/YiiProject/src/backend/web/index.php(18): yii\base\Application->run()
#7 {main}
--------------------------------------------------------
解决思路:

Controller的路由正确,可以访问到正确的action;Model 类collectionName, attrabutes, fields一应俱全,并且Mongo数据库中有格式正确的2条数据,打log 显示 findAll([]) 的长度为2,findAll([]) 的结果集是两条空数据 [{}, {}] 。好纳闷啊!!!

想到昨天向大神请教了一个关于fields()的问题,数据是空的,会不会是被fields()给过滤掉了?排查field()发现并没有删除数据而是直接返回数据库中的数据。因为Model是继承了PlainModel.php, 然后又找了一下Model的父类PlainModel.php, 发现PlainModel.php在处理'_id'(主键,mongoId类型)时,并不是直接将数据库里的'_id'返回,而是转成了string型返回。恍然大悟!我自己写的Model里的fields 返回的也是MongoId类型的,导致DOM在解析XML时认为是非法字符,引发异常。

MongoDB里的数据格式如下:

{
"_id" : ObjectId("577325cfb58c1c90788b456b"),
"memberId" : ObjectId("5761f44fb58c1c4a438b4567"),
"cardId" : ObjectId("576bc973b58c1cec3a8b4567"),
"createdAt" : ISODate("2016-06-29T01:35:11.793Z")
}
解决方法:

在 fields() 方法里将 MongoId 类型转为 string 类型

     public function fields()
{
return array_merge(
parent::fields(),
[
'memberId' => function($model) {
return $model->memberId . '';
},
'cardId' => function($model) {
return $model->cardId . '';
}
]
);
}

exception 'DOMException' with message 'Invalid Character Error' Php + Mongodb的更多相关文章

  1. VMware安装时Error 1324. The path My Documents contains a invalid character的原因和解决方法

    终于找到了自己想要的答案,顶顶,吼吼~ 我今天安装VMware Workstation时,总是提示我Error 1324. The path My Documents contains a inval ...

  2. 元素 'beans' 必须不含字符 [子级], 因为该类型的内容类型为“仅元素”;Syntax error on token "Invalid Character";Server returned HTTP response code: 503 for URL;

    元素 'beans' 必须不含字符 [子级], 因为该类型的内容类型为“仅元素”:复制的代码有中文空格 Syntax error on token "Invalid Character&qu ...

  3. Package CJK Error: Invalid character code. 问题解决方法--xelatex和pdflatex编译的转换

    Package CJK Error: Invalid character code. 问题解决方法--xelatex和pdflatex编译的转换 解决方法:添加格式说明信息 将下面语句: \docum ...

  4. UBUNTU下MONGODB出现PHP Fatal error: Uncaught exception 'MongoConnectionException' with message 和 Authentication failed on database 'admin' with username

    MONGO 远程连接服务器,出现: PHP Fatal error: Uncaught exception Stack trace:# /var/www/data/update_data.php(): ...

  5. [转]Syntax error on token "Invalid Character", delete this token 的解决

    原文  http://blog.csdn.net/actsai/article/details/24256987 主题 Eclipse Unicode Java eclipse 中遇到了Syntax ...

  6. DVWA--登录页面错误问题 469 | | PHP Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in C:\web\DVWA\dvwa\includes\dvwaPage.inc.php:469

    // MySQL PDO Prepared Statements (for impossible levels) $db = new PDO('mysql:host=' . $_DVWA[ 'db_s ...

  7. Eclipse 中 Syntax error on token "Invalid Character", delete this token 的解决

    eclipse中遇到了Syntax error on token "Invalid Character", delete this token(令牌“无效字符”上的语法错误,删除此 ...

  8. Jmeter:运行报:Error occurred starting thread group :线程组, error message:Invalid duration 0 set in Thread Group:线程组, see log file for more details

    最近在用jmeter做压测,上周五压测的脚本,今天早晨结束后. 点击同样的脚本,运行就报Error occurred starting thread group :线程组, error message ...

  9. 【Tomcat】Invalid character found in the request target

    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC ...

随机推荐

  1. Ubuntu Java Envrioment

    Download Java SDK and Install 1. Download Java SDK from Oracle websit 2.unzip by command line tar -z ...

  2. MsSql数据库存储过程加密解密

    -------------------------------------------------------------------------------- ------------------- ...

  3. 线程Thread

    一.线程: 程序:保存在物理介质(光盘,软盘,硬盘)当中的代码片段 进程:一旦程序运行起来,就变成了操作系统当中的一个进程 线程:程序当中一条独立执行的线索 二.线程的五大状态 新生    就绪 运行 ...

  4. HTML与CSS二三事

    概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...

  5. Oracle和SQLServer解锁杀进程

    ORACLE:在平时工作中经常会遇到数据库死锁的情况,以前使用oracle时候(那时候还不懂),出现这种情况时前辈给了我一段命令:SELECT dob.OBJECT_NAME Table_Name,l ...

  6. centos,nginx安装备忘

    # ssh 登录慢解决 vim /etc/ssh/sshd_config UseDNS no # add limitsvi /etc/security/limits.conf* soft nproc ...

  7. java学习第19天(异常)

    异常的体系 Throwable |--Error 严重问题 |--Exception |--RuntimeException 运行期异常,我们需要修正代码 |--非RuntimeException 编 ...

  8. weedfs getsockopt: connection timed out

    启动master weed master -ip 10.191.197.133 -mdir /namenode -ip.bind 10.191.197.133 I0809 16:53:51 7721 ...

  9. PHP连接MySQL的时候报错SQLSTATE[HY000] [2002] No such file or directory

    错误环境:Mac OS 10.10 找到mysql.sock文件的位置 $sudo find / -name mysql.sock ------结果如下---------- find: /dev/fd ...

  10. 动态组合lambda 表达式

    //记录实体集合—动态组合lambda 表达式 Expression<Func<AdEntity, bool>> thirdWhere = p => p.Observer ...