2009-03-27 2 views

답변

0

보기/사용자/index.ctp 일이 기다리고 SQL 인젝션에 대한

<fieldset> 
    <legend>Filter users</legend> 
    <?php 
     echo $form->create('User', array('action' => 'index')); 
     echo $form->input('surname', array('div' => false)); 
     echo $form->submit('Filter', array('div' => false)); 
     echo $form->end(); 
    ?> 
</fieldset> 

컨트롤러/users_controller.php

public function index($surname = null) { 
    // post-redirect-get 
    if ($this->data['User']['surname']) { 
     $this->redirect(array('id' => $this->data['User']['surname'])); 
    } 
    // conditions 
    $conditions = null; 
    if ($surname) { 
     $conditions = array('surname LIKE' => '%' . $surname . '%'); 
    } 
    // find 
    $users = $this->Users->find('all', array('conditions' => $conditions)); 
    // set 
    $this->set(compact('users')); 
} 
0

CakePHP가 제공하는 findby 메소드를 살펴 봐야합니다. 표준 findall은뿐만 아니라() 당신은 당신이에 의해 검색 할 테이블의 열을 지정할 수있는 "마법"findby 방법의 숫자가에

:

$this->User->findBySurname($surname); 

을 당신은 또한이 findBySql (문) 사용자 정의 SQL 문을 사용할 수 있습니다. 당신이 다음 사용자에게 표시 할 수 있습니다 일치하는 사용자의 목록을 반환합니다

$users = $this->User->findBySql("SELECT * FROM USERS u WHERE u.SURNAME LIKE '%" . $surname . "%' ORDERBY SURNAME"); 

을 다음과 같이 당신은 LIKE 문을 실행하려면이 옵션을 사용할 수 있습니다. 가장 효율적인 쿼리는 아니지만 작동합니다.

+1

-1. 문제를 해결하면 반대 투표를합니다. –

+0

나는 당신이 요점을 놓쳤다 고 생각한다, 나는 당신이 위의 것과 같은 진술을 사용할 수 있다고 말했다 - 이것이 주어진 해결책이 아니라. 위의 코드는 findBySql을 사용하는 올바른 방향의 한 포인트입니다 ... – Jon

+1

포인트가 더 넓어서 검색 엔진에서 오는 누군가가 코드를 응용 프로그램에 복사 할 가능성이 큽니다. –

관련 문제