2012-09-26 38 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也是一个有趣的阅读。