Php Laravel雄辩的对象,长文本被截断
我使用了Laravel,将一个db行加载到一个有说服力的对象中。其中一列是longtext,一个长度超过200万字符的JSON编码数组。我得到的原始错误是json_decode在该列的值上失败 我在tinker考试。简化测试代码:Php Laravel雄辩的对象,长文本被截断,php,mysql,json,laravel,longtext,Php,Mysql,Json,Laravel,Longtext,我使用了Laravel,将一个db行加载到一个有说服力的对象中。其中一列是longtext,一个长度超过200万字符的JSON编码数组。我得到的原始错误是json_decode在该列的值上失败 我在tinker考试。简化测试代码: $item = Item::find(1); echo $item->long_text_field; var_dump(json_decode($item->long_text_field)); echo strlen($item->long_te
$item = Item::find(1);
echo $item->long_text_field;
var_dump(json_decode($item->long_text_field));
echo strlen($item->long_text_field);
在我的本地流浪者实例中,这显示了正确的值
...long json array in text, same as the value in the actual DB entry...
...var_dump of json array...
2334040
但是在我的远程开发服务器上
...long json array truncated in the middle...
NULL
1048576
显然,json_解码失败,因为字符串被截断
它在这样一块上截断
"Eff Date":"1\”
应该是哪一个
"Eff Date":"1\/30\/14 16:13”
在长文中有很多这样的转义斜杠,在这一点上我看不到奇怪的字符。有人知道为什么这个文本会在一台服务器上截短而不是在另一台服务器上截短吗?问题可能在于json_编码阶段,甚至在检索结果之前 尝试通过以下方式禁用正斜杠转义:
$str = "1/30/14 16:13";
echo json_encode($str, JSON_UNESCAPED_SLASHES);
最可能的情况是,这是启用magic_quotes_gpc的症状(意味着您可能正在使用PHP版本<5.2)
从PHP手册:
; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off
If access to the server configuration is unavailable, use of .htaccess is also an option. For example:
php_flag magic_quotes_gpc Off
问题是默认的
PDO::MYSQL\u ATTR\u MAX\u BUFFER\u SIZE
大小为1Mb
要在Laravel中设置此选项,需要在database.php配置文件中添加一个选项
'connections' => [
'mydb' => [
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'mydb',
'options' => [
PDO::MYSQL_ATTR_MAX_BUFFER_SIZE => 16777216
]
]
]
上述操作将最大属性大小设置为16Mb
请注意,如果您使用的是mysqlnd驱动程序,您就不再需要它了,它实际上会破坏您的代码,因为PDO::MYSQL\u ATTR\u MAX\u BUFFER\u SIZE常量不存在。尝试过了。文本仍然截断。我的本地服务器和开发服务器都在使用PHP5.5,所以我认为这不是问题所在。出现了一个错误
致命错误:未定义的类常量“MYSQL\u ATTR\u MAX\u BUFFER\u SIZE”
,看起来我在使用mysqlnd,但文本仍然被截断。为什么?嗯,奇怪。您试图存储的数据有多长?它被截断的长度是多少?还有,您在MySQL中使用的字段类型是什么?@IanChadwick结果发现我误用了文本作为字段类型。问题解决后,我把它改为长文。谢谢