2014-10-03 149 views
2

我已经使用Laravel,将一个db行加载到一个Eloquent对象中。其中一列是longtext,一个长度超过200万字符的JSON编码数组。我得到的原始错误是json_decode在此列的值上失败。Laravel雄辩的对象,longtext被截断

我在修补匠测试。简化测试代码:

$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_decode失败,因为该字符串被截断。

它截断在一块像这样

"Eff Date":"1\” 

"Eff Date":"1\/30\/14 16:13” 

有在这一点上,我可以看到很多在LONGTEXT逃脱斜线这样,也没有奇怪的字符。有没有人有一个想法,为什么这个文本会在一台服务器上截断,而不是另一台?

回答

7

的问题是默认PDO::MYSQL_ATTR_MAX_BUFFER_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_ATTR_MAX_BUFFER_SIZE常量不存在。

+0

对于正确的答案永远不会太晚。谢谢伊恩! – wakeman 2016-02-25 17:28:46

+1

出现错误'致命错误:未定义的类常量'MYSQL_ATTR_MAX_BUFFER_SIZE'',似乎我使用的是mysqlnd,但文本仍被截断。为什么? – leetom 2016-08-16 08:01:39

+0

嗯奇怪。你试图存储的数据有多长时间,它被截断的长度是多少?你在MySQL中使用哪种字段类型? – 2016-08-16 08:50:38

0

问题可能出现在json_encoding阶段,甚至在检索结果之前。

尝试禁用斜线通过转义:

$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 
+1

试过了。文字仍然截断。我的本地和开发服务器都使用PHP 5.5,所以我不认为这是问题。 – wakeman 2014-10-03 21:02:47