【问题标题】:Outputting concatenated data from mysql to json as json object将连接的数据从 mysql 输出到 json 作为 json 对象
【发布时间】:2016-05-02 19:26:30
【问题描述】:

这是我的数据库:

我正在尝试将 to_id 为 4 的所有 from_id 获取到一个 json 对象,在该对象中,无法在堆栈中显示来自 from_id 的所有消息,并按不同的 time_sent 排序

我试过了:

代码: 数据库查询类(这是在 DBASE 类中)

public function query($sql){    

 $this->_last_query = $sql;
 $result = mysqli_query($this->_conndb, $sql);
 $this->displayQuery($result);
 return $result;    

} // end of query

public function displayQuery($result){
if(!$result){
    $output = "database query failed :". mysqli_error($this->_conndb);
    $output .= "last sql query was: ".$this->_last_query;
    die($output);       
    }   
    else{
        $this->_affected_rows = mysqli_affected_rows($this->_conndb);

        }
} //End of query results

public function fetchAll($sql){
    
    $result =  $this->query($sql);
    $out =  array();
    while($row =  mysqli_fetch_assoc($result)){
        $out[] =  $row;
    }
    mysqli_free_result($result);
    return $out;
}   

消息类:

private $_table = 'messages';
public function getadminMessage(){
     $sql = "SELECT group_concat(messg, time_sent, from_id) as from_id from {$this->_table} where to_id = 4 group by from_id"; 
    return $this->db->fetchAll($sql);//IN THE DBASE CLASS ABOVE
    
    }

在文件getadminmessage.php中

    $message = new Message();
$results  = $message-> getadminMessage();
echo json_encode($results);

然后我使用 getjson

$.getJSON("http://127.0.0.1/tum_old/custom/php/getadminmsg.php",

function(response){
console.log(response);

});

在我的日志中我得到

数据似乎是组连接的,但我也希望各种消息采用对象形式,即消息显示为对象,以便我可以轻松做到:

data.object[0].from_id[0].msg 获取 TRUE LOVE 作为消息

scais::::

【问题讨论】:

  • 您对查询结果进行分组是否有原因?您可能可以只使用结果加上关联数组中的所有这些列。另外,请确保输出 json 格式的字符串 (php.net/json_encode)
  • 我实际上正在开发一个聊天应用程序。在此代码中,用户可以从不同的人那里获取消息,并且一个人可以发送多条消息。因此,通过对它们进行分组,用户可以在一个捆绑包下查看多条消息.....您能否更清楚地使用结果

标签: php mysql json


【解决方案1】:

选择你需要的

$sql = "SELECT group_concat(messg) as msg, time_sent, from_id
  from {$this->_table} where to_id = 4 group by from_id"; 

对于服务器端,您需要 json_encode 数组

public function fetchAll($sql){

  $result =  $this->query($sql);
  $out =  array();
  $cnt =0;
  while($row =  mysqli_fetch_assoc($result)){
    $out[$cnt]['msg'] =  $row['msg'];
    $out[$cnt]['time_sent'] =  $row['time_sent'];
    $out[$cnt]['from_id'] =  $row['from_id'];

    $cnt++;
  }
  mysqli_free_result($result);
  return json_encode($out);
}

【讨论】:

  • 收到无法获取非对象属性的错误。让我用完整的连接和查询类更新问题
  • 我已经更新了答案(fetch_assoc 返回数组而不是对象..)
  • 我现在收到未定义索引的错误(msg,form_id,time_sent)
  • 更改后出现未定义偏移量(0,1,2)的错误
  • 我已经用正确的 select ..and loop for render 更新了 asnwer
【解决方案2】:

试试这个:

   public function fetchAll($sql){

    $result =  $this->query($sql);
    $out =  array();
    while($row =  mysqli_fetch_assoc($result)){

        $out[] = array(
            'id' => $row['id'],
            'from_id' => $row['from_id'],
            'to_id' => $row['to_id'],
            'msg' => $row['messg']
        );
    }
    mysqli_free_result($result);
    return json_encode($out);
    }

【讨论】:

    【解决方案3】:

    在将结果行输出为 json 编码字符串之前,请尝试删除 group by 语句并构建一个新的多维数组。请参阅下面的示例

    $out = array(
        'messages' => array(),
    );
    while($row =  mysqli_fetch_assoc($result)){
        $out['messages'][$b['from_id']][] = array(
            'msg' => $b['message'],
            'time_sent' => $b['time_sent'],
        );
    }
    return $out;
    

    您的 $out['messages'] 数组中的键将是您的 from_id 值。每个条目将是来自每个 id 的消息数组,因此在您的 javascript 中您应该能够遍历这些

    【讨论】:

      猜你喜欢
      • 2018-01-01
      • 2012-07-17
      • 2020-10-06
      • 1970-01-01
      • 2019-04-30
      • 2017-05-04
      • 2022-07-20
      • 2021-03-05
      • 2018-06-09
      相关资源
      最近更新 更多