2011-08-24 6 views
1

MySQL 데이터베이스의 결과를 필터링하도록 설정된 콤보 상자가 3 개 있습니다. 로드 할 때 모든 결과가 올바른 순서로 표시되지만 3 개의 콤보 상자 중 하나를 선택하거나 3 개의 콤보 상자 중 2 개를 선택하면 결과 (행)가 표시되지 않습니다. 3 개의 콤보 상자를 모두 선택하면 결과가 표시됩니다.Ajax & PHP : MySQL 쿼리가 모든 행을 가져 오지 않습니다.

누군가 내 쿼리 코드에 어떤 문제가 있는지 파악할 수 있기를 바랍니다. 나는 모든 것을 시도해 본 결과 아무 것도 찾을 수없는 것 같습니다. 나는 내가 최선의 방법으로 그렇게하고 있는지 궁금해. 나는 PHP에 상당히 익숙하기 때문에 사용할 수있는 모든 다른 방법을 모른다.

PHP의 :

//Define Refine Data Values 
$imgFamily = $_GET['imgFamily']; 
$imgClass = $_GET['imgClass']; 
$imgGender = $_GET['imgGender']; 



//Define Refine Values as True of False 
$imgFamilyTrue = (($imgFamily != 1) || ($imgFamily != null)); 
$imgFamilyFalse = (($imgFamily == 1) || ($imgFamily == null)); 

$imgClassTrue = (($imgClass != 1) || ($imgClass != null)); 
$imgClassFalse = (($imgClass == 1) || ($imgClass == null)); 

$imgGenderTrue = (($imgGender != 1) || ($imgGender != null)); 
$imgGenderFalse = (($imgGender == 1) || ($imgGender == null)); 



include"db.php"; 

