PHP:为什么session_encode()截止输出?

时间:2016-12-22 15:58:09

标签: php string postgresql session

我认为问题的根源是我对字符串处理的理解。 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。

1 个答案:

答案 0 :(得分:0)

我认为问题是错的。这不是session_encode()切断它的问题,而是一些PHP例程可能无法处理函数产生的二进制字符串的事实。所以,底线:如果你使用session_encode(),请确保处理返回值的任何例程都可以处理它。到目前为止,我发现error_log()pg_execute()不能。

这里更明确:PHP/PostgreSQL: writing binary data with prepared statements