【问题标题】:PHP - Data-type workaround for $_POSTPHP - $_POST 的数据类型解决方法
【发布时间】:2014-10-07 18:27:33
【问题描述】:

我想知道是否有办法让 POST 数组的值以字符串类型以外的形式返回?

所以,例如,如果我想:

 foreach ($_POST as $key => $value) 
 {
     if (is_X($value)) // X being int or bool or string, etc....
     {
         do something.....
     }
 } 

我开始想也许settype($var, "type") 但是,我必须为每个输入显式设置类型,这似乎是一种荒谬的方式。

【问题讨论】:

  • 您要么必须传递类型,要么根据某些标准确定它。字符串 0 和 1 是整数还是布尔值?
  • 这就是你使用非强类型语言所得到的。 :)
  • 没有。 GET/POST 中的所有内容本质上都是一个字符串。没有其他办法了。使用它们时,您必须将字符串类型转换为其他内容。例如$forced_int = (int)$_POST['somekey'];。至于“荒谬”:您是否在 http 规范中看到允许将此类元数据放入查询字符串/表单字段的任何地方? http://example.com/script.php?x:int=42 无效或预期无效。
  • 您要对哪些输入类型进行转换?还有为什么?
  • 我以 $_POST 为例,它可以是任何数组。我可以说foreach ($array as $k => $v) 结果是相同的 --type 字符串。我只是想知道是否有比类型转换更好的解决方案@MarcB

标签: php arrays post variable-types


【解决方案1】:

简而言之:没有。 POST 数据来自 HTTP 协议,通常是 x-www-form-urlencoded。这种格式根本没有指定任何类型,一切都是字符串。 PHP 不会也不能神奇地将类型灌输到任何这些值上。

如果要传输类型信息,则必须使用另一种序列化格式。例如,JSON 对客户端上的值进行编码,并将 JSON 数据作为请求正文发布。 JSON 是一种支持多种不同类型的文本格式。

【讨论】:

    【解决方案2】:

    当然可以通过一些自定义的 id 名称定义来完成。

    序列化或 JSON 格式将是最好的方法。但是您的问题对上下文不够具体。

    // Custom definition for fieldnames or keynames
    $key_types = array(
        "name" => "string",
        "email" => "string",
        "receive_news" => "bool",
        "age" => "int"
    );
    // This way you will ALWAYS be sure that type is the same
    
    function castByID($name, $val)
    {
        $type = $key_types[$name];
        switch($type)
        {
            default:
            case "string":  $val = (string)$val; break;
            case "bool":  $val = ($val=='1'?true:false); break; // Adapt to your data format
            case "int":  $val = (int)$val; break;
        }
        return $val;
    }
    
    if (isset($_POST["user"]))
    {
        $data = array();
        foreach ($_POST["user"] as $name => $val) 
            $data[$name] = castByID($name, $val);
    }
    

    【讨论】:

    • 我只想补充一点,我的答案在某种程度上是你自己的。但是您没有指定数据源是来自服务器还是客户端。 JSON 始终是服务器/客户端之间最好和更通用的格式。从 PHP 进行序列化是非常特定于 PHP 语言的。
    猜你喜欢
    • 2011-03-22
    • 2015-05-20
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多