이 루프가 '및'대신 &&를 사용할 때 1이 반환되는 이유는 무엇입니까?
문제
나에게 이것을 수수께끼 ... 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
해결 방법을 모를 때 필요한만큼 ()를 사용하십시오.