//Database queries based on refine selections 
if($imgFamilyFalse && $imgClassFalse && $imgGenderFalse) { 
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` ". 
    "ORDER BY `imgDate` DESC"; 

} else if($imgFamilyTrue && $imgClassTrue && $imgGenderTrue) { 
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgFamily='$imgFamily' AND imgClass='$imgClass' AND imgGender='$imgGender' ". 
    "ORDER BY `imgDate` DESC"; 

} else if($imgFamilyTrue && $imgClassFalse && $imgGenderFalse) { 
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgFamily='$imgFamily' ". 
    "ORDER BY `imgDate` DESC"; 

} else if($imgFamilyFalse && $imgClassTrue && $imgGenderFalse) { 
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgClass='$imgClass' ". 
    "ORDER BY `imgDate` DESC"; 

} else if($imgFamilyFalse && $imgClassFalse && $imgGenderTrue) { 
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgGender='$imgGender' ". 
    "ORDER BY `imgDate` DESC"; 

} else if($imgFamilyFalse && $imgClassTrue && $imgGenderTrue) { 
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgClass='$imgClass' AND imgGender='$imgGender' ". 
    "ORDER BY `imgDate` DESC"; 

} else if($imgFamilyTrue && $imgClassFalse && $imgGenderTrue) { 
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgFamily='$imgFamily' AND imgGender='$imgGender' ". 
    "ORDER BY `imgDate` DESC"; 

} else if($imgFamilyTrue && $imgClassTrue && $imgGenderFalse) { 
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgFamily='$imgFamily' AND imgClass='$imgClass' ". 
    "ORDER BY `imgDate` DESC"; 
} 

나는 오류가 자바 스크립트 측에서 호출되지되고, 나는 두 개의 콤보 상자를했을 때 모든 것이 작동되었을 때 문제가 PHP와 함께 꽤 확신, 문제가 끝날 경우를 대비하여 jQuery Ajax 쿼리를 게시 할 것이다.

아약스 : 당신은 ABC 다음 결과를 가져 오는 경우

말을하는 AND 연산자를 사용하고 있기 때문에

function loadData(imgFamily, imgClass, imgGender){ 
    $.ajax 
    ({ 
     type: "GET", 
     url: "filter_test.php", 
     data: {imgFamily:imgFamily, imgClass:imgClass, imgGender:imgGender}, 
     success: function(msg) { 
      $("#gallery_container").html(msg); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
     }, 
     complete: function() { 
     } 
    }); 
} 
+0

위의 조건 '엉망'나를 믿어 @Jakub – Jakub

+0

... 악몽을 준, 나뿐만 아니라 악몽했다. 그러나 아래의 개인들의 도움 덕분에, 나는이 같은 악몽을 결코 다시 일으키지 않을 것입니다! 나 자신을 위해 PHP를 알아 내려고 시도한 결과였습니다. – stefmikhail

답변

0

나는 위의 답변에서 "올바른"응답을 선택할 수 없습니다 작업 코드.

제임스의 대답만으로 원래 코드가 수정되었을 수도 있지만 마크 B는 코드를 정리하고 더 효율적으로 만드는 데 큰 도움이되었습니다. 양쪽에 소품.

제안 사항 외에도 $where_clauses[] = "1=1"은 Ajax에서 사용할 수있는 데이터가없는 if 상태로 포장해야했습니다.

또한 mysql_real_escape_string($_GET[]을 작은 따옴표로 묶어야 MySQL 쿼리에서 사용할 수 있습니다.

내 최종 PHP :

//Define Refine Data Values 
$imgFamily = $_GET['imgFamily']; 
$imgClass = $_GET['imgClass']; 
$imgGender = $_GET['imgGender']; 



//Define Refine Values as True of False 
$imgFamilyTrue = $imgFamily != 1 && $imgFamily != null; 
$imgFamilyFalse = !$imgFamilyTrue; 

$imgClassTrue = $imgClass != 1 && $imgClass != null; 
$imgClassFalse = !$imgClassTrue; 

$imgGenderTrue = $imgGender != 1 && $imgGender != null; 
$imgGenderFalse = !$imgGenderTrue; 



//where clauses 
$where_clauses = array(); 

if ($imgFamilyFalse && $imgClassFalse && $imgGenderFalse) { 
    $where_clauses[] = "1=1"; // default do-nothing clause 
} 

if ($imgFamilyTrue) { 
    $where_clauses[] = 'imgFamily=' . "'" . mysql_real_escape_string($_GET['imgFamily']) . "'"; 
} 
if ($imgClassTrue) { 
    $where_clauses[] = 'imgClass=' . "'" . mysql_real_escape_string($_GET['imgClass']) . "'"; 
} 
if ($imgGenderTrue) { 
    $where_clauses[] = 'imgGender=' . "'" . mysql_real_escape_string($_GET['imgGender']) . "'"; 
} 



include"db.php"; 


$clause = implode(' AND ', $where_clauses); 


$query_pag_data = "SELECT imgURL, imgTitle FROM images WHERE $clause ORDER BY imgDate DESC"; 


$result_pag_data = mysql_query($query_pag_data) or die('MySql Error' . mysql_error()); 


$num_rows = mysql_num_rows($result_pag_data); 


if(!$result_pag_data) { 
    echo "Cannot retrieve information from database."; 
} else if($num_rows == 0) { 
    echo "<div id='no_result'>Sorry, there are no items matching your request.</div>"; 
} else { 
    echo "<ul class='new_arrivals_gallery'>"; 
    while($row = mysql_fetch_assoc($result_pag_data)) { 
     echo "<li><a target='_blank' href='new_arrivals_img/".$row['imgURL']."' class='gallery' title='".$row['imgTitle']."'><img src='new_arrivals_img/thumbnails/".$row['imgURL']."'></a></li>"; 
     } 
    echo "</ul>"; 
} 
0

이유는 결과를 얻을 해달라고 이유는 3 콤보 상자 값 중 3 개 또는 1 개를 선택하면 조건이 실패하고 아무런 결과도 얻지 못합니다.

EXA MPLE

if(A && B && C) 
    // do something 

당신이 두 값 BC을 선택 때문에 조건이 거짓

+0

'if else'조건을 말하는 것 같네요? 나는 당신이 말하는 것을 얻는다. 그러나 거짓 인 변수, 즉'$ imgFamilyFalse'는 위에 정의되어 있지 않으면'== 1' 또는'||''== null'으로 정의된다. 고객 입장에서. 그런 다음 당신이 제안하고있는 문제를 해결하지 않겠습니까? – stefmikhail

2

어떤 끔찍한 혼란을 반환합니다.

$where_clauses = array(); 

$where_clauses[] = "1=1"; // default do-nothing clause 

if ($_GET['imgFamily']) { 
    $where_clauses[] = "imgFamily='$imgFamily'"; 
} 
if ($_GET['imgClass']) { 
    $where_clauses[] = "imgClass='$imgClass'"; 
} 
if ($_GET['imgGender']) { 
    $where_clauses[] = "imgFamily='$imgFamily'"; 
} 

$clause = implode(' AND ', $where_clauses); 
$sql = "SELECT imgURL, imgTitle FROM images WHERE $clause ORDER BY imgDate DESC"; 
+0

이것이 스택 오버 플로우를 좋아하는 이유입니다. 나는 사용하고있는 방법이 지저분하다는 것을 알았지 만, 내가 사용할 수있는 다른 방법이 무엇인지 전혀 몰랐다. 나는 지금 당장 달려야한다. 그러나 이것을 조금씩 시험해보고 알릴 것이다. Marc 대단히 감사합니다! – stefmikhail

+0

당신은 확실히 약간의 위생 처리를 추가하고 싶을 것이다. 쿼리 문자열에 원시 사용자가 제공 한 데이터를 사용하는 것은 결코 좋은 생각입니다. 나는 쿼리를 SQL 주입 공격에 대해 열어 놓았습니다. –

+0

위생 관련 링크를 참조하십시오 http://stackoverflow.com/questions/1314518/sanitizing-users-data-in-get-by-php/1315779#1315779 – Rafay

1

실제 상태에서 "값이 1이 아니거나 값이 null이 아닌 경우"라고 말합니다. 그러나 값이 1과 같으면 null이 아니므로 사실이됩니다. 값이 null 인 경우는 1과 같지 않기 때문에 사실이됩니다.

문제 :

$imgFamilyTrue = (($imgFamily != 1) || ($imgFamily != null)); 
$imgFamilyFalse = (($imgFamily == 1) || ($imgFamily == null)); 

수정 : 모두 마크 B의 & 제임스의 대답은 창조에 쓸모 있었다으로

$imgFamilyTrue = $imgFamily != 1 && $imgFamily != null; 
$imgFamilyFalse = !$imgFamilyTrue; 
+0

흥미 롭습니다. 나는 언제나'||'가 하나 또는 다른 경우라고 이해했다. 하지만 당신이하는 말을 봅니다. '&&'두 조건을 모두 만족시켜야할까요? 이 경우 결과를 선택하지 않으면 값은 '1'또는 'null'입니다. 그것은 결코 둘 다되지 않습니다. 그러나 내가 오해하면 정정 해주세요. – stefmikhail

+0

맞지만 네거티브를 사용하고 있습니다. imgFamily == null imgFamily! = 1, imgFamily == 1은 imgFamily! = null을 만족합니다. imgFamily의 모든 값에 대해 조인 또는 조건이 true를 반환합니다. – James

관련 문제