2013-11-15 3 views
1

IF 조건을 기반으로 PHP 변수 ($ sql)에 다른 SQL 결과를 저장하는 PHP IF 문이 있지만 SQL 문에 대한 결과와 관계없이 하나의 조건 (첫 번째 조건)을 기반으로 SQL 결과를 반환합니다. 사용자가 POST'd 값을 입력합니다.이 PHP IF 문은 무엇이 잘못 되었습니까?

PHP 문을 사용하지 않고 모든 SQL 문이 phpMyAdmin에 개별적으로 입력 될 때 (예상되는 $ row3 및 $ row4를 실제 값으로 변경하는 경우) 예상대로 작동합니다.

내가 여기서 잘못하고있는 것을 누군가 볼 수 있습니까? 가능하다면 다르게 할 필요가있는 조언을 할 수 있습니까? 나는 어떤 PHP/MySQL의 전문가는 아니지만 알고,하지만 난 난처한 상황에 빠진거야 :(

어떤 도움이나 제안이 크게 감사합니다. 사전에 감사.

$row3 = $_POST['groups']; 
$row4 = $_POST['othercode-all']; 

IF ($row3='-all-' && ($row4='-all-')) 
{ 
$sql ="SELECT 
    email, 
    accountgroup, othercode 
FROM 
    (SELECT 
     email AS email, 
     accountgroup, othercode 
    FROM 
     accounts 
    UNION ALL 
    SELECT 
     email2 AS email, 
     accountgroup, othercode 
    FROM 
     accounts 
    UNION ALL 
    SELECT 
     email3 AS email, 
     accountgroup, othercode 
    FROM 
     accounts) account 
WHERE 
    email LIKE '%@%'"; 
} 


ELSEif ($row3!='-all-' && ($row4='-all-')) 
{ 
$sql ="SELECT 
    email, 
    accountgroup, othercode 
FROM 
    (SELECT 
     email AS email, 
     accountgroup, othercode 
    FROM 
     accounts 
    UNION ALL 
    SELECT 
     email2 AS email, 
     accountgroup, othercode 
    FROM 
     accounts 
    UNION ALL 
    SELECT 
     email3 AS email, 
     accountgroup, othercode 
    FROM 
     accounts) account 
WHERE 
    email LIKE '%@%' 
    AND accountgroup = '$row3'"; 
} 


ELSEIF ($row4 != '-all-' && ($row3 = '-all-')) 
{ 
$sql ="SELECT 
    email, 
    accountgroup, othercode 
FROM 
    (SELECT 
     email AS email, 
     accountgroup, othercode 
    FROM 
     accounts 
    UNION ALL 
    SELECT 
     email2 AS email, 
     accountgroup, othercode 
    FROM 
     accounts 
    UNION ALL 
    SELECT 
     email3 AS email, 
     accountgroup, othercode 
    FROM 
     accounts) account 
WHERE 
    email LIKE '%@%' 
    AND othercode = '$row4'"; 
} 

ELSE 
{ 
$sql ="SELECT 
    email, 
    accountgroup, othercode 
FROM 
    (SELECT 
     email AS email, 
     accountgroup, othercode 
    FROM 
     accounts 
    UNION ALL 
    SELECT 
     email2 AS email, 
     accountgroup, othercode 
    FROM 
     accounts 
    UNION ALL 
    SELECT 
     email3 AS email, 
     accountgroup, othercode 
    FROM 
     accounts) account 
WHERE 
    email LIKE '%@%' 
    AND accountgroup = '$row3' AND othercode = '$row4'"; 
} 

답변

10

그것을 시도

if ($row3 == '-all-' && $row4 == '-all-') { 
    // Do the stuff 
} elseif ($row3 != '-all-' && $row4 == '-all-') { 
    // Do another 
} 

할당하고 있는지 확인하고 있지 않습니다.

1) = 오른쪽에 값을 할당합니다. 귀하의 경우에는 문자열을 할당 할 때 항상 true이됩니다.

2) 그러나 ==은 왼쪽 및 오른쪽 값/변수 만 검사합니다.

3) 그리고 ===는 하나 INT, 부동 소수점 또는 string..etc

