我认为问题的根源是我对字符串处理的理解。 serialize($_SESSION)
做同样的事情。我的会话文件持续5kb,但是当我将session_encode()
输出到日志或数据库时,它会在大约100字节后切断。
$s = session_encode();
$n = strlen($s);
error_log("Session ($n): $s");
我明白了:
Session(5948):return_url | s:30:" https://solution-locale/Moneys&#34 ;; complete | s:0:"&#34 ;; basket | O:15:& #34; SolutionUBasket":22:{S:13:
当我尝试将值写入数据库(pg_execute()
- 这是一个准备好的语句)时,我遇到了同样的问题。但是当我做bin2hex()
时,我知道在那之后#34;:"那里有一个空字符(0x00)。
很明显,问题在于字符串处理,而且我做得不对。
db编写代码如下:
pg_prepare($this->getCnx(), $token, $sql);
pg_execute($this->getCnx(), $token, $values);
$sql
是:
更新" solution_ubasket_temp" SET(" session_id","会话"," id")=($ 1,$ 2,$ 3)WHERE" id" = $ 4&# 34;
$values
只是一个数组。 strlen()
上的操作确认所有5kb进入会话成员。
更新继续进行,没有错误消息,但是"会话"字段会像调试一样被截断。
select length(session), * from solution_ubasket_temp
确认"会话"在105个字节后得到截止。
"会话"列是text
,但将其更改为bytea
没有帮助。
select octet_length(session), * from solution_ubasket_temp
确认了这一点。
我在Debian 8.5上运行PHP 5.6。
答案 0 :(得分:0)
我认为问题是错的。这不是session_encode()
切断它的问题,而是一些PHP例程可能无法处理函数产生的二进制字符串的事实。所以,底线:如果你使用session_encode()
,请确保处理返回值的任何例程都可以处理它。到目前为止,我发现error_log()
和pg_execute()
不能。
这里更明确:PHP/PostgreSQL: writing binary data with prepared statements