簡體   English   中英

PHP MYSQL 結果成表

[英]PHP MYSQL Results into a table

我有一個返回以下內容的 PHP/MySQL 查詢:

array ( 'name' => 'Jess', 'month' => '2020-03-31 12:28:00', 'count' => '1', )
array ( 'name' => 'Bob', 'month' => '2020-04-31 12:28:00', 'count' => '2', )
array ( 'name' => 'Tom', 'month' => '2020-05-31 12:28:00', 'count' => '2', )
array ( 'name' => 'Bob', 'month' => '2020-05-31 12:28:00', 'count' => '2', )

月份以有序的方式返回(例如,一月的記錄總是在二月的記錄之前)。 然而,並不是每個用戶每個月都會有結果(見上文)。

我希望我的數據在 html 表中顯示如下:

Month Jess Bob Tom
March   1   
April       2   
May         2   2

這是我的(非工作)嘗試:

<?php

/*loop through all customers and print out each induvidual users performance*/


$con = mysqli_connect("localhost","root","","perfmon");

if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit();
}


//main query for customer names
if ($customers = mysqli_query($con, "SELECT Distinct(customer_name) FROM slog ORDER BY customer_name DESC;")) {

    while($row=mysqli_fetch_assoc($customers))
    {
        $name = $row["customer_name"];
        print("<b>".$name." </b><br>");
        $total = 0;
        $cur_month = NULL;
        $namepos = array();
        $th = "<th>Month</th>";
        $tr = "";
        
        
        $npcount = 0;
        
            //Loop over the customer names, and pull the modified count per user.
            if ($user_perf = mysqli_query($con, "select modified_by as name, created_date as month, count(modified_by) as count from slog where customer_name = '$name' group by modified_by, MONTH(created_date) order by month;")) {

                while($row=mysqli_fetch_assoc($user_perf))
                {
                    //Assign variables from mysql results
                    $month = date("F",strtotime($row["month"]));
                    $name = $row["name"];
                    $count = $row["count"];
                    $total +=  $row["count"];   
                    
                    //Only add the month once!
                    if($cur_month != $month){
                        $cur_month = $month;
                        $tr .= "</tr><tr><td>" . $cur_month. "</td>";
                        //print($cur_month . "<br>");
                    }
                    
                    //store the username 'position' to build a table (this determines how many spaces are needed.)
                    if(!array_key_exists($name,$namepos))
                    {
                        $namepos[$name] = $npcount;
                        $npcount += 1;
                        $th .= "<th>" .$name . "</th>";
                    }
                    
                    //add details to tr in correct pos
                    for( $i = 0; $i < $namepos[$name]; $i++){
                        $tr .= "<td></td>";
                    }
                    $tr .= "<td> ".$count." </td>";
                    
                    
                    
                    //print("&emsp;".$name . " " . $count . " <br>");

                }
                print("<table  border='1'><tr>". $th . "</tr>" . $tr . "</table>");
                
                print("<br>Total: ".$total." <br><br> ");
                mysqli_free_result($user_perf);
            }

      
      
    }

  mysqli_free_result($customers);
}









mysqli_close($con);

?>

不幸的是,結果是這樣的:- 在此處輸入圖片說明

實現這一目標的最佳方法是什么? 我曾嘗試將每個用戶的位置存儲在表標題中,但是很難知道要添加多少空列和條目(見上圖)。

只是一個快速的更新。 我設法通過以下代碼獲得了我想要的

<?php

/*loop through all customers and print out each induvidual users performance*/


$con = mysqli_connect("localhost","root","","perfmon");

if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit();
}


//main query for customer names
if ($customers = mysqli_query($con, "SELECT Distinct(customer_name) FROM slog ORDER BY customer_name DESC;")) {

    while($row=mysqli_fetch_assoc($customers))
    {
        //Name of customer
        $name = $row["customer_name"];
        //Print customer name
        print("<b>".$name." </b><br>");
        //Used to display total jobs
        $total = 0;


        $user_list = array("Month");
        $monthlist = array();
        $st_array = array();

        
        
            //Loop over the customer names, and pull the modified count per user.
            if ($user_perf = mysqli_query($con, "select modified_by as name, created_date as month, count(modified_by) as count from slog where customer_name = '$name' group by modified_by, MONTH(created_date) order by month;")) {

                while($row=mysqli_fetch_assoc($user_perf))
                {
                    $month = date("F",strtotime($row["month"]));
                    $name = $row["name"];
                    $count = $row["count"];
                    $total +=  $row["count"];   
                    
                    //make our left column (months)
                    if(!in_array($month, $monthlist)){
                        array_push($monthlist, $month);
                    }
                    
                    //Collect all unqiue users, to make our headers array. also stores the order theyre in.
                    if(!in_array($name, $user_list)){
                        array_push($user_list, $name);
                    }
                    
                    //make a 2d array of all data 
                    $tmp = [$month, $name, $count];
                    array_push($st_array, $tmp);
                    
                }
                
                /**Process fetched data **/
            
                $row = "";
                $previous_pos = 1; 
                $fe = True;
                
                //Print each unique user as a table header
                print("<table border='1'>");
                print("<tr>");
                foreach ($user_list as $th){
                    print("<th>".$th."</th>");
                }
                print("</tr>");
                
                //Loop the month array
                foreach ($monthlist as $td){
                    //Loop the user array
                    foreach ($user_list as $usr){
                        //Loop our "2d" array (an array containing Month,User,Count)
                        foreach($st_array as $array_2d){
                            
                            //If we match the correct month and user, return the count value. This ensures the users return in the correct order.
                            if ($array_2d[0] == $td && $array_2d[1] == $usr){
                                
                                //Pos - Get the current position of the selected user.
                                //Establish how many empty entries need to come before. E.g. User in col 1 has no empty entries infront. User in column2 has 1 entry empty infront (if column 1 is empty).
                                $pos = array_search($usr, $user_list);
                                if ($previous_pos != $pos){
                                    
                                    $row .= str_repeat("<td>0</td>", ($pos-$previous_pos-1));

                                }
                                //Assign our previous position
                                $previous_pos = $pos;
                                
                                //If our first entry isn't in column 1, add an extra 0.
                                if($pos!==1 && $fe)
                                    $row .= "<td>0</td>";
                                $fe = False;
                                //Add the data
                                $row .= "<td>".($array_2d[2])."</td>";  //change to [1] for debug
                            }
                            
                        }
                    }
                    
                    //Print the table row.
                    print("<tr><td>".$td ."</td>" . $row ."</tr>");
                    //Reset our variables.
                    $row = "";
                    $fe=True;
                    $previous_pos = 1;
                    $first_result  = True;
                }
                print("</table></br>");
                mysqli_free_result($user_perf);

            }

    }

  mysqli_free_result($customers);
}
mysqli_close($con);

?>

基本上我創建了 3 個數組。 用戶數組、月份數組和所有數據數組(3d 數組)。 我使用月份和用戶來記錄表格的顯示順序。 然后我遍歷我的 3d 數組並打印相關數據。

盡管投反對票,我還是要感謝大家提供的幫助。 如果您有任何建議,請讓我知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM