简体   繁体   中英

How can I count number of occurrence in one column and add the next respective column in MYSQL, PHP and present to datatable

I get this error when correcting the below php, although yesterday I alter my table few things.

DataTables warning: table id=categories - Invalid JSON response. For more information about this error,

**DB**
**id    siteid      sitenm        cat         comm**
   1    TS002AAA    Kimara        DSM          47
   2    TS899DDDD   Igawilo       Mbeya        11
  10    TS0004AAA   Malamba       Mbezi        21
   3    TS003AAA    Mapana TTCL   Tanga         3
   9    TS0003AAA   Mivinjeni     Tanga         1

OUTPUT SHOULD LOOK LIKE

**No    cat         total_site    total_comments**
   1    DSM           2                 68
   2    Mbeya         1                 11
   3    Tanga         2                 39
          

PHP

When I run php script itself I found this error: Fatal error: Uncaught Error: Object of class mysqli_result could not be converted to string in C:\xampp\htdocs\altech\scripts\fetchcat.php:29 Stack trace: #0 {main} thrown in C:\xampp\htdocs\altech\scripts\fetchcat.php on line 29

    <?php
    //fetch.php
    include('config.php');
     
    $columns = array('sitenm', 'cat', 'comm');
    
    $query = mysqli_query($connect, "SELECT cat, COUNT(sitenm) AS total_sites, SUM(comm) AS total_comm FROM systemsites GROUP BY cat");
    
    while ($row = $query->fetch_assoc()) {
       /* echo $row{'cat'}." ";
        echo $row{'total_sites'}." ";
        echo $row{'total_comm'}." "."</br>";*/
    }
    
    if(isset($_POST["search"]["value"]))
    {
     $query .= 'WHERE sitenm LIKE "%'.$_POST["search"]["value"].'%" 
     OR sitenm LIKE "%'.$_POST["search"]["value"].'%" 
     ';
    }
    
    if(isset($_POST["order"]))
    {
     $query .= 'ORDER BY '.$columns[$_POST['order']['0']['column']].' '.$_POST['order']['0']['dir'].' 
     ';
    }
    else
    {
    $query .= 'ORDER BY siteid DESC ';
    }
    
    $query1 = '';
    
    if($_POST["length"] != -1)
    {
     $query1 = 'LIMIT ' . $_POST['start'] . ', ' . $_POST['length'];
    }
    
    $number_filter_row = mysqli_num_rows($query);
    
    $result = mysqli_query($connect, $query . $query1);
    
    $data = array();
    
    while($row = mysqli_fetch_array($result))
    {
     $sub_array = array();
     $sub_array[] = '<div data-id="'.$row["id"].'" data-column="sitenm">' . $row["cat"] . '</div>';
     $sub_array[] = '<div data-id="'.$row["id"].'" data-column="cat">' . $row["total_sites"] . '</div>';    
     $sub_array[] = '<div data-id="'.$row["id"].'" data-column="comm">' . 
        $row["comm"] . '</div>';
         $sub_array[] = '<button type="button" name="delete" class="btn btn-danger 
        btn-xs delete" id="'.$row["id"].'">Delete</button>';
         $sub_array[] = '<button type="button" name="preview" class="btn btn-success 
        btn-xs preview" id="'.$row["id"].'">Liew Preview</button>';
         $data[] = $sub_array;
        }
    
        function get_all_data($connect)
        {
         $query = "SELECT * FROM systemsites";
         $result = mysqli_query($connect, $query);
         return mysqli_num_rows($result);
        }
   
        $output = array(
         "draw"    => intval($_POST["draw"]),
         "recordsTotal"  =>  get_all_data($connect),
         "recordsFiltered" => $number_filter_row,
         "data"    => $data
         );
    
         echo json_encode($output);
         ?>

JS

    <script type="text/javascript" language="javascript" >
    $(document).ready(function(){
    //fetch cat data    
      fetch_data();
      function fetch_data()
      {
       var dataTable = $('#categories').DataTable({
        "processing" : true,
        "serverSide" : true,
        "order" : [],
        "ajax" : {
         url:"../scripts/fetchcat.php",
         type:"POST"
        },
           "columns": [
      { "data": "sitenm" },
      { "data": "total_sites" },
      { "data": "total_comm" },
    ]
       });
      }
    });
    </script>

you can use group by on region and count for places and sum for comments

tested on pgsql

select region, count(Places) total_places, sum (Comments) as total_comments
from table
group by region

and in your datatable code

//    datatables
"ajax" ...
"columns": [
{
    "data": "cat" ,
    "render": function ( data, type, row ) {
        return '<div data-id="'.data.sitenm.'" data-column="sitenm">' . data.cat .'</div>';     
    },
{
    "data": "total_places" ,
    "render": function ( data, type, row ) {
        return '<div data-id="'.data.id.'" data-column="cat">' . data.total_sites . '</div>';    
    },
{
    "data": "comm" ,
    "render": function ( data, type, row ) {
        return ''<div data-id="'.data.id.'" data-column="comm">' . data.comm . '</div>';    
    }
,{
    "data": null,
    "render": function ( data, type, row ) {

        var btn = '<button type="button" name="delete" class="btn btn-danger btn-xs delete" id="'.data.id.'">Delete</button>';
        btn +=  '<button type="button" name="preview" class="btn btn-success btn-xs preview" id="'.data.id.'">Liew Preview</button>';

    return  btn;    
    }
}

]

or just do it simply

[
        { "data": "cat"}
        { "data": "total_sites"     },
        { "data": "comm" }  ,
        {
            data: null,
            "render": function ( data, type, row ) {

                var btn = '<button type="button" name="delete" class="btn btn-danger btn-xs delete" id="'.data.id.'">Delete</button>';
                btn +=  '<button type="button" name="preview" class="btn btn-success btn-xs preview" id="'.data.id.'">Liew Preview</button>';

            return  btn;    
            }
        }
    ]

return result array and render html in columnsdef

$data = mysqli_fetch_array($result);
$output = array(
 "draw"    => intval($_POST["draw"]),
 "recordsTotal"  =>  get_all_data($connect),
 "recordsFiltered" => $number_filter_row,
 "data"    => $data
 );

 echo json_encode($output);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM