2011-01-14 8 views
0

카테고리 시스템 CMS를 만들고 싶습니다. 큰 문제를 제외하고는 모든 것이 잘됩니다. = SMT & anotherInput = 키PHP 패턴 - 어떻게이 코드를 작성할 수 있습니까?

에서

site.com/some-category & sortby = 뷰 & : 내가 처리하고 MySQL의 쿼리를 생성 할 수있는 방법

같은 일부 입력에 의해 따라

예를 들어이 입력에 대해 내 검색어는

SELECT * FROM `articles` WHERE from='smt' AND afield='key' ORDER BY VIEWS 

B와 같아야합니다. 이러한 입력은 다를 것입니다. 이 코드를 어떻게 작성할 수 있습니까? 디자인 패턴에 대해 많은 것을 알지 못하지만 Factory 패턴에 대해 들었습니다. 이것이 내 솔루션의 일부입니까?

보다

+0

이것은 기본 PHP 폼 처리입니다. –

답변

1

팩토리 패턴은 예를 들어 전체 코드를 다시 작성할 필요없이 다양한 데이터베이스를 연결/쿼리 할 수 ​​있습니다. 이것은 쿼리 자체에 대해서는 아무런 관련이 없습니다.

당신은 PDO 확장을 볼 수 있습니다. 나는 보통 준비된 문과 함께 사용합니다. 그것은 당신이 이런 식으로 쿼리를 작성하게됩니다 :

$prepare = $db->prepare(' 
    SELECT 
     * 
    FROM 
     articles 
    WHERE 
     from=:from AND afield=:afield 
    ORDER BY 
     views 
'); 

$prepare->bindValue(':from', $_GET['from'], PDO::PARAM_STR); 
$prepare->bindValue(':afield', $_GET['afield'], PDO::PARAM_STR); 

$prepare->execute(); 

return $prepare; 

그것에 대해 좋은 점은 당신이 PDO는 당신을 위해 그것을 만들면서 SQL 주입에서이를 보호 할 필요가 없다는 것입니다. 또한 쿼리가 캐시되어 여러 매개 변수로 여러 번 실행할 수 있습니다.

$query = "SELECT * FROM `articles` WHERE 1 = 1"; 

$where = '' 

if (isset($_GET['from'])) { 
    $where .= " AND `from` = '" . mysql_real_escape_string($_GET['from']) . "'" 
} 

if (isset($_GET['anotherInput'])) { 
    $where .= " AND `from` = '" . mysql_real_escape_string($_GET['anotherInput']) . "'" 
} 

if (isset($_GET['sortby'] == 'views') { 
    $orderby = " ORDER BY `views` DESC" 
} else { 
    $orderby = " ORDER BY `id` DESC" 
} 

$query = $query . $where . $orderby; 

$result = mysql_query($query); 

이 직선 PHP/MySQL의 방법의 일종이지만, 사실은 당신이 파벨 두비 닌의에로 준비된 문을 사용하는 것이 좋습니다 않습니다

+0

+1입니다. 확실히 mysql_ *에 추천된다. – mfonda

-1

이것은 패턴과 관련이 없습니다. $_GET 수퍼 글로벌 변수를 사용하면 쿼리 문자열을 동적으로 생성 할 수 있습니다.

$query = "SELECT * FROM articles WHERE from='". 
     $_GET['from']. 
     "' AND afield='". 
     $_GET['anotherInput']. 
     "' ORDER BY ". 
     $_GET['sortby']; 

면책 조항 :이 SQL 주입하는 경향이있다. 같은 프로덕션 환경에서 탈출 입력 및 준비된 문, 전 PDO를 사용하여 직접 조회에서 원시 GET의 PARAMS를 사용하는

$query = "SELECT * FROM articles WHERE from='?' AND afield='?' ORDER BY ?"; 
$clean_from = htmlentities($_POST['from'], ENT_QUOTES, 'UTF-8'); 
$clean_anotherInput = htmlentities($_POST['anotherInput'], ENT_QUOTES, 'UTF-8'); 
$clean_sortby = htmlentities($_POST['sortby'], ENT_QUOTES, 'UTF-8'); 
$clean_inputs = array($clean_from, $clean_anotherInput, $clean_sortby); 

$sth = $dbh->prepare($query); 
$sth->execute($clean_inputs); 
+0

$ _GET 사용에 대해 알고 있지만 여기에는 문제가 없습니다. 그러나 이러한 입력에 따라 쿼리를 생성 할 수있는 방법을 모르겠습니다. 예를 들어, sortby = views 인 경우보기로 기사를 주문해야합니다. 그렇지 않으면 ID로 주문해야하며 예제가 계속 될 수 있습니다. –

+0

비록이 코드는 SQL 인젝션에 취약합니다. $ _GET에서 읽은 내용은 안전하지 않은 것으로 간주되며이 경우 작은 따옴표로 전달하면이 쿼리가 중단됩니다. – Matt

+0

http://en.wikipedia.org/wiki/SQL_injection을 숙지하십시오. – joksnet

0

아주 나쁜 관행, 당신은 FROM

SELECT * 같은 구조를해서는 안 즉, ($ _GET [ 'from'] = 'smt') $ from = 'smt'

과 같은 것입니다.

SELECT * 기사 WHERE from = '$ from'AND afield = 'key'주문 별보기

등등

P.S. 키워드는 'sql injection'입니다.

0

조각은 당신이 필요에 따라 같이 쿼리 문자열을 구축 할 수 있습니다 대답.

관련 문제