2014-10-03 147 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