2015-10-26 102 views
1

我試圖創建一個腳本,顯示基於URL路徑的結果。顯示基於URL路徑的結果

例如,我可以有一個URL,如example.com/A/B/C/D/,example.com/A/B/C/一直到example.com/

  • A =年
  • B =月
  • C =日
  • d =標題

下面的腳本不打碎它的一個好工作。

$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); 
$array = explode('/', $path); 

數據庫中的表有一個名爲'path'的列。路徑包含'/ A/B/C/D /'。難道還有比使用多個if/else語句來完成這個更簡單的方法:

空路徑(主頁,限5個結果:

SELECT * FROM table ORDER BY post_date DESC LIMIT 5; 

逐年搜索:

SELECT * FROM table WHERE path LIKE '/' . $array[1] . '/%'; 

通過搜索年和月

SELECT * FROM table WHERE path LIKE '/' . $array[1] . '/' . $array[2] . '/%'; 

按年和月和日搜索

SELECT * FROM table WHERE path LIKE '/' . $array[1] . '/' . $array[2] . '/' . $array[3] . '/%; 

按年份和月份和日期和標題

SELECT * FROM table WHERE path LIKE '/' . $array[1] . '/' . $array[2] . '/' . $array[3] . '/' . $array[4] . '/'; 

顯然,如果有人試圖以不同的順序,結果不應該被發現的錯誤頁面,輸入值(字母)搜索顯示。

回答

1

使用數組元素數生成您的路徑。

if (count($array)) { 
    $sql = "SELECT * FROM table WHERE path LIKE '/" . implode($array, '/') . "/%'"; 
} 

請參閱SQL Injection

0

更清潔的方法是定義不同的REST調用每個路徑參數的。我會使用像Flight這樣的PHP微型框架來處理它。例如,如果某些參數沒有被指定,那麼它將被路由到下一個等等。因此它能夠處理不同的params以及param特定的數據庫調用。通過這樣做可以消除邏輯或任何類型的歧義。

看看這裏的參考:

http://flightphp.com/learn#routing 

檢查傳遞機制。

+0

類似這樣:'Flight :: route('/ *',function(){ //這將匹配/ 2000/02/01/title });' – user1052448

+0

我不推薦使用通配符。重新定義你的api在路徑中有一些關鍵字,這樣可以區分資源以避免這個問題並清楚地分離路由。 – user3307291

+0

這麼堅持(@year(@month(@day(@title)))? – user1052448