Почему этот цикл возвращает 1 при использовании && вместо 'и'?
Вопрос
Разгадай мне это...в while($row = mysql_fetch_assoc($result) and $runningOK)
цикл, если PHP &&
оператор используется вместо and
тогда mysql_fetch_assoc
ужасно терпит неудачу и возвращает только номер 1
при беге.
Я пытался mysql_fetch_array()
и на месте, и у меня все еще есть 1
проблема.Это тогда, и только тогда, когда я заменяю &&
с помощью and
как и нынешний while
утверждение о том, что возвращены правильные строки.
Я разместил инструкции debug до, внутри и после, чтобы обеспечить это.Я хотел бы знать, является ли это причудой 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 = (истина && ложь))$g = истина && ложь;
// Константа true присваивается $h, а затем false игнорируется
// Действует как:(($h = true) и false)$h = истина и ложь;
var_dump($g, $h) var_dump($g, $h);
bool(ложь)
bool(истина)
Таким образом, с помощью && результату выражения присваивается значение true, которое равно 1.С помощью and он вычисляет результат функции mysql - я думаю, больше того, что вы хотите.
Кстати, вы также могли бы использовать break
чтобы устранить необходимость в переменной $runningOK.Для этого удалите and $runningOK
из while
состояние и изменение $runningOK = FALSE;
Для break;
и это завершит цикл, если сработает блок catch.
Другие советы
Попробуй это:
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
Используйте () столько, сколько вам нужно, когда вы не знаете, как это решается.