从POST数据在PHP中生成json

问题描述:

我需要通过url post数据更新对象的json列表。例如,网址:从POST数据在PHP中生成json

http://myweb.com/index.php?name=Peter&surname=Brown 

在PHP中,使用get方法:

$name = $_GET["name"]; 
$surname = $_GET["surname"]; 
$json = array(); 

     $json["nombre"] = $name; 
     $json["lat"] = $lat; 
     $data[] = $json; 

$json_end= json_encode($data); 

和json_end efectively就像我做想:

[{"name":"Peter","surname":"Brown"}] 

我的问题是,我怎么能为了构建一个像这样的数组,可以增加json:

[{"name":"Peter","surname":"Brown"}] 
[{"name":"newname","surname":"newsurname"}] 
// and so on 

每次用户使用带有新参数的url。

是否需要写入文件或数据库?任何提示将被折衷。

这个想法是,任何用户都可以使用url添加一些dat。我尝试将json存储到场中,但存储仅在当前会话中持久。

+1

你会需要在一些地方保存旧的参数。每次加载URL时,都会重新加载PHP,而且上次没有记忆(除'$ _SESSION'和'$ _COOKIE'外)。数据库听起来不错。 –

+2

是的,您需要将旧数据存储在文件/ db/session中,因为每当用户通过url提交参数时,整个页面将被重新生成,并且您的变量将被初始化 – manix

+0

您想要的究竟是什么*做?你想永久保存这些名字吗?暂时?它们被用于什么? –

<? 
/* This needs to be at the top of your file, without ANYTHING above it */ 
session_start(); 

/* ... */ 

if(!array_key_exists('entries', $_SESSION)) 
{ 
    $_SESSION['entries'] = array(); 
} 

$_SESSION['entries'][] = array("name" => $_GET["name"], "surname" => $_GET["surname"]); 

$json_string = json_encode($_SESSION['entries']); 

这会产生一个JSON。然而,我不知道你是否愿意,但你的输出是一系列单独的JSON。你可以通过替换上面最后一行做到这一点:

$json_string = ''; 
foreach($_SESSION['entries'] as $entry){ 
    $json_string.= json_encode($entry) . "\n"; 
} 

你也可能会想办法重置/空数组。

if(!array_key_exists('entries', $_SESSION)) 

到:在这种情况下,我的测试,如果从改变

if(!array_key_exists('entries', $_SESSION) || array_key_exists('reset', $_GET)) 

,你可以通过访问

http://myweb.com/index.php?reset 

编辑使用:如果在某处添加了以下代码:

foreach($_SESSION['entries'] as $id=>$entry){ 
    printf("%2d: %s\n", $id, json_encode($entry)); 
} 

您将获得由其各自键枚举的json元素的列表。例如,它可能看起来像:

 
0: "[{\"name\":\"Peter\",\"surname\":\"Brown\"}]" 
1: "[{\"name\":\"newname\",\"surname\":\"newsurname\"}]" 
2: "[{\"name\":\"George\",\"surname\":\"Washington\"}]" 
3: "[{\"name\":\"John\",\"surname\":\"Adams\"}]" 

如果再添加以下代码:

if(array_key_exists('del', $_GET) && is_numeric($_GET['del'])) 
{ 
    $key = (int)$_GET['del']; 
    if(array_key_exists($key, $_SESSION['entries'])) 
    { 
     unset($_SESSION['entries'][$key]); 
    } 
    else 
    { 
     printf('<strong>ERROR: $_GET['del'] = %d but $_SESSION['entries'][%d] doesn't exist.</strong>', $key, $key); 
    } 
} 

你就可以通过指定的ID作为del GET参数删除单个JSON条目。

例如,

http://myweb.com/index.php?del=2 

将删除与

项,其余项目将是:

 
0: "[{\"name\":\"Peter\",\"surname\":\"Brown\"}]" 
1: "[{\"name\":\"newname\",\"surname\":\"newsurname\"}]" 
3: "[{\"name\":\"John\",\"surname\":\"Adams\"}]" 
4: "[{\"name\":\"Thomas\",\"surname\":\"Jefferson\"}]" 
+0

对我来说,这是令人难以置信的有效。并且重置命令非常有用。是否可以删除特定条目?反正非常感谢这么快的答案! – doxsi

+0

当然,你想如何参考条目?换句话说,你想怎么做? – jedwards

+0

当我oborn一个单一的JSON,如: {“persons”:[{“name”:“Peter”,“surname”:“Brown”},{“name”:“Peter2”,“surname”:“newsurname1” }, {“name”:“Peter3”,“surname”:“Brown”},{“name”:“Peter4”,“surname”:“newsurname”}] } 是否可以只擦除一个? – doxsi

只是让用户的嵌套数组:

$data = array (
    0 => array("name"=>"Peter","surname"=>"Brown"), 
    1 => array("name"=>"newname","surname"=>"newsurname") 
); 

echo json_encode($data); 

// [{"name":"Peter","surname":"Brown"},{"name":"newname","surname":"newsurname"}] 
+2

这里的问题似乎是如何保存/检索其他用户。由于只有一个用户通过'GET'发送。所以嵌套数组是一个好主意,但是询问他应该在哪里保存这个数据,所以每次都会被加载。 –

我认为这将是最简单的数据存储在一个会话中,这样的事情:

<?php 
    session_start(); 

    if (isset($_GET['name'])) { 
     $_SESSION['json'][] = $_GET; 
    } 

    echo json_encode($_SESSION['json']); 
?> 

编辑:您可能希望在将$ _GET数组存储在会话中之前过滤$ _GET数组,以便不存储不需要存储的值。

编辑:当然,如果你想保存这个数据多个会话,你需要使用文件或数据库(或可能是一个cookie)。这完全取决于你想要对信息做什么。

+0

TX要回答,但我试过你的PHP,它似乎不工作。 – doxsi

+0

要使用会话,您总是需要在任何输出之前运行'session_start()'。我已经更新了答案。 – powerbuoy