Frage

Ich habe vor kurzem begonnen haben, mit Zend Studio, die als Warnung die folgende Art von Code gemeldet hat:

$q = query("select * from some_table where some_condition");
while ($f = fetch($q)) {
  // some inner workings
}

, um die Warnung der Code muss aufhören so geschrieben werden:

$q = query("select * from some_table where some_condition");
$f = fetch($q);
while ($f) {
  // some inner workings
  $f = fetch($q);
}

Warum ist dies als Warnung markiert? Ist es so schlimm?

Ich verstehe, dass die Warnung ausgebildet sein kann Fehler wie diese zu stoppen:

$a = 1;
while ($a = 1) {
  // some inner workings
  $a++;
}

, die nie enden, weil 1 ist ein auf $ zugeordnet ist wiederum die 1 auf die while-Anweisung zurückgibt, anstatt gegen $ a getestet wird und die Rückkehr falsch auf die while-Anweisung, wenn $ a nicht 1 ist.

Einfache Fehler zu machen, die eine Warnung bestätigen kann, gewährt, aber so ist zu vergessen die zusätzlichen $ f hinzuzufügen = zu holen ($ q) am Ende des während des Blockes in dem zweiten Beispiel, das auch in einer Schleife führen, dass wird nie enden. Wenn ich meinen Code ändern, um die Warnung zu entfernen und dann vergessen, die $ f hinzuzufügen = holen ($ q) am Ende des während des Blockes Zend wird Warnung nicht über das sein!

So durch die Warnung Entfernen eines gemeinsamen Fehler bezüglich ich bin Einstellung für einen anderen gemeinsamen Fehler auf.

Aus der Pfanne ins Feuer.

War es hilfreich?

Lösung

while (($row = $sql->db_Fetch("MYSQL_ASSOC")) != false)

Andere Tipps

So müssen Sie nicht ohne einen anständigen Grund all Ihren Code neu schreiben: Sie können die Erkennung dieses Potential Programmierfehler in Fenster deaktivieren | Einstellungen, PHP | Semantische Analyse .

Dies ist wahrscheinlich als Warnung markiert, weil die Menschen oft „=“ versehentlich verwenden, wenn sie bedeuten „==“.

Beispiel:

$a = 1
while($a = 1) {
   $a++;
}

Das wird nie enden, obwohl, wenn Sie dachten, Sie hatte geschrieben „==“, es sollte.

Zend Studio versucht, Ihnen zu helfen, in einer besseren Code zu schreiben, der einfacher debuggt. Semantische Überprüfung zu deaktivieren, ist keine gute Idee, es fegt nur mögliche Probleme unter den Teppich, und Sie werden auf die wirklichen Probleme fehlen werden. Das ist ein anständiger Grund! Nicht vermeiden Warnmeldungen durch Ignorieren sie, ändern Sie den Code, indem Sie die richtige Lösung zu implementieren.

Wie Sie wissen Zend Studio auf Eclipse gebaut, die eine Java IDE ist. In der Programmiersprache Java ist es ilegal, so etwas zu tun:

String s;
while (s = getName()) {
    ...
}

Das ist, weil, selbst wenn ‚getName‘ gibt einen Nullwert wird es auf ‚s‘ zugeordnet wird und Gießen zwischen Objekten und booleans (die der erforderliche Typ der Bedingung Aussagen ist) ein bisschen mehr subjektiv als mit PHP ist, daher ist es wird eine Ausnahme in der Kompilierung werfen.

Die Situation in PHP können unterschiedlich sein, aber aus irgendeinem Grund die Zend-Entwickler beschlossen, diese Warnung standardmäßig aktiv zu verlassen, können Sie es deaktivieren, wie schon erwähnt, aber ich halte es wird Ihnen helfen, wenn eine echte Zuweisung in Zustand geschieht.

die Warnung Reinigung ist ganz einfach nur durch die Ergebnisse zuweisen und dann es wie folgt zu vergleichen:

if (($result = $mysqli->query ( $query )) == true) {

Statt:

if ($result = $mysqli->query ( $query )) {

Wie Sie sehen können Sie keine zusätzlichen Bündel von Code brauchen.

Auf jeden Fall ist es nur eine Warnung, Sie müssen nicht viel von ihnen kümmern.

Eigentlich, denke ich, Ihre Frage bereits beantwortet wurde, etwas. Aber Ihr eigentliches Problem zu lösen, ich denke, das könnte helfen.

//i dont know what is returned if there are no more records to fetch...
//but lets assume it is a boolean value
while (($f = fetch($q))!= false)
{
    $this->doSomethingVeryImportantThatMakesYourBossHappy($f);
}

Das sollte den Trick und die "Zuordnung in Zustand" do -Nachricht sollte verschwinden.

Als Nebenbemerkung: Verwenden Sie den Gleichheitsoperator die gleiche Weise, wie wenn man Sachen negieren. Sie verwenden auch die Gleichen mit anderen Betreibern unterzeichnen wie

if ($falseness != false){$trueness = true}

und nicht

if ($falseness ! false){$trueness = false}

Das hilft mir immer erinnern, wie Werte zu vergleichen und nicht die Werte zuweisen.

Der Grund ist es schlecht ist eine Menge Leute „=“ verwenden, wenn dann gemeint „==“

Der Operator = wird die assigment nach links zurückzukehren, so, wenn Sie if($x=true) den Code innerhalb der verwenden, wenn läuft, wenn Sie if($x=false) den Code verwenden, werden nicht ausgeführt werden. Es ist ein netter Trick, die eine oder zwei Zeilen von Code speichern kann, aber es ist auch gefährlich, weil, wenn Sie if($x == false) gemeint und tippte if($x = false) wird es ein Fehler sein, die schwierig sein kann, aufzuspüren.

Nein meine Freunde alle Zuordnungen in der Bedingung, die diese Warnung erzeugen. Ich möchte nicht, diese vollständig zu deaktivieren, da = statt == ein Syntaxfehler ist i anfällig bin. Was Frage, warum es notwendig ist, werde ich ein Beispiel aus dem PHP Manual verwenden. Dies ist aus dem Abschnitt über die „MySQL verbessert“ Erweiterungen oder mysqli:

$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";

if ($result = $mysqli->query($query)) {

    /* fetch associative array */
    while ($row = $result->fetch_assoc()) {
        printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
    }

leider habe ich meine Datenbank-Funktionen mit dieser Technik entwickelt und ich versuche, sie in Zend Studio zu nutzen. Dieser Fehler wird Aufspringen genug mal ein echten Schmerzen zu sein. Ich werde hier mit den Vorschlägen anders formulieren, als ich eindeutige Code-Wert, aber ich bin auch über Pop auf das PHP-Handbuch gehen und vorschlagen, dass sie das Beispiel ändern, um die bessere Art zu verwenden. einige von Ihnen vielleicht könnte das gleiche tun, und wir konnten die Dokumentation verbessern?!

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