2011-02-23 1 views
2

사용자가 여러 옵션 중에서 선택할 수있는 mysql 쿼리를 어떻게 작성 하시겠습니까? 폭스 예제 나는 사용자가 주택을 검색하는 데 사용할 수있는 양식이 있습니다. 이제는 집, 플랫 등 원하는 것을 선택할 수있는 선택 상자가 있습니다. 그런 다음 집이나 아파트가 들어가기를 원하는 도시를 선택할 수있는 두 번째 상자가 있습니다. 그리고 최대 가격을 가진 또 다른 상자가 있습니다.WHERE 절을 여러 개 사용하여 MySQL 쿼리를 어떻게 실행할 수 있습니까?

이제 mysql 쿼리를 어떻게 작성 하시겠습니까? 내 문제는 그런 식으로 할 것입니다 : if ($ _ POST [ "house_type"]! = 0) { $ select = mysql_query ("SELECT * FROM WHERE type = '". $ _ POST [ "house_type"] . " '"); } 하지만 이제는 누군가가 하우스 유형을 선택했지만 다른 옵션은 선택하지 않은 경우가 있습니다. 그렇다면 선택된 요소의 가능한 모든 조합에 대해 "if"를 수행해야합니까? 이제

if(!isset($_POST["house_type"])) { 

      if($_POST["something"] == 0) { 
     $search_select = @mysql_query("SELECT * FROM housedata WHERE something = $_POST["whatever"]); 

      } 
      elseif($_POST["something"] != 0) { 
     $search_select = @mysql_query("SELECT * FROM housedata something = $_POST["whatever"] AND somethingelse = 'whatever'); 
      } 
     } 



elseif(!isset($_POST["house_type"])) { 


     if($_POST["something"] == 0) { 
     $search_select = @mysql_query("SELECT * FROM housedata WHERE something = $_POST["whatever"]); 

      } 
      elseif($_POST["something"] != 0) { 
     $search_select = @mysql_query("SELECT * FROM housedata something = $_POST["whatever"] AND somethingelse = 'whatever'); 
      } 
     } 

내가 10 개 또는 20 개의 선택 상자, 입력 필드와 체크 박스처럼 한 상상 내가 무엇을이 상자와 fiels의과에 따라 MySQL의 쿼리를해야 할 것 :

내 문제를 강조하려면 확인란이 가득 찼습니다. 이것은 매우 복잡하고 느리고 끔찍한 코드입니다. 그래서 mysql 쿼리를 만들 가능성이 있습니다 :

SELECT * FROM whatever WHERE house_data = '".$whatever."' AND (if(isset($_POST["something"])) { whatever = '".$whatever2."' } AND ...; 

내가 무슨 뜻입니까? 설명하기가 조금 복잡하지만 실제로는 매우 중요한 질문이며 아마도 쉽게 대답 할 수 있습니다.

도움 주셔서 감사합니다. 이 같은 phpheini

+0

루프 스루 및 concat 모든 옵션을 설정 하시겠습니까? –

답변

4

WHERE 절 생성 SQL을 실행하기 전에.

짧은 예 : PHP 로직이 작업을 수행 기반으로 검색어를 생성하기 때문에

$whereClause = ""; 

if ($_POST['opt1']) { 
    $opt1 = mysql_real_escape_string($_POST['opt1']); 
    $whereClause .= "AND opt1='$opt1'"; 
} 

if ($_POST['opt2']) { 
    $opt2 = mysql_real_escape_string($_POST['opt2']); 
    $whereClause .= "AND opt2='$opt2'"; 
} 

mysql_query("SELECT * FROM table WHERE 1 ".$whereClause); 
+0

감사합니다. 쉬운! – phpheini

+0

SQL 인젝션을 방지하기 위해 $ _POST를 통해 오는 모든 것을 피하십시오. – lethalMango

+0

@lethalMango - $ 10 달러는 그가 말하지 않습니다;) – Jakub

1

당신이 올바른 방향으로 조금 가리 키도록 시도 뭔가 :

if(isset($_POST["something"])) 
{ 
    $where = " AND whatever = '".$whatever2."'"; 
} 
else $where = ''; 

mysql_query("SELECT * FROM whatever WHERE house_data = '".$whatever."'".$where);
+0

이 경우에는'$ where. = "AND whatever = ....를 추가하고 싶을 것입니다. – Jakub

+0

감사합니다. 나는 이것에 대해 이미 생각해 봤지만, mysql 함수 나 다른 것이 있다고 생각했습니다. – phpheini

0

쓰는 몇 가지 간단한 쿼리 빌더

$where = array(); 
if($_POST["something"]) { 


$where[] = sprintf(" something='%s'",$_POST["something"]); 

// sprintf와 - SQL 주입 을 방지}

if($_POST["something2"]) { 


$where[] = sprintf(" something2='%s'",$_POST["something2"]); 
} 
//build where string 
$where_str = " WHERE ".implode(" AND ",$where); 
//build sql 
$sql = "SELECT * ... $where_str"; 
+0

감사합니다. 이 경우 sprintf는 정확히 무엇을하고 있습니까? – phpheini

+0

$ _POST 변수를 문자열로 캐스팅하고 SQL 주입을 방지하는 특수 문자를 이스케이프 처리합니다. 그림보기 http://imgs.xkcd.com/comics/exploits_of_a_mom.png – Michal

0
별도로 검색 문자열을 구축 할 필요가

하지만 형식은 단순히

SELECT * FROM your_table WHERE number = {$number} AND sentence = '{$sentence}'; 

입니다 :

$search = "SELECT * FROM your_table WHERE "; 
if(isset($whatever)) $search .= "something = '{$whatever}'"; 
if(isset($whateverelse)) $search .= " AND somethingelse = '{$whateverelse}'"; 
$search_select = mysql_query($search); 
+0

고마워요! 변수를 대괄호 ({및})에 넣은 이유는 무엇입니까? '$. number'를 사용하는 것보다 낫습니다. ''? – phpheini

+0

'$ whatever'이 설정되지 않았지만'$ whateverelse'는'* SELECT * FROM your_table WHERE AND something = '{$ whateverelse}' "'로 끝납니다. – lethalMango

+0

내 질문에 대한 대답이 뭐야? – phpheini

1
$where = array(); 
if($_POST["something"]) { 
    $where[] = " something =".$_POST["something"]; 
} 
if($_POST["something2"]) { 
    $where[] = " something2=".$_POST["something2"]; 
} 
. 
. 
. 
//build where string 
$where_ = !(empty($where) ? " WHERE ".implode(" AND ",$where) : ""; 
//build sql 
$sql = "SELECT * ... ".$where; 
관련 문제