试图让json_encode返回行名和mysql表中的数据

时间:2015-02-25 14:37:52

标签: php mysql json

我试图以JSON格式返回数据。所需的格式如下......

{ "projects" : [
  {
    "title":"title 1",
    "image":"Image1",
    "subtitle":"subtitle 1",
    "about":"Blah Blah Blah"
  },
  {
    "title":"title 2",
    "image":"Image2",
    "subtitle":"subtitle 2",
    "about":"Blah Blah Blah"
  }
]}

下面的代码从数据库中获取数据,并在视图中将其作为JSON数据返回。我的总体目标是以正确的JSON格式返回此数据,以便我可以使用视图中的mustaches模板工具查询它。当我将值设置为行,例如..

时,下面的代码非常有效
$userInfo["projects"][] = array("title" => $row[0], "subtitle" => $row[1], "about" => $row[3]);

但是,我不想使用此方法,因为我希望响应自动返回行名称和数据。原因是,如果用户向数据库添加新行,它将自动返回响应,而无需在代码中手动添加另一行。

下面的代码是我的api.php文件。

function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr";
}
//set error handler
set_error_handler("customError");

  $host = "localhost";
  $user = "root";
  $pass = "root";

  $databaseName = "laravel";
  $tableName = "projects";
  //$row ='';

$con = mysqli_connect('localhost','root','root');

$return = new stdClass();
$return->projects = array();  

$result = mysqli_query($con,"SELECT * FROM $tableName"); 

if($result !== false) {
  while($row = mysqli_fetch_object($result)){
      $return->projects[] = $row;
  }
}

//echo '<pre>';
  //print_r($return);
//echo '</pre>';

echo json_encode($return);

当我执行上面的echo '<pre>'(当前已注释掉)时,我得到以下结果。

    stdClass Object
(
    [projects] => Array
        (
        )

)

下面是我将数据作为JSON回显时的结果。有人可以帮帮我。

{"projects":[]}

提前感谢您提出任何建议或提示。

2 个答案:

答案 0 :(得分:0)

您应该使用mysql_fetch_assoc,这样您就可以将列的名称作为索引,而不是数字

答案 1 :(得分:0)

如果您坚持坚持使用mysql_*(因为不推荐使用它们,您不应该这样做),最好使用mysql_fetch_object。这会简化您的代码:

// initialize object to store return values
$return = new stdClass();
// create empty projects array on return object
$return->projects = array();  

$result = mysql_query("SELECT * FROM $tableName");

if($result !== false) {
    while($row = mysql_fetch_object($result)) {
        $return->projects[] = $row;
    }
}

echo json_encode($return);

一些注意事项:

  • 这里我消除了返回集中是否有行的整个if-else条件。如果调用者期望格式良好的JSON响应,则应该给他一个,即使它不包含任何行。在预期JSON时没有行时提供JSON编码的字符串响应的方法很糟糕,因为这不是官方记录的JSON数据格式。调用者可以轻松确定结果集中没有行并且相应地表现。
  • mysql_fetch_object()自动将列名设置为属性键,因此根本不需要在另一个操作中检索字段名。您还可以使用mysql_fetch_assoc来获取关联数组(编码为JSON对象表示法的数组相同)。我更喜欢思考和使用对象,因为这最终将是你要编码的东西(JSON没有关联数组概念)。我认为这使得代码读者的意图更加清晰。
  • 在构建数据结构之后,我在最后执行了一个json_encode()步骤。这是构建有效JSON的唯一方法。
  • 同样,您真的不应该使用mysql_*函数来获取新代码。使用mysqliPDO两者都支持从结果集中提取对象