2014-06-06 4 views
0

내가 PHP를 처음 그래서 다음에 어떤 도움이 정말 감사하겠습니다이다 : 나는 WHERE 조건 쿼리를 실행하려고하지만하고PHP '어디'쿼리 조건에 '만약'는 isset '

변수가 설정된 경우에만 라디오 버튼을 통해 where 조건을 적용하려고합니다.

기본적으로 변수를 설정하지 않으면 where 조건에 포함하지 말아야합니다. 합병증은 내가 가장 기본적인에서

... 3+ 변수와 함께이 일을 할 것입니다 - 지금까지이 여기에 코드입니다 :

if(isset($_POST['category'])){ 
$category = $_POST['category'];} 

if(isset($_POST['brand'])) { 
$brand = $_POST['brand']; 
} 

{ 
$q = 'SELECT name, category, brand, price, imageurl, purchaselink FROM clothes WHERE category = "'.$_POST['category'].'" AND brand = "'.$_POST['brand'].'"'; 

[절단]

감사합니다 매우 훨씬 앞서!

+0

where 절을 두 번째 문자열 변수로 빌드하십시오. – developerwjk

답변

1
당신은하지만 우선, 배열을 사용하여이 작업을 수행 할 수

SQL 삽입에 취약하기 때문에이 방법을 묻지 마십시오. 대신 PDO을 사용하십시오. (이 키와 값을 구분하지 않기 때문에)

$conds = [ 'brand', 'category', 'name' ]; 

$where = [ ]; // Empty array 

foreach ($conds as $cond) { 
    if (!empty($_POST[$cond])) { 

     $sql = "({$cond} = ?)"; // We use PDO and bound values. 

     $where[$sql] = $_POST[$cond]; 

     // In *deprecated* MySQL we would use at least 
     // $sql = "({$cond} = '" . mysql_real_escape_string($_POST[$cond]) . "')"; 
     // $where[$sql] = true; 
    } 
} 
// Now we have a list of pairs: 
//  brand = ?  => 'MyBrand', 
//  name = ?  => 'MyName', 

if (!empty($where)) { 
    $sql_string .= ' WHERE ('; 
    $sql_string .= implode(' AND ', array_keys($where)); 
    $sql_string .= ')'; 
} 

// $sql_string is now SELECT ... WHERE ((brand=?) AND (name=?) ...) 
// Using the MySQL version, we would have ... WHERE ((brand='MyBrand') AND ...)) 

// With PDO we PREPARE the query using sql_string 

// http://dev.mysql.com/doc/apis-php/en/apis-php-pdo-mysql.html 
// http://www.php.net/manual/en/intro.pdo.php 

// We need an open PDO connection saved into $pdo 

$stmt = $pdo->prepare ($sql_string); 

// Then we execute the query. 
// Bind the values to array_values($where). 
$stmt->execute(array_values($where)); 

while ($tuple = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    ... 
} 

더 짧은 방법, MySQL은 단지

$where = [ ]; // empty array() 
foreach ($conds as $cond) { 
    if (empty($_POST[$cond])) { 
     continue; 
    } 
    // THIS IS NOT SECURE. See e.g. http://johnroach.info/2011/02/17/why-mysql_real_escape_string-isnt-enough-to-stop-sql-injection-attacks/ 
    $escaped = mysql_real_escape_string($_POST[$cond]); 
    $where[] = "({$cond} = '{$escaped}')"; 
} 
$query = "SELECT ..."; 
if (!empty($where)) { 
    $query .= " WHERE (" . implode(' AND ', $where) . ")"; 
} 

이 방법이 될 것입니다 :

아이디어는 적절한 조건의 목록을 가지고있다 'AND'매개 변수를 지정할 수있는 추가 이점이 있습니다. 사용자는 라디오 버튼을 통해 AND 또는 OR 조건을 사용할 수 있습니다.

$and_or = ('OR' == $_POST['andor']) ? ' OR ' : ' AND '; 
    $query .= " WHERE (" . implode($and_or, $where) . ")"; 

'andor'의 실제 값은 사용되지 않습니다. OR 인 경우 모두 좋고 좋으면 'OR'이 사용됩니다. "--; DROP TABLE Students;"과 같이 실수로 POST에서 고객이 보낸 것일 경우 'AND'를 의미합니다.

+0

@Iserni 씨가 솔루션은 글로벌하고 훌륭하다고 생각합니다. (좋은 직장입니다.)하지만 여기서는 PHP에서 새로운 친구가 있다고 생각합니다. 그는 가장 강력한 보안이 아닌 간단한 코드와 20 줄의 코드를 사용합니다. greated 메소드를 사용하여 작업을 수행하려면 Propel이나 Doctrine과 같은 ORM을 사용하는 것이 좋습니다. :) – Mimouni

+0

감사합니다. Iserni - 확실히 PDO를 사용하고 싶지만 다음을 사용하여 실행하려고합니다. $ sql_string-> execute(); echo -> 내 HTML 코드. 분명히 실행 중에 뭔가 잘못된 일을하고 있습니다. - 변수가 이미 바인딩 된 것을 필요로하지 않는다는 것을 알았을 때 어떤 생각을했는지 모르겠습니다! – Gibs

+0

'$ sql_string'을 직접 실행할 수 없으므로 문으로 준비해야합니다. 나는 두 개의 링크를 추가했고,'$ pdo'를 사용하는 코드는 매뉴얼 (두 번째 링크)을 따라 만든다. – LSerni

0

모든 내부 (경우 incluide해야) {}

if(isset($_POST['category']) && isset($_POST['brand'])){ 
$q = 'SELECT name, category, brand, price, imageurl, purchaselink FROM clothes WHERE category = "'.$_POST['category'].'" AND brand = "'.$_POST['brand'].'"'; 

} 
0

내가 내 필터를 만들기 위해이 기술을 사용

$q = 'SELECT name, category, brand, price, imageurl, purchaselink FROM clothes WHERE 1=1 '; 


if(isset($_POST['category'])) $q .= ' AND category ="'.$_POST['category'].'"'; 

if(isset($_POST['brand'])) $q .= ' AND brand = "'.$_POST['brand'].'"'; 
// here you can add other filters. :) be happy 
+0

누군가가 따옴표가 포함 된 값을 보내는 경우 위험합니다 (악의적 인 입력은 제외). 적어도 PDO가 아니라면 탈출을 사용하십시오. – LSerni