를 들어, 두 사람의 데이터 유형을 확인합니다 그리고 그 각각의 상태에있는 모든 쿼리가 동일하지만,에 조금 변화하고 볼 수 있습니다 where 조건. 그렇기 때문에 자주있는 쿼리를 취해 거기에 조건을 붙인다. 읽기 쉽고 신뢰할 수있다.

+0

같은 이야기가 ELSEIF에 전달됩니다. – briosheje

+1

당신의 천재! 글쎄, 내게 비하면 너는 웃어. 정말 고맙습니다! 지금 당장은이 기능을 사용하게 된 것을 기쁘게 생각합니다. 그러나 마지막 단락을 시도해 보겠습니다. – user2968514

0

당신은 또한 시도 할 수 있습니다 : 코드는 간단

$row3 = ($_POST['groups']=='-all-') ? '%' : $_POST['groups']; 
$row4 = ($_POST['othercode-all']=='-all-') ? '%' : $_POST['othercode-all']; 

$sql ="SELECT 
    email, 
    accountgroup, othercode 
FROM 
    (SELECT 
     email AS email, 
     accountgroup, othercode 
    FROM 
     accounts 
    UNION ALL 
    SELECT 
     email2 AS email, 
     accountgroup, othercode 
    FROM 
     accounts 
    UNION ALL 
    SELECT 
     email3 AS email, 
     accountgroup, othercode 
    FROM 
     accounts) account 
WHERE 
    email LIKE '%@%' 
    AND accountgroup = '$row3' AND othercode = '$row4'"; 

이 방법입니다. 항상 where 절을 사용하지만 값이 -all- 인 경우 아무거나 검색하면됩니다.

+0

감사합니다. 나는 그것을 시도했지만 그것은 나를 위해 작동하지 않았다. 두 옵션 모두에 대해 -all-를 게시하면 몇 행만 반환됩니다. 반환하는 행은 계정 그룹이나 기타 코드가 할당되지 않은 계정입니다. – user2968514

1

등호 하나를 사용 했으므로 작성한 첫 번째 명령문은 항상 true를 반환합니다. & & 연산자 뒤에 내부 브래킷이 필요 없습니다.

IF ($row3='-all-' && ($row4='-all-')) {} 

은 다음과 같아야합니다

if ($row3 == '-all-' && $row4 == '-all-') {} 

내가

if ($var = 'test') {} 

$ var에 값이 성공적으로 설정하고 반환 그것은 항상 true로 평가됩니다 쓸 수 있다면. 이것이 어디에서 사실로 돌아 가지 않을지 생각할 수있는 유일한 상황은 변수를 값으로 전달하는 경우이며 존재하지 않거나 false로 평가 된 경우입니다.

비교 연산자 '=='를 사용하면 값을 설정할 수 있는지 테스트하지 않고 특정 값을 확인할 수 있습니다.

당신은 또한 같은 값 것이 또한 다른 곳에서 선언하는 의미가 있습니다 때마다 테스트로 : === 연산자는 유형을 확인하고,이 경우에 도움이되지 않을 것

$str = '-all-'; 
if ($row3 == $str && $row4 == $str) { //logic } 

합니다. 당신은 진정한 부울에 대한 유효성을 검사 경우는 TRUE 부울 아니더라도, 비 거짓/널 (null)/빈 값이 TRUE로 평가되는 다음 유용 볼 수있는 VAR을 비교하는 경우 :

$t1 = 'FALSE'; 
$t2 = FALSE; 

if ($t1 === FALSE) 
//evaluates as false as t2 is a string not a boolean 
if ($t2 === FALSE) 
//evaluates as true 

마지막으로 조건을 그룹화하지 않아도 대괄호가 필요하지 않습니다.

희망이 있습니다.

+0

사용자가 실제로 $ _POST 필드에 정보를 게시했는지 확인하는 것도 가치가 있습니다. 현재 상태에서 필드 중 하나를 비워두면 전체 스크립트가 실행되지 않기 때문입니다. ! is_empty ($ row3)를 사용하여 mysql 쿼리에 빈 값을 보내지 않도록 할 수 있습니다. –

+0

피드백을 보내 주셔서 감사합니다. POST가 HTML 선택에서 온 것인데, 그래서 항상 무언가가 게시 될 것입니다. 잘못된 선택은 잘못된 옵션을 선택할 수 있다는 것입니다. – user2968514

관련 문제