이 루프가 '및'대신 &&를 사용할 때 1이 반환되는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2215794

  •  19-09-2019
  •  | 
  •  

문제

나에게 이것을 수수께끼 ... while($row = mysql_fetch_assoc($result) and $runningOK) PHP 인 경우 루프 && 연산자는 대신 사용됩니다 and 그 다음에 mysql_fetch_assoc 끔찍하게 실패하고 숫자 만 반환합니다 1 실행할 때.

난 노력 했어 mysql_fetch_array() 그리고 제자리에 있고 나는 여전히 가지고 있습니다 1 문제. 언제, 그리고 내가 교체 할 때만 && 와 함께 and 전류처럼 while 올바른 행이 반환된다는 진술.

나는 이것을 보장하기 위해, 내부, 그리고 후에 디버그 진술을 배치했다. 나는 이것이 PHP 기발한 것인지 또는 내가 설명 할 수없는 것인지 알고 싶습니다.

// Query
$selectQuery = "SELECT * FROM jobs_cache LIMIT 20";
// Run the Selection Query.
$result = mysql_query($selectQuery)
    or die('Query Failed: '.mysql_error());

// Loop through results.
$runningOK = TRUE;
$resubmitList = array();

while($row = mysql_fetch_assoc($result) and $runningOK)
{
    // Resubmit The Job
    try
    {
        $client->addTaskBackground($row['function_name'],$row['job_data']);
        $resubmitList[] = (string)$row['job_cache_id'];
    }
    catch(Exception $e)
    {
        echo "Error adding task for job id: " . $row['job_cache_id'];
        $runningOK = FALSE;
    }
}
도움이 되었습니까?

해결책

운영자 우선 순위 때문입니다. 보다 매뉴얼 자세한 내용은 ... 관련 부분은 다음과 같습니다.

// "&&"는 "및"보다 더 큰 우선 순위를 가지고 있습니다.

// 표현식 (true && false)의 결과가 $ g에 할당됩니다.
// : ($ g = (true && false))처럼 행동합니다.

$ g = true && false;

// Constant True가 $ h에 할당되고 False가 무시됩니다.
// : (($ h = true) 및 false)처럼 행동합니다.

$ h = 참과 거짓;

var_dump ($ g, $ h);

bool (거짓)
bool (True)

따라서 &&를 사용하면 표현식의 결과가 True에 할당되어 1로 평가됩니다. MySQL 기능의 결과를 평가합니다.

그건 그렇고, 당신은 또한 사용할 수 있습니다 break $ runningok 변수의 필요성을 제거합니다. 그렇게하려면 제거하십시오 and $runningOK ~로부터 while 조건과 변화 $runningOK = FALSE; 에게 break; 캐치 블록이 트리거되면 루프가 끝납니다.

다른 팁

이 시도:

while(($row = mysql_fetch_assoc($result)) and $runningOK)

평가하기 때문에 혼합이있을 수 있습니다. mysql_fetch_assoc($result) and $runningOK True에게는 할당됩니다 $row, 이 경우와 동일합니다 1

괄호를 추가하면 어느 쪽이든 사용할 수 있습니다. && 또는 and, 두 가지 평가를 제대로 분리했을 것입니다.

이것이 대체 구문의 부작용입니다.

과제 연산자 = 그리고 두 논리 연산자 && 그리고 AND 가지다 다른 우선 순위: && 전에 실행되었습니다 =, 이전에 실행됩니다 AND

그래서 기본적으로 진술 :

$row = mysql_fetch_assoc($result) AND $runningOK

와 동등하다:

($row = mysql_fetch_assoc($result)) AND $runningOK

성명서 :

$row = mysql_fetch_assoc($result) && $runningOK

와 동등하다:

$row = (mysql_fetch_assoc($result) && $runningOK)

마지막 경우 값 1 (mysql_fetch_assoc이 값을 반환하는 경우) 또는 0을 할당하는 것입니다.

운영자가 추정을 해결하기 때문입니다.

이해하려면이 테이블을 확인하십시오.

http://php.net/manual/en/language.operators.precedence.php

해결 방법을 모를 때 필요한만큼 ()를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top