PHP:使用Mysqli消除连接上的列名称

时间:2014-01-15 21:11:34

标签: javascript php sql json mysqli

此问题涉及由于JOIN中的列名冲突而导致数据丢失。具体来说,使用PHP的mysqli并将数据作为JSON对象返回。

假设您有两个使用另一个查找表相​​互关联的表。

例如,假设您有用户:

user

id      name
---------------------
1       John Thomas

和食谱:

recipe

id     name
---------------------
15     Fried Chicken

这些配方的所有权/权利在查找表中定义:

user_recipe

user   recipe
--------------
1      15

因此,在这种情况下,John Thomas有权查看炸鸡配方。

假设您希望获得包含所有这些数据的记录,因此您可以构建如下查询:

SELECT *
FROM `user_recipe`
  INNER JOIN `recipe`
    ON `recipe`.id = `user_recipe`.recipe
  INNER JOIN `user`
    ON `user`.id = `user_recipe`.user;

现在让我们说你正在使用PHP的mysqli对象。然后使用json_encode并将数据传回您的javascript。大!除了数据如下:

{
    id:15,
    user:1,
    recipe:15,
    name:"Fried Chicken"
}

您如何解决此问题?你可以使用别名,但是如果有更多的列并且你不想将它们全部写出来呢?

1 个答案:

答案 0 :(得分:1)

如果你使用mysqli的方法fetch_fields,你可以将数据分成组,或者在字段名称或其他任何你想要的地方添加前缀。

以下是一个例子:

$sql = '...QUERY...';
$mysqli->query($sql);
$fields = $result->fetch_fields();
$output = array();
while ($row = $result->fetch_array())
{
    $newoutput = array();
    foreach($row as $key=>$value)
    {
        if (is_numeric($key))
            $newoutput[$fields[$key]->table][$fields[$key]->name] = $value;
    }
    $output[] = $newoutput;
}
$result->free();
echo json_encode($output);

这样做之后,数据将以这种格式传回:

{
    user_recipe:{
        user:1,
        recipe:15
    },
    user:{
        id:1,
        name:"John Thomas"
    },
    recipe:{
        id:15,
        name:"Fried Chicken"
    }
}

当然,您可以根据需要构建JSON对象。

相关问题