¿Por qué este bucle de retorno 1 cuando se utiliza en lugar de && 'y'?
Pregunta
Adivina esto ... en el bucle while($row = mysql_fetch_assoc($result) and $runningOK)
, si el operador PHP &&
se utiliza en lugar de la and
continuación mysql_fetch_assoc
falla terriblemente y devuelve sólo el número 1
cuando se ejecuta.
He intentado mysql_fetch_array()
y en su lugar y todavía tengo el problema 1
. Es cuando, y sólo cuando, se sustituye la &&
con un and
como la declaración while
corriente que se devuelven las filas correctas.
Me había colocado instrucciones de depuración antes, en el interior, y después de asegurar esto. Me gustaría saber si esto es una peculiaridad PHP o algo que no podía explicar.
// 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;
}
}
Solución
Es debido a la prioridad de los operadores. Ver la manual para más detalles ... aquí está la parte pertinente.
// "&&" tiene una prioridad mayor que "Y"
// El resultado de la expresión (true && false) se asigna a $ g
// actúa como: ($ g = (true && false))$ g = true && false;
// La verdadera constante se asigna a $ h y luego se ignora falsa
// actúa como: (($ h = true) y falso)$ h = verdadero y falso;
var_dump ($ g, $ h);
bool (false)
bool (true)
Así que, con el &&, el resultado de la expresión se asigna a la verdadera, que evalúa a 1. Con y, se evalúa como el resultado de la función de MySQL - más lo que quiere, calculo
. Por cierto, usted podría también utilizar break
para eliminar la necesidad de que la variable $ runningOK. Para ello, retire and $runningOK
de la condición while
y cambiar $runningOK = FALSE;
a break;
y finalizará el bucle si se activa el bloque catch.
Otros consejos
Prueba esto:
while(($row = mysql_fetch_assoc($result)) and $runningOK)
Puede haber una confusión, ya que es la evaluación de mysql_fetch_assoc($result) and $runningOK
a TRUE, que posteriormente asigna a $row
, que en este caso es el mismo que 1
Si se agrega el paréntesis, es muy probable que puede utilizar cualquiera &&
o and
, ya que tendrá separadamente las dos evaluaciones.
Este es el efecto secundario de la sintaxis alternativa, estoy seguro.
El =
operador de asignación y la &&
dos operadores lógicos y AND
Tienes diferente precedencia: &&
se ejecuta antes de =
, que a su vez se ejecuta antes AND
Así que, básicamente, la declaración:
$row = mysql_fetch_assoc($result) AND $runningOK
es igual a:
($row = mysql_fetch_assoc($result)) AND $runningOK
Si bien la declaración:
$row = mysql_fetch_assoc($result) && $runningOK
es igual a:
$row = (mysql_fetch_assoc($result) && $runningOK)
En el último caso se acaba de asignar valores 1 (si mysql_fetch_assoc devuelve un valor) o 0.
Es debido a que el operador de resolución de prescedence.
Compruebe esta tabla para entender:
http://php.net/manual/en/language.operators .precedence.php
Uso () todo lo que necesita cuando usted no sabe cómo se resuelve.