Perché questo ritorno loop 1 quando si utilizza && invece di 'e'?
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;
}
}
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.