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;
    }
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top