2012-02-03 107 views
2

我做了這個功能,因爲我在整個網站上使用它,我想知道它是否是一種優化它的方法,使它運行更快?我也想知道我是否認爲功能好?謝謝。有沒有辦法優化這個定製功能?

// function to get the seo friendly url of a video based on it's id 
function video_seo_urls($video_id) 
{ 
    global $site_url; 
    $sql = dbquery('SELECT `post_name`, `new_post_name`, `category` FROM `videos` WHERE `id` ="'.$video_id.'" LIMIT 0,1;'); 
    while($row = mysql_fetch_array($sql)) 
    { 
     $post_name = $row["post_name"]; 
     $new_post_name = $row["new_post_name"]; 
     $category_id = $row["category"]; 
    } 

    $csql = dbquery('SELECT `category_slug` FROM `categories` WHERE `category_id` = "'.$category_id.'" LIMIT 0,1;'); 
    while($row = mysql_fetch_array($csql)) 
    { 
     $category = $row["category_slug"]; 
    } 

    if ($new_post_name !== "") 
    { 
     $video_slug = $new_post_name; 
    } 
    else if ($new_post_name == "" && $post_name !== "") 
    { 
     $video_slug = $post_name; 
    } 

    $video_url = $site_url.'video/'.$category.'/'.$video_slug.'/'; 
    return $video_url; 

} 

echo video_seo_urls(14775); 
+0

它真的太慢了​​,你必須優化? – JJJ 2012-02-03 17:10:41

+2

聖牛 - 你真的寫這樣的無格式代碼嗎?如果您希望人們幫助您改進它,請格式化並發表評論。 – 2012-02-03 17:11:05

+0

對不起,它是通過手機發布的 – m3tsys 2012-02-03 17:14:53

回答

4

這兩個查詢可以通過使用JOIN合併爲一個。語法看起來是這樣的:

$sql = dbquery('SELECT v.`post_name`, v.`new_post_name`, v.`category` FROM `videos` AS v JOIN 'category_slug' AS cs ON cs.category=v.category WHERE v.`id` ="'. mysql_real_escape_string($video_id)); 

無關的速度問題,你也有一個巨大的安全漏洞,因爲你concat'ing字符串數據到一個SQL查詢。如果有人能夠通過video_id爲「DROP TABLE videos」來調用此函數,那麼您將失去整個表格。更糟糕的事情可能發生,這被稱爲SQL Injection,你需要了解它,因爲它是如何網站被黑客攻擊的最常見的方式。我使用了一種可以保護您免受黑客攻擊的功能,但這仍然不是解決此問題的最佳方法,因此它只被認爲是一種繃帶。

+1

提及SQL注入。 – 2012-02-03 17:20:43

+1

查詢之前使用mysql_real_escape_string可以節省我的sql注入? – m3tsys 2012-02-03 17:28:05

+0

@ m3tsys:是的。 (...愚蠢的15字符評論長度最低...) – 2012-02-03 18:40:24

3

好,明顯的優化將是你的兩個SQL查詢合併爲一個:

SELECT post_name, new_post_name, category, category_slug 
FROM videos 
    LEFT JOIN categories ON (category_id = category) 
WHERE id = ? 
LIMIT 1 

(我用的是左連接,以便查詢仍然會給結果即使有一個匹配的ID沒有類別—在這種情況下,category_slug將只是NULL)。

1

除了聯接媒體鏈接指出的那樣,你真的不應該使用mysql_fetch_array,因爲它消耗內存的兩倍(每一個崗位與數字鍵和聯想同時返回鍵)。

mysql_fetch_assoc 

mysql_fetch_array($sql, MYSQL_ASSOC) 

棒,因爲你只有在一個聯合的方式使用的結果。

+0

也是一個很好的提示,我知道一個,但它並沒有跨過我的腦海,當我回答。實際上許多PHP開發人員都沒有意識到這一點。 – TravisO 2012-02-03 17:34:44

相關問題