1

私はhttp://www.yiiframework.com/doc/guide/1.1/en/database.daoを使用していました

データアクセスオブジェクト(DAO)はPDOを使用します。

どちらがベストかわからなかった

オプション1-インラインコード

    $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;  
        }  
4

1 に答える 1

0

状況によって異なりますが、ケースにストアドプロシージャを使用することをお勧めします。主な理由は(前の回答から取得):

  1. ストアドプロシージャには、ユーザーに直接テーブルアクセスを許可する必要がないという利点があります。

  2. パラメータ化されていない各クエリはSQLServerに対する新しい異なるクエリであるため、クエリごとに実行プランを決定するすべての手順を実行する必要があります(したがって、実行プランを保存するため、時間が無駄になり、プランのキャッシュスペースも無駄になります)。その特定のクエリはおそらく再度実行されないため、プランキャッシュに入れることは最終的には実際には役に立ちません)

  3. パラメータ化されていないクエリはSQLインジェクション攻撃のリスクがあるため、絶対に避けてください。

これも興味深い読み物です。

于 2012-09-26T18:22:21.863 に答える