Domanda

mi Riddle questo ... nel ciclo while($row = mysql_fetch_assoc($result) and $runningOK), se l'operatore PHP && viene utilizzato al posto del and poi mysql_fetch_assoc fallisce terribilmente e restituisce solo il numero 1 durante l'esecuzione.

Ho provato mysql_fetch_array() e al suo posto e ho ancora il problema 1. E 'quando, e solo quando, ho sostituire il && con una and come l'affermazione while corrente che le righe corrette vengono restituiti.

Avevo messo istruzioni di debug prima, dentro, e dopo per assicurare questo. Vorrei sapere se questo è un capriccio PHP o qualcosa che non potevo spiegare.

// 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;
    }
}
È stato utile?

Soluzione

E 'a causa di precedenza degli operatori. Vedere la manuale per i dettagli ... ecco la parte rilevante.

  

// "&&" ha una precedenza maggiore di   "E"

     

// Il risultato dell'espressione (true && false) è assegnato a $ g
  // si comporta come: ($ g = (true && false))

     

$ g = true && false;

     

// La costante vera è assegnato a $ h e quindi falsa viene ignorato
  // si comporta come: (($ h = true) e falso)

     

$ h = true e false;

     

var_dump ($ g, $ h);

     

bool (false)
  bool (true)

Così, con l'&&, il risultato dell'espressione è assegnato a vera, che valuta a 1. Con e, si restituisce il risultato della funzione mysql - più ciò che vuoi, mi sa

.

Tra l'altro, si potrebbe anche usare break per eliminare la necessità per la variabile $ runningOK. Per fare ciò, rimuovere and $runningOK dalla condizione while e cambiare $runningOK = FALSE; per break; e si concluderà il ciclo se il blocco catch viene attivato.

Altri suggerimenti

Prova questo:

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

Ci potrebbe essere un mix up, in quanto è la valutazione mysql_fetch_assoc($result) and $runningOK TRUE, che poi assegna a $row, che in questo caso è lo stesso di 1

Se si aggiunge la parentesi, molto probabilmente può utilizzare sia && o and, come avrete separato correttamente le due valutazioni.

Questa è l'effetto collaterale di sintassi alternative sono sicuro.

Il = operatore di assegnazione e due operatori logici && e AND Avere differente precedenza : && viene eseguita prima =, che a sua volta viene eseguito prima AND

Quindi, in pratica la dichiarazione:

$row = mysql_fetch_assoc($result) AND $runningOK

è uguale a:

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

, mentre la dichiarazione:

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

è uguale a:

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

In quest'ultimo caso vi sono solo l'assegnazione di valori 1 (se mysql_fetch_assoc restituisce un valore) o 0.

E 'perché l'operatore risolvere prescedence.

Controllate questa tabella per capire:

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

Usa () per quanto è necessario, quando non si sa come è risolto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top