2014-02-19 26 views
0

我一直在這一直敲打我的頭,仍然不能拿出一些工作的答案。使用mysql和php創建一個網址樹

我想通過我的網站上的cookie跟蹤我的所有訪問者,並使用mysql行中包含的唯一用戶密鑰保存用戶訪問的當前URL(或路徑)。

經過一段時間和一些獨特的訪問者,我想創建一個用戶通過我的網站跟蹤的路徑樹。 (就像谷歌分析那樣有訪客流量報告)。

但我不能以某種方式弄清楚如何使通過這些排走,並創建一個URL的「樹」(計數或百分比)

如果有人可以幫助我的查詢,這將是非常感激。

- 編輯 我已經有一個MySQL數據庫和表格到位

CREATE TABLE `journies` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `site_id` int(11) NOT NULL, 
    `profile_id` int(11) NOT NULL, 
    `url` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE `profiles` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `site_id` int(11) NOT NULL, 
    `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

- 更新2 奧凱,這可以更好地解釋什麼,我想做的事情。

我想創建一個樹,像這樣的網址:

            /- domain.com/news (100%) 
        /- domain.com/about (33%) --/ 
domain.com (100%) --/ 
        \- domain.com/contact (33%) 
        \- domain.com/news (33%) --\ 
               \- domain.com/news/id/1 (100%) 

Ofcourse,這可能與多個查詢來實現(雖然這將是巨大的,如果它可以用一個來完成;))

回答

1

好了,這是一個謊言,但我想我終於得到了東西給你一起工作。

前提是從數據庫中提取URL和計數,並通過url對它們進行分組和排序。將這些結果存儲到主數組中。然後,找到我稱之爲主幹的url的基本域。循環遍歷主數組,並查找與主幹具有相同基本域的任何項目並查找它們的百分比。

另一件要注意的是,這些是特定於層次的。因此cnn.com/employees(2個等級)將與cnn.com/news處於同一等級。

下面是我用這個SQL數據:

INSERT INTO `journies` (`id`, `site_id`, `profile_id`, `url`, `created_at`, `updated_at`) VALUES 
    (1, 1, 1, 'domain.com', '2014-02-19 15:34:54', '0000-00-00 00:00:00'),      
    (2, 1, 1, 'domain.com/about', '2014-02-19 15:35:57', '0000-00-00 00:00:00'),     
    (3, 1, 1, 'domain.com/contact', '2014-02-19 15:36:12', '0000-00-00 00:00:00'),    
    (4, 1, 1, 'domain.com/news', '2014-02-19 15:36:29', '0000-00-00 00:00:00'),     
    (5, 1, 1, 'domain.com/news/id/1', '2014-02-19 15:39:26', '0000-00-00 00:00:00'),    
    (6, 1, 1, 'domain.com/contact', '2014-02-19 15:50:26', '0000-00-00 00:00:00'),    
    (7, 1, 1, 'cnn.com/news/id/1', '2014-02-19 16:00:02', '0000-00-00 00:00:00'),    
    (8, 1, 1, 'cnn.com/news', '2014-02-19 16:00:15', '0000-00-00 00:00:00'),      
    (9, 1, 1, 'cnn.com', '2014-02-19 16:00:25', '0000-00-00 00:00:00'),       
    (10, 1, 1, 'cnn.com', '2014-02-19 16:46:16', '0000-00-00 00:00:00'),       
    (11, 1, 1, 'cnn.com', '2014-02-19 16:46:16', '0000-00-00 00:00:00'),       
    (12, 1, 1, 'domain.com/news/id/1', '2014-02-20 08:47:23', '0000-00-00 00:00:00'),   
    (13, 1, 1, 'domain.com/news/id/1', '2014-02-20 08:47:23', '0000-00-00 00:00:00'),   
    (14, 1, 1, 'domain.com/news/id/2', '2014-02-20 08:53:29', '0000-00-00 00:00:00'),   
    (15, 1, 1, 'domain.com/prices', '2014-02-20 12:40:44', '0000-00-00 00:00:00'),    
    (16, 1, 1, 'domain.com/prices', '2014-02-20 12:40:44', '0000-00-00 00:00:00'),    
    (17, 1, 1, 'cnn.com/employees/friekot', '2014-02-20 15:23:34', '0000-00-00 00:00:00'),  
    (18, 1, 1, 'cnn.com/employees', '2014-02-20 15:23:34', '0000-00-00 00:00:00');    

這裏是我想出了代碼:

<?php 



$link = mysqli_connect("localhost", "user", "pass", "database"); 






// SET THE DEFAULTS 
$trunk_array = array(); 
$master_array = array(); 






// PULL OUT THE DATA FROM THE DATABASE 
$q_get_tracking_info = "SELECT *, COUNT(url) AS url_count FROM journies WHERE site_id = 1 AND profile_id = 1 GROUP BY url ORDER BY url;"; 
$r_get_tracking_info = mysqli_query($link, $q_get_tracking_info) or trigger_error("Cannot Get Tracking Info: (".mysqli_error().")", E_USER_ERROR); 



while ($row_get_tracking_info = mysqli_fetch_array($r_get_tracking_info)) { 



    $url = $row_get_tracking_info['url']; 
    $url_count = $row_get_tracking_info['url_count']; 






    // EXPLODE THE DOMAIN PARTS 
    $domain_parts = explode('/', $url); 






    // FIND THE TOTAL COUNTS FOR EACH LEVEL OF ARRAY 
    // - SO THAT WE CAN DIVIDE BY IT LATER TO GET THE PERCENTAGE 
    $count = count($domain_parts); 
    if (!isset($level_totals[$domain_parts[0]])) { 
     $level_totals[$domain_parts[0]] = array(); 
    } 

    if (isset($level_totals[$domain_parts[0]][$count])) { 
     $level_totals[$domain_parts[0]][$count] += $url_count; 
    } 
    else { 
     $level_totals[$domain_parts[0]][$count] = $url_count; 
    } 






    // BUILD A TRUNK ARRAY SO WE CAN DEFINE SECTIONS 
    if ($url == $domain_parts[0]) { 
     $trunk_array[] = array($url, $url_count); 
    } 






    // BUILD A MASTER ARRAY OF THE ITEMS AS WE WILL LAY THEM OUT 
    $master_array[$url] = $url_count; 


} 






// FIND THE TOTAL TRUNK COUNT SO WE CAN DIVIDE BY IT LATER 
$total_trunk_count = 0; 
foreach ($trunk_array AS $trunk_array_key => $trunk_array_val) { 
    foreach($trunk_array_val AS $trunk_count_val) { 
     $total_trunk_count += $trunk_count_val[0]; 
    } 
} 






// LOOP THROUGH THE TRUNK ITEMS AND PULL OUT ANY MATCHES FOR THAT TRUNK 
foreach ($trunk_array AS $trunk_item_key => $trunk_item_val) { 



    $trunk_item = $trunk_item_val[0]; 
    $trunk_count = $trunk_item_val[1]; 






    // FIND THE PERCENTAGE THIS TRUNK WAS ACCESSED 
    $trunk_percent = round(($master_array[$trunk_item]/$total_trunk_count) * 100); 






    // PRINT THE TRUNK OUT  
    print "<BR><BR>".$trunk_item.' - ('.$trunk_percent.'%)'; 






    // LOOP THROUGH THE MASTER ARRAY AND GET THE RESULTS FOR ANY PATHS UNDER THE TRUNK 
    foreach ($master_array AS $master_array_key => $master_array_val) { 



     // PERFORM A MATCH FOR DOMAINS BELONGING TO THIS PARTICULAR TRUNK 
     if (preg_match('/^'.$trunk_item.'/', $master_array_key)) { 



      // SET A DEFAULT DELIMITER PAD 
      $delimiter_pad = ''; 






      // EXPLODE EACH PATH INTO PARTS AND COUNT HOW MANY PARTS WE HAVE 
      $domain_parts_2 = explode('/', $master_array_key); 
      $count = count($domain_parts_2); 






      // SET THE DELIMITER FOR HOW FAR DOWN ON THE TREE WE ARE 
      // EACH INDENT WILL HAVE 8 SPACES 
      for ($i = 2; $i <= $count; $i++) { 
       $delimiter_pad .= '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'; 
      } 






      // SINCE WE ALREADY PRINTED OUT THE TRUNK, WE WILL ONLY SHOW ITEMS THAT ARE NOT THE TRUNK 
      if ($master_array_key != $trunk_item) { 



       // FIND THE PERCENTAGE OF THE ITEM, GIVEN THEIR LEVEL IN THE TREE 
       $path_percentage = round(($master_array[$master_array_key]/$level_totals[$trunk_item][$count]) * 100); 






       // PRINT OUT THE PATH AND PERCENTAGE 
       print "<BR>".$delimiter_pad."|- ".$master_array_key.' - ('.$path_percentage.'%)'; 



      } 



     } 



    } 



} 

最後,所有的輸出這樣的:

cnn.com - (75%) 
     |- cnn.com/employees - (50%) 
       |- cnn.com/employees/friekot - (100%) 
     |- cnn.com/news - (50%) 
         |- cnn.com/news/id/1 - (100%) 

domain.com - (25%) 
     |- domain.com/about - (17%) 
     |- domain.com/contact - (33%) 
     |- domain.com/news - (17%) 
         |- domain.com/news/id/1 - (75%) 
         |- domain.com/news/id/2 - (25%) 
     |- domain.com/prices - (33%) 

可能有一個更簡單的方法來做到這一點,但這是我想到的方法。我希望這對你有用!

+0

這太神奇了!非常感謝!!! – frietkot

0

好的,所以你可以寫一個這樣的查詢,它會查找一個特定的用戶和站點,並按照他們訪問它們的順序吐出他們訪問的每個url

$sql = "SELECT url FROM journies WHERE site_id = 1 AND profile_id = 1 ORDER BY created_at"; 

$result = mysqli_query($connection, $sql); 

while ($row = mysqli_fetch_array($result)) { 
    $page_array[] = $row['url']; 
} 

$page_list = implode("\n =>", $page_array); 

這將輸出:

domain.com 
=> domain.com/about 
+0

感謝您的建議(請檢查我的問題以瞭解更新)。 我在數據庫 \t http://domain.com 2014年2月17日二十二點00分00秒\t 0000-00-00 00:00:00 \t 1下面的例子1 \t http://domain.com/about \t 2014-02-17 22:10:00 \t 0000-00-00 0000-00-00 00:00:00 id - site_id - profile_id - url - created_at - updated_at – frietkot

+0

好的,so你已經將信息存儲在數據庫中了?那麼你只是問如何將數據提取到報告中?如果是這樣的話,我也可以幫助你。你希望報告看起來如何?具體來說,這個部分的「樹」的網址(有數量或百分比)' – Quixrick

+0

是的:)並把它變成一棵樹。 從這個例子我想它是這樣的: /=> /約 – frietkot