2012-09-26 39 views
1

我用http://www.yiiframework.com/doc/guide/1.1/en/database.daoPDO - 內聯SQL或存儲過程

數據訪問對象(DAO)使用PDO。

不確定這是最好的

方案一 - 內聯代碼

$alias_name =Utils::checkEnteredData($alias_name); 
    $connection = Yii::app()->db;  
    $sql_images = $connection->createCommand("SELECT ig.id, 
     ig.is_flickr,      
     ig.main_image, 
     ig.author_id, 
     ig.description, 
     ig.latitude, 
     ig.longitude, 
     ig.is_youtube, 
     ig.author_id,  
     ig.flickr_youtube_id, 
     ig.thumbnail_image_medium, 
     ig.thumbnail_image, 
     ig.alias_title, 
        ig.image_hits, 
        ig.title, 
        ig.created_on, 
     a.title, 
     a.alias_title as album_alias_title, 
     igo.realname, 
     igo.username, 
        igo.location from image_gallery ig 
        JOIN album a ON ig.album_id = a.id 
        LEFT JOIN image_gallery_owner igo ON ig.author_id = igo.id 
        WHERE ig.approved =:approved AND ig.visible=:visible AND ig.alias_title =:alias_title LIMIT 1"); 
    $sql_images->bindValues(array(':alias_title'=>$alias_name, ':approved'=>'Yes', ':visible'=>'1'));    
    $image = $sql_images->queryAll(); 

選項2存儲過程:

public function getImageFromAliasTitle($alias_title) 
     {  
      $alias_title =Utils::checkEnteredData($alias_title); 
      $connection = Yii::app()->db; 
      $command = $connection->createCommand("CALL getSingleImage(:alias_title)"); 
      $command->bindParam(":alias_title",$alias_title,PDO::PARAM_STR); 
      $image = $command->queryAll(); 
      return $image; 
     } 
+0

存儲過程。 – hjpotter92

+0

你爲什麼這麼想? –

回答

0

這要看,但我還是推薦使用存儲過程爲你的情況。主要的原因是(從previous answer兩者)​​:

  1. 存儲過程具有的無需授予用戶直接訪問表的好處。

  2. 由於每個非參數化查詢都是對SQL Server的一個新的不同查詢,它必須經歷確定每個查詢的執行計劃的所有步驟(從而浪費時間並浪費計劃緩存空間,因爲將執行計劃存儲到計劃緩存中並沒有真正幫助到最後,因爲該特定查詢可能不會再次執行)

  3. 非參數化查詢處於SQL注入攻擊的風險中,應該完全避免成本。

This也是一個有趣的閱讀。