Frage

Riddle mich dies ... in der while($row = mysql_fetch_assoc($result) and $runningOK) Schleife, wenn der PHP && Operator anstelle des and verwendet wird mysql_fetch_assoc dann nicht schrecklich und kehrt nur die Nummer 1 beim Laufen.

Ich habe versucht, mysql_fetch_array() und an Ort und Stelle, und ich habe immer noch das Problem 1. Es ist, wenn, und nur dann, wenn ich die && mit einem and wie die aktuelle while Anweisung ersetzen, dass die richtigen Zeilen zurückgegeben werden.

Ich hatte Debug-Anweisungen platziert vor, nach innen, und danach zu versichern. Ich würde gerne wissen, ob dies eine PHP Marotte oder etwas ist, konnte ich nicht erklären.

// 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;
    }
}
War es hilfreich?

Lösung

Es ist aufgrund Operator Vorrang. Siehe das Handbuch Details ... hier ist der relevante Teil.

  

// „&&“ hat eine größere Priorität als   "Und"

     

// Das Ergebnis des Ausdrucks (true && false) auf $ zugewiesen g
  // Acts wie: ($ g = (true && false))

     

$ g = true && false;

     

// Die Konstante wahr ist $ h zugewiesen und dann falsch ist, ignoriert
  // Acts wie: (($ h = true) und false)

     

$ h = wahr und falsch;

     

var_dump ($ g, $ h);

     

bool (false)
  bool (true)

Also, mit dem &&, wird das Ergebnis des Ausdrucks wahr zugeordnet, die mit auf 1 bewertet und es wertet auf das Ergebnis der MySQL-Funktion - mehr, was Sie wollen, ich rechne

.

By the way, können Sie auch break verwenden, um die Notwendigkeit für den $ runningOK Variable zu eliminieren. Dazu entfernen and $runningOK vom while Zustand und ändern $runningOK = FALSE; break; und es wird die Schleife beenden, wenn der catch-Block ausgelöst wird.

Andere Tipps

Versuchen Sie folgendes:

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

Es könnte eine Verwechslung sein, da sie die Bewertung mysql_fetch_assoc($result) and $runningOK auf TRUE ist, die es dann $row zuweist, die in diesem Fall ist die gleiche wie 1

Wenn Sie die Klammer hinzufügen, werden Sie wahrscheinlich entweder && oder and verwenden können, wie Sie richtig, die beiden Bewertungen getrennt haben.

Dies ist die Nebenwirkung von alternativen Syntaxen ich bin sicher.

Der Zuweisungsoperator = und die beiden logischen Operatoren && und AND have unterschiedlicher Vorrang : && vor = ausgeführt, der wiederum vor AND ausgeführt

Also im Grunde der Erklärung:

$row = mysql_fetch_assoc($result) AND $runningOK

ist gleich:

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

während der Aussage:

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

ist gleich:

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

Im letzten Fall sind Sie nur Werte zuweisen 1 (wenn mysql_fetch_assoc einen Wert zurückgibt) oder 0.

Es ist, weil der Bediener prescedence lösen.

in dieser Tabelle heraus zu verstehen:

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

() verwenden, so viel wie Sie brauchen, wenn Sie nicht wissen, wie es gelöst werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top