通过 PHP 将 Sql 数据库转换为具有正确格式的 JSON,并在 PHP 脚本本身中对值进行排序

Posted

技术标签:

【中文标题】通过 PHP 将 Sql 数据库转换为具有正确格式的 JSON,并在 PHP 脚本本身中对值进行排序【英文标题】:Converting Sql database into JSON with proper formatting via PHP and sorting out values in the PHP script itself 【发布时间】:2016-08-26 05:13:01 【问题描述】:

为了构建我的 android 应用程序,我目前正在将我的 Wordpress SQL 数据库转换为 JSON。

这是我目前正在使用的脚本,我 found on Stack Overflow here:

    <?php

$host = "localhost";
$user = "*********";
$password = "********";
$db = "********";

$sql = "select * FROM wp_postmeta WHERE meta_key = 'event_start_date' OR meta_key = 'event_end_date' OR meta_key = 'event_start_time' OR meta_key = 'event_end_time' OR meta_key = 'event_phone' OR meta_key = 'post_views_count' OR meta_key = 'event_address_longitude' OR meta_key = 'event_address_latitude' OR meta_key = 'event_address_zip' OR meta_key = 'event_address_address' ORDER BY post_id ASC";
$con = mysqli_connect($host,$user,$password,$db);

$result = mysqli_query($con,$sql);
$response = array();


while($row = mysqli_fetch_array($result))
    array_push($response,array('post_id'=>$row[1],'meta_tag'=>$row[2],'meta_Value'=>$row[3]));




echo json_encode(array("server_response"=>$response));
mysqli_close($con);

?>

我得到的一小部分结果是这样的:


    "post_id": "3726",
    "meta_tag": "event_start_date",
    "meta_Value": "11\/25\/2015"
, 
    "post_id": "3726",
    "meta_tag": "event_start_time",
    "meta_Value": "08:00 PM"
, 
    "post_id": "3726",
    "meta_tag": "event_end_date",
    "meta_Value": "11\/25\/2015"
, 
    "post_id": "3726",
    "meta_tag": "event_end_time",
    "meta_Value": "11:00 PM"
, 
    "post_id": "3726",
    "meta_tag": "event_address_address",
    "meta_Value": "Tippler On The Roof 276, 100 FEET ROAD, INDIRANAGAR"
, 
    "post_id": "3726",
    "meta_tag": "event_address_zip",
    "meta_Value": "560038"
, 
    "post_id": "3726",
    "meta_tag": "event_address_latitude",
    "meta_Value": "12.9782859"
, 
    "post_id": "3726",
    "meta_tag": "event_address_longitude",
    "meta_Value": "77.63875669999993"
, 
    "post_id": "3726",
    "meta_tag": "post_views_count",
    "meta_Value": "65"
, 
    "post_id": "3727",
    "meta_tag": "event_address_address",
    "meta_Value": "F BAR & KITCHEN 18, ALI ASKAR ROAD OFF CUNNINGHAM ROAD"
, 
    "post_id": "3727",
    "meta_tag": "event_address_zip",
    "meta_Value": "560001"
, 
    "post_id": "3727",
    "meta_tag": "event_phone",
    "meta_Value": "9731110594"
, 
    "post_id": "3727",
    "meta_tag": "event_address_latitude",
    "meta_Value": "12.9887093"
, 
    "post_id": "3727",
    "meta_tag": "event_address_longitude",
    "meta_Value": "77.5937212"
, 
    "post_id": "3727",
    "meta_tag": "post_views_count",
    "meta_Value": "54"
, 
    "post_id": "3729",
    "meta_tag": "event_start_date",
    "meta_Value": "11\/25\/2015"
, 
    "post_id": "3729",
    "meta_tag": "event_start_time",
    "meta_Value": "08:00 PM"
, 
    "post_id": "3729",
    "meta_tag": "event_end_date",
    "meta_Value": "11\/25\/2015"
, 
    "post_id": "3729",
    "meta_tag": "event_end_time",
    "meta_Value": "11:30 PM"
, 
    "post_id": "3729",
    "meta_tag": "event_address_address",
    "meta_Value": "FUNKY VILLA 4TH FLOOR, NGV COMMERCIAL COMPLEX, KHB GAMES VILLAGE"
, 
    "post_id": "3729",
    "meta_tag": "event_address_zip",
    "meta_Value": "560047"
, 
    "post_id": "3729",
    "meta_tag": "post_views_count",
    "meta_Value": "77"
