Почему этот цикл возвращает 1 при использовании && вместо 'и'? - PullRequest
2 голосов
/ 07 февраля 2010

Пошлите мне это ... в цикле while($row = mysql_fetch_assoc($result) and $runningOK), если вместо and используется оператор PHP &&, то 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;
    }
}

Ответы [ 4 ]

9 голосов
/ 07 февраля 2010

Это связано с приоритетом оператора. Подробнее см. в руководстве . Вот соответствующая часть.

// "&&" имеет больший приоритет, чем "И"

// Результат выражения (true && false) присваивается $ g
// Действует как: ($ g = (true && false))

$ g = true && false;

// Константа true присваивается $ h, а затем false игнорируется
// Действует как: (($ h = true) и false)

$ h = true и false;

var_dump ($ g, $ h);

BOOL (ложь)
BOOL (истина)

Таким образом, с && результат выражения присваивается true, который оценивается как 1. С помощью и он вычисляется как результат функции mysql - больше того, что вы хотите, я считаю.

Кстати, вы также можете использовать break, чтобы устранить необходимость в переменной $ runningOK. Для этого удалите and $runningOK из условия while и измените $runningOK = FALSE; на break;, и цикл завершится, если сработает блок захвата.

1 голос
/ 07 февраля 2010

Оператор присваивания = и два логических оператора && и 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.

1 голос
/ 07 февраля 2010

Попробуйте это:

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

Возможна путаница, так как mysql_fetch_assoc($result) and $runningOK оценивается как ИСТИНА, которую затем присваивает $row, что в данном случае совпадает с 1

Если вы добавите скобки, вы, скорее всего, можете использовать либо &&, либо and, так как вы правильно разделите две оценки.

Я уверен, что это побочный эффект альтернативных синтаксисов.

0 голосов
/ 07 февраля 2010

Это потому, что оператор разрешает приоритет.

Проверьте эту таблицу, чтобы понять:

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

Используйте () столько, сколько вам нужно, если вы не знаете, как это разрешено.

...