Laravel Eloquent 对象,长文本被截断
Posted
技术标签:
【中文标题】Laravel Eloquent 对象,长文本被截断【英文标题】:Laravel Eloquent object, longtext being truncated 【发布时间】:2014-11-28 19:22:33 【问题描述】:我使用 Laravel,将 db 行加载到 Eloquent 对象中。其中一列是 longtext,一个 JSON 编码的数组,长度 > 200 万个字符。我得到的原始错误是 json_decode 在此列的值上失败。
我在修补程序中进行了测试。简化测试代码:
$item = Item::find(1);
echo $item->long_text_field;
var_dump(json_decode($item->long_text_field));
echo strlen($item->long_text_field);
在我的本地 vagrant 实例上,这显示了正确的值。
...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”
在长文本中有很多这样的转义斜线,我当时看不到任何奇怪的字符。有谁知道为什么这个文本会在一台服务器上截断,而不是另一台?
【问题讨论】:
【参考方案1】:问题是默认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 常量不存在。
【讨论】:
得到一个错误Fatal error: Undefined class constant 'MYSQL_ATTR_MAX_BUFFER_SIZE'
,似乎我正在使用mysqlnd,但文本仍然被截断。为什么?
嗯,很奇怪。您尝试存储的数据多长时间以及截断的长度是多少?还有你在 MySQL 中使用什么字段类型?
@IanChadwick 原来我误用了文本作为字段类型。将其更改为长文本后问题解决。谢谢!【参考方案2】:
问题可能出在 json_encoding 阶段,甚至在您检索结果之前。
尝试通过以下方式禁用正斜杠转义:
$str = "1/30/14 16:13";
echo json_encode($str, JSON_UNESCAPED_SLASHES);
这很可能是启用了 magic_quotes_gpc 的症状(意味着您可能使用的是 PHP 版本
来自 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
【讨论】:
试过了。文本仍然被截断。我的本地服务器和开发服务器都使用 PHP 5.5,所以我认为这不是问题。以上是关于Laravel Eloquent 对象,长文本被截断的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent - 使用连接选择列文本类似于其他表中的列文本
laravel:关系方法必须返回 Illuminate\Database\Eloquent\Relations\Relation 类型的对象
深入理解 Laravel Eloquent——模型间关系(关联)
在 Laravel 中,哪些 Eloquent 方法返回数据,哪些返回对象?