, 
    "post_id": "3731",
    "meta_tag": "event_start_date",
    "meta_Value": "12\/19\/2015"
, 
    "post_id": "3731",
    "meta_tag": "event_start_time",
    "meta_Value": "09:00 PM"

但这不是我希望我的结果出现的方式。因此,在我的 php 脚本中获取结果数组后,我想对其本身的值进行排序,然后以 JSON 格式将其传递给我的应用程序。

如您所见,现在每个部分都包含 3 个值:post_id、meta_tag 和 meta_value。所以,我想用它做两件事:

    将所有具有公共 post_id 的小数组合并为一个。 那么,现在出现的 3 个值并不是我需要的。实际上 meta_tag 显示的值应该替换 meta_tag 并且 meta_value 的值应该成为它的值。

为避免混淆并正确看待问题,我希望上述结果如下所示:


        "post_id": "3726",
        "event_start_date": "11\/25\/2015",
        "event_start_time": "08:00 PM"
        "event_end_date": "11\/25\/2015"
        "event_end_time": "11:00 PM"
        "event_address_address": "Tippler On The Roof 276, 100 FEET ROAD, INDIRANAGAR"
        "event_address_zip": "560038"
        "event_address_latitude": "12.9782859"
        "event_address_longitude": "77.63875669999993"
        "post_views_count": "65"
        

我已经展示了一个 post_id 的输出 Json 示例。所有帖子都必须这样做。我需要一个循环解决方案,可以用来覆盖数据库中的所有帖子(并且有 100 个)。

【问题讨论】:

你能发布你的数据库的sn-p吗?如果您在 1 个 id 的不同行上有多个信息,似乎您可能需要对其进行规范化。 【参考方案1】:

你需要合并表 wp_posts 和 wp_postmeta:

select p.ID as post_id p,
(select meta_value from wp_postmeta where meta_tag='event_start_date' && post_id=p.ID) as event_start_date,
(select meta_value from wp_postmeta where meta_tag='event_start_time' && post_id=p.ID) as event_start_time,

...

from wp_posts

解释:

您要检索的是每个帖子的数据集,因此您的主要查询是 wp_posts 而不是 wp_postmeta。然后,您希望从 wp_postmeta 中的各个行向该行添加数据,因此 wp_postmeta 是您的辅助查询。

【讨论】:

嘿 Markt,感谢您抽出一些时间来帮助我解决这个问题。但我无法得到它。当所有这些值都存在于 wp_postmeta 中时,为什么要合并来自 wp_posts 的表? 因为 wp_posts 表将它们与 post_id 联系在一起 - 然后您可以将它们全部放在一行中 哦,是的,我认为这是一种有效的方法和正确的工作方向。但是我现在得到的结果包含空值。也许必须进行一些更改才能使这个东西正常工作。 如果特定 post_id 的 meta_tag 不存在,那么您将获得空值。我只想写一些 php 代码来处理这个。 如果meta_tag对于一个帖子都不存在,那么会返回空值吗?【参考方案2】:
while($row = mysqli_fetch_array($result))
    if( ! isset($response[$row[1]])) 
        $response[$row[1]] = array('post_id'=>$row[1]);
    $response[$row[1]][$row[2]] = $row[3];

// to make index numeric
$response = array_value($response);

【讨论】:

感谢您抽出宝贵时间帮助我解决 splash58。但是这段代码似乎不起作用。我收到“URL 返回错误状态代码 500”。我应该在 "while($row = mysqli_fetch_array($result)) array_push($response,array('post_id'=>$row[1],'meta_tag'=>$row[2],'meta_Value' =>$row[3])); " 对吗? 只需 print_r 生成 $responce 即可查看生成的数组结构。 恐怕还是不行。使用 print_r 服务器也会给出 500 错误。 您只能使用 print_r 进行调试 - 观察数组结构。不适用于生产代码 是的,我在本地 Xampp 服务器上进行了测试以进行测试。它没有用。你确定它会起作用吗?

以上是关于通过 PHP 将 Sql 数据库转换为具有正确格式的 JSON,并在 PHP 脚本本身中对值进行排序的主要内容,如果未能解决你的问题,请参考以下文章

php PHP:将SQL日期格式转换为PHP可读

将日期转换为正确的格式

PHP 将格式错误的UTF-8 HTML转换为正确格式的UTF-8纯文本字符串。

如何正确地将数据帧的所有日期时间列转换为 iso 格式

PHP 将MM / DD / YYYY转换为SQL日期格式

Spark:将 JSON 文件转换为正确的格式