2013-05-24 7 views
1

SQL 주입을 피하는 좋은 방법을 따를 것입니다. 대신에매개 변수를 CDbCommand에 바인드 할 수 없습니다.

 $query="SELECT id,tag FROM tbl_tags WHERE tag LIKE '%".$tag."%' ORDER BY creation_time DESC LIMIT 0,10 "; 

내가 바인딩 매개 변수를 사용해야합니다 : : 그래서 이것은 좋지 않다

 $query="SELECT id,tag FROM tbl_tags WHERE tag LIKE :tag ORDER BY creation_time DESC LIMIT 0,10 "; 
    $command =Yii::app()->db->createCommand($query); 
$command->bindParam(":tag", "%{$tag}%", PDO::PARAM_STR); 
    $models = $command->queryAll(); 

을하지만이 생성 치명적인 오류 : 내가 결합 할 수있는 방법을 참조

에 의해 매개 변수 (2)를 통과 할 수 없습니다 이 LIKE 지향 매개 변수?

답변

0

이 기능에 대한 매뉴얼 페이지를 읽거나 오류 메시지를 찾아서.

둘 다 대신 bindValue()를 사용해야한다고 알려줍니다.

+0

yii는 문서화가 잘되어 있지 않습니다. 나는 아직도 bindParam()과 bindValue() 사이의 차이를 모른다. 그러나 매개 변수를 약간 변경하면 문제가 해결됩니다. $ tag = '% $ tag %'; 그럼 bindParam() 사용할 수 있습니다. – Panmu

+0

PHP 매뉴얼에 완벽하게 문서화되어있는 yii는 PDO가 아닙니다. –

2

쿼리 작성기를 사용해보십시오. 따라서 검색어는 다음과 같이 표시됩니다.

Yii::app()->db->createCommand() 
    ->select('id, tag') 
    ->from('tbl_tags') 
    ->where('tag like :tag', array(':tag' => "%{$tag}%")) 
    ->order('creation_time desc') 
    ->limit('0, 10') 
    ->queryAll() 

좋은 습관을 찾고 있다면 더 좋습니다.

피씨 : 대답, 오용 변명.

관련 문제