Warum 1 diese Schleife Rückkehr bei der Verwendung von && statt ‚und‘?
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;
}
}
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.