PDO - 内联SQL或存储过程

时间:2012-09-26 17:33:59

标签: mysql

我正在使用http://www.yiiframework.com/doc/guide/1.1/en/database.dao

数据访问对象(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;  
        }  

1 个答案:

答案 0 :(得分:0)

这取决于,但我仍然建议您使用存储过程。主要原因是(取自previous answer):

  1. 存储过程具有无需授予用户直接表访问权限的好处。

  2. 由于每个非参数化查询都是对SQL Server的新的不同查询,因此必须针对每个查询执行确定执行计划的所有步骤(从而浪费时间 - 并且还浪费计划缓存空间) ,因为将执行计划存储到计划缓存中最终并没有真​​正帮助,因为该特定查询可能不会再次执行)

  3. 非参数化查询存在SQL注入攻击的风险,应该不惜一切代价避免。

  4. This也是一本有趣的读物。