Pourquoi est-ce retour de la boucle 1 lors de l'utilisation && au lieu de « et »?

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

  •  19-09-2019
  •  | 
  •  

Question

moi Riddle cette ... dans la boucle de while($row = mysql_fetch_assoc($result) and $runningOK), si l'opérateur && PHP est utilisé à la place du and alors mysql_fetch_assoc échoue terriblement et retourne juste le nombre 1 lors de l'exécution.

Je l'ai essayé et mysql_fetch_array() en place et j'ai encore le problème de 1. Il est quand, et seulement quand, je remplace le && avec un and comme la déclaration de while actuelle que les lignes correctes sont retournées.

Je l'avais placé des instructions de débogage avant, à l'intérieur, et après pour assurer cela. Je voudrais savoir si cela est une bizarrerie PHP ou quelque chose que je ne pouvais pas expliquer.

// 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;
    }
}
Était-ce utile?

La solution

Il est fait de la priorité de l'opérateur. Voir manuel pour plus de détails ... voici la partie pertinente.

  

// "&&" a une plus grande priorité que   "Et"

     

// Le résultat de l'expression (true && false) est affecté à $ g
  // Actes comme: ($ g = (true && false))

     

$ g = true && false;

     

// La constante vraie est assignée à $ h et faux est ignoré
  // Actes comme: (($ h = true) et false)

     

$ h = true et false;

     

var_dump ($ g, $ h);

     

bool (false)
  bool (true)

Alors, avec le &&, le résultat de l'expression est affectée à true, qui évalue à 1. Avec et, il évalue le résultat de la fonction mysql - plus ce que vous voulez, je pense

.

Par ailleurs, vous pouvez également utiliser break pour éliminer la nécessité de la variable $ runningOK. Pour ce faire, enlever and $runningOK de la condition de while et changer $runningOK = FALSE; à break; et mettra fin à la boucle si le bloc catch est déclenché.

Autres conseils

Essayez ceci:

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

Il pourrait y avoir eu confusion, car il évalue mysql_fetch_assoc($result) and $runningOK à TRUE, qu'il attribue ensuite à $row, qui dans ce cas est le même que 1

Si vous ajoutez la parenthèse, vous avez probablement peut utiliser && ou and, que vous aurez bien séparé les deux évaluations.

Ceci est l'effet secondaire de syntaxes alternatives, je suis sûr.

L'opérateur d'affectation = et les deux opérateurs logiques && et AND autre priorité : && est exécutée avant =, qui à son tour est exécutée avant AND

Donc, fondamentalement, la déclaration:

$row = mysql_fetch_assoc($result) AND $runningOK

est égal à:

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

alors que l'instruction:

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

est égal à:

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

Dans le dernier cas, vous êtes juste d'attribuer des valeurs 1 (si mysql_fetch_assoc retourne une valeur) ou 0.

Il est parce que l'opérateur résolution prescedence.

Consultez ce tableau pour comprendre:

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

Utilisation () autant que vous avez besoin quand vous ne savez pas comment il est résolu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top