【问题标题】:Php curl and serialize problemphp curl和序列化问题
【发布时间】:2011-01-11 18:24:27
【问题描述】:

为了通过我的 curl 脚本传递数组变量,我使用了serialize,因为 curl POST 元素不能是数组。

序列化后得到的字符串是:

a:10:{s:8:"question";s:18:"How are you doing?";s:11:"view_option";s:6:"select";s:10:"txt_answer";a:4:{i:0;s:8:"dsadsdsa";i:1;s:5:"dsads";i:2;s:10:"dsadsdsdsa";i:3;s:0:"";}s:4:"next";s:1:"9";s:7:"bgimage";s:0:"";s:9:"bck_color";s:0:"";s:12:"border_color";s:0:"";s:11:"select_font";s:1:"1";s:9:"font_size";s:4:"12px";s:4:"poll";s:9:"Get Poll!";} 

Curl 做到了:

a:10:{s:8:\"question\";s:18:\"How are you doing?\";s:11:\"view_option\";s:6:\"select\";s:10:\"txt_answer\";a:4:{i:0;s:8:\"dsadsdsa\";i:1;s:5:\"dsads\";i:2;s:10:\"dsadsdsdsa\";i:3;s:0:\"\";}s:4:\"next\";s:1:\"9\";s:7:\"bgimage\";s:0:\"\";s:9:\"bck_color\";s:0:\"\";s:12:\"border_color\";s:0:\"\";s:11:\"select_font\";s:1:\"1\";s:9:\"font_size\";s:4:\"12px\";s:4:\"poll\";s:9:\"Get Poll!\";}

在发送到服务器之前。以上是我在服务器端看到的。现在,由于反斜杠,上面是 not 不可序列化的。

我现在该怎么办?如果我只是取消所有引号 - 我如何区分 CURL 放置的转义符和可能是数据一部分的转义符?


编辑

我在尝试反序列化转义字符串时遇到的错误是:

Notice: unserialize() [function.unserialize]: Error at offset 304 of 351 bytes in /var/www/localserver/test/ser.php on line 8

谢谢

日本

【问题讨论】:

  • 我避免发送 PHP 数据序列化,而是选择 JSON。您可能想尝试一下。
  • 我对 json 很陌生,虽然有时会用它来处理一个 api(主要是作为一个神秘的黑盒 :))。你的意思是我应该尝试json_encode 而不是serialize curl 或完全不同的东西。

标签: php serialization post curl


【解决方案1】:

您的服务器可能启用了magic quotes,这意味着您的输入数据被转义了。

您的选择是在您的php.ini 文件中禁用它,或者在收到数据时调用stripslashes

作为数据一部分的转义将被双重转义,因此取消转义应该不是问题。

在 php.ini 中禁用

magic_quotes_gpc = Off

stripslashes

$data = stripslashes($_POST['data']);

【讨论】:

  • 哪个服务器?具有 curl 脚本的代理服务器或 curl 正在向其发出请求的服务器?
  • 另外,知道如何避免删除我不想要的斜线。也就是说 - 如果斜线是数据的一部分(而不是由服务器放置?)
  • 这解决了我的问题,最重要的是,我怀疑双重转义的东西会被保留(事后看来,我应该知道这一点,但有时只是因为一个简单的问题而空白:)
【解决方案2】:

正如我在 cmets 中提到的,您可能想尝试使用 JSON。但是,想指出这对我来说很好。

<?php

$c = "a:10:{s:8:\"question\";s:18:\"How are you doing?\";s:11:\"view_option\";s:6:\"select\";s:10:\"txt_answer\";a:4:{i:0;s:8:\"dsadsdsa\";i:1;s:5:\"dsads\";i:2;s:10:\"dsadsdsdsa\";i:3;s:0:\"\";}s:4:\"next\";s:1:\"9\";s:7:\"bgimage\";s:0:\"\";s:9:\"bck_color\";s:0:\"\";s:12:\"border_color\";s:0:\"\";s:11:\"select_font\";s:1:\"1\";s:9:\"font_size\";s:4:        \"12px\";s:4:\"poll\";s:9:\"Get Poll!\";}";

print_r(unserialize($c)); 

输出

Array
(
    [question] => How are you doing?
    [view_option] => select
    [txt_answer] => Array
        (
            [0] => dsadsdsa
            [1] => dsads
            [2] => dsadsdsdsa
            [3] => 
        )

    [next] => 9
    [bgimage] => 
    [bck_color] => 
    [border_color] => 
    [select_font] => 1
    [font_size] => 12px
    [poll] => Get Poll!
)

编辑
正如@lonesomeday 所提到的,您可能在接收此数据的服务器上打开了 php 魔术引号。

【讨论】:

  • 这很奇怪!让我尝试调试它为什么不适合我
  • 但是如果你把它发布到一个启用了魔术引号的服务器上,它将再次被转义,这将使它无法使用而不通过stripslashes过滤。
  • 这是我使用您发布的代码时遇到的错误:Notice: unserialize() [function.unserialize]: Error at offset 304 of 351 bytes in /var/www/localserver/test/ser.php on line 8
  • @nikc:这一次,我不是贴,而是直接使用sberry2A贴的php脚本(在有问题的远程服务器上)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 2011-09-21
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 2011-06-21
  • 2011-04-05
相关资源
最近更新 更多