【问题标题】:Pass Form PHP Variables to JSON Encode将表单 PHP 变量传递给 JSON 编码
【发布时间】:2017-04-20 19:02:11
【问题描述】:

我有一个包含这些值的表单:

    $firstName = strip_tags(trim($_POST['first-name']));
    $lastName = strip_tags(trim($_POST['last-name']));
    $email = filter_var(trim($_POST['user-email']),FILTER_SANITIZE_EMAIL);

我正在尝试将这些值传递给它:

    $request_body = json_decode('[{
        "first_name" : "Tom",
        "last_name" : "Hanks",
        "email" : "example@gmail.com"
    }]');

尝试将表单值保存到一个数组并将其传递到 json_decode 其中 $userArray 是表单值,但不是。示例:

$request_body = json_decode($userArray, true);

所有这些都是为了将​​这些表单值传递到 API (SendGrid) 中,但这对我不起作用,而且它们的文档描述性也不强。我猜他们想要一个特定的请求格式。这是他们的 Github 页面上的请求正文示例。我可以将这些值硬编码,它工作正常,但想法是让表单自动传递这些用户名和电子邮件值。

$request_body = json_decode('[
  {
    "age": 25, 
    "email": "example@example.com", 
    "first_name": "", 
    "last_name": "User"
  }, 
  {
    "age": 25, 
    "email": "example2@example.com", 
    "first_name": "Example", 
    "last_name": "User"
  }
]');

任何想法我做错了什么?谢谢!

【问题讨论】:

  • sendgrid api 是否接受 json 编码的字符串?
  • 好吧,我尝试使用 json_encode 但它对我也不起作用。你指的也是这个吗?

标签: php json encode sendgrid


【解决方案1】:

您发送帖子的方式:

$array[0]['email'] = filter_var(trim($_POST['user-email']),FILTER_SANITIZE_EMAIL);
$array[0]['first_name'] = strip_tags(trim($_POST['first-name']));
$array[0]['last_name'] = strip_tags(trim($_POST['last-name']));

echo json_encode($array);

结果:

[{"email":"john.doe@exemple.com","first_name":"John","last_name":"Doe"}]

[0] 可能是个问题,它会在您读取 json_decode 输出时产生“[”“]”,并在使用 json_decode 解码时重现完全相同的数组。

因此,如果他们的脚本正在寻找整数作为键,如果您省略 [0],他们将获得以下格式的数组 $array['email'] 等。这可能是一个问题。

如果您想循环复制并一次发送多个条目

你可以这样写:

$array[] = array('email' => filter_var(trim($_POST['user-email']),FILTER_SANITIZE_EMAIL),
                 'first_name' => strip_tags(trim($_POST['first-name'])),
                 'last_name' => strip_tags(trim($_POST['last-name']))
);

你仍然会错过“年龄”。确保它不是必填字段!

【讨论】:

  • 当我回显他们的示例请求时,它看起来像这样:array(1) { [0]=> object(stdClass)#8 (3) { ["first_name"]=> string (3) "汤姆" ["last_name"]=> 字符串(5) "汉克斯" ["email"]=> 字符串(19) "example@example.com" } }
  • 在我提供的 sn-p 中完成的方式,如果您将 Tom、Hanks 和 example@example.com 发布到您的脚本,它应该输出与您在此处发送的完全相同的内容。那么,您能否验证您在发布请求( var_dump($_POST) )中获得了所有内容,然后您的数组中的数据是否正确( var_dump($request_body) )。您是否将请求作为 POST 发送到“request_body”属性中的“$url/contactdb/recipients”?
  • 实际上您的解决方案可能有效,如果一切正常,将进行测试并标记它已解决。由于 ScottSmudger 的澄清,我最终完全跳过了 json 编码部分。
  • 这行得通,但根本不需要使用 json_encode,只需传入 $array 和 presto。
【解决方案2】:

我认为您在使用json_decode()json_encode() 时可能会有些困惑。

json_encode() 将 PHP 数组编码为 JSON 数组。 而json_decode() 将 JSON 数组解码回 PHP 数组。

关于您的情况,以下应该产生相同的输出:

$array = array(
    "first_name" => "Tom",
    "last_name" => "Hanks",
    "email" => "example@gmail.com"
);

echo json_encode($array);

生产:

{"first_name":"Tom","last_name":"Hanks","email":"example@gmail.com"}

使用这些函数构建数组,然后对 JSON 进行编码/解码比手动创建 JSON 数组要好得多。因为这样可以避免您可能创建的任何语法错误。

希望这会有所帮助。

【讨论】:

  • 是的,这就是我所拥有的,但它返回错误 {"errors":[{"message":"request body is invalid"}]}
  • $_POST 变量是否可能没有值?
猜你喜欢
  • 2016-08-15
  • 2014-12-06
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 2020-01-24
  • 1970-01-01
相关资源
最近更新 更多