Почему этот цикл возвращает 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 утверждение о том, что возвращены правильные строки.

Я разместил инструкции 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top