Question

J'ai récemment commencé à utiliser Zend Studio qui a signalé l'avertissement du type de code suivant:

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

Pour arrêter l'avertissement, le code doit être écrit comme suit:

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

Pourquoi est-ce marqué comme un avertissement? Est-ce si grave?

Je comprends que l'avertissement peut être conçu pour arrêter des erreurs comme celle-ci:

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

qui ne se terminera jamais parce que 1 est assigné à $ a qui à son tour renvoie 1 à l'instruction while, plutôt que d'être testé contre $ a et de renvoyer false à l'instruction while lorsque $ a n'est pas 1.

Erreur facile à commettre qui peut valider un avertissement, mais oublie d’ajouter l’extra $ f = fetch ($ q) à la fin du bloc while du deuxième exemple, ce qui entraînera également une boucle qui ne se terminera jamais. Si je modifie mon code pour supprimer l’avertissement et oublie d’ajouter le $ f = fetch ($ q) à la fin du bloc while, Zend ne l’avertira pas!

Donc, en supprimant l'avertissement concernant une erreur commune, je me prépare à une autre erreur commune.

Hors du plateau, dans le feu.

Était-ce utile?

La solution

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

Autres conseils

Vous n'aurez donc pas besoin de réécrire tout votre code sans raison valable: Vous pouvez désactiver la détection de cette erreur de programmation potentielle dans Fenêtre | Préférences, PHP | Analyse sémantique .

Ceci est probablement marqué comme un avertissement car les utilisateurs utilisent souvent "& =" & "; par erreur quand ils signifient "==".

par exemple:

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

Cela ne se terminera jamais, mais si vous pensiez avoir écrit "il =", il le devrait.

Zend Studio essaie de vous aider à rédiger un code plus facile à déboguer. Désactiver la vérification sémantique n'est pas une bonne idée, elle balaye simplement les problèmes potentiels sous le tapis et vous manquerez les vrais problèmes. C'est une bonne raison! N'évitez pas les messages d'avertissement en les ignorant, modifiez votre code en implémentant la solution appropriée.

Comme vous le savez bien, Zend Studio est basé sur Eclipse, un environnement de développement Java. En langage Java, il est ilegal de faire quelque chose comme ça:

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

En effet, même si 'getName' renvoie une valeur null, il sera affecté à 's' et le transtypage entre objets et booleans (qui est le type requis par les instructions de condition) est un peu plus subjectif qu'avec PHP. lancera une exception lors de la compilation.

La situation en PHP est peut-être différente, mais pour une raison quelconque, les développeurs de Zend ont décidé de laisser cet avertissement actif par défaut. Vous pouvez le désactiver comme indiqué précédemment, mais j’estime que cela vous aidera lorsqu’une véritable affectation dans la condition se produit.

Il est très facile de nettoyer l’avertissement en attribuant les résultats, puis en les comparant comme suit:

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

Au lieu de:

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

Comme vous pouvez le constater, vous n'avez pas besoin de paquets de code supplémentaires.

De toute façon, il ne s'agit que d'un avertissement, vous n'avez pas à vous soucier d'eux beaucoup.

En fait, je suppose que votre question a déjà été répondue, un peu. Mais pour résoudre votre problème actuel, je pense que cela pourrait aider.

//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);
}

Cela devrait faire l'affaire et le message "Affectation en condition" devrait disparaître.

Sidenote: utilisez l'opérateur égal de la même manière que lorsque vous annulez des éléments. Vous utilisez également le signe d'égalité avec d'autres opérateurs tels que

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

et non

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

Cela m'aide à toujours me rappeler comment comparer des valeurs sans leur attribuer de valeurs.

La raison en est que beaucoup de gens utilisent " = " à ce moment-là, " == "

L'opérateur = retournera l'assigment à gauche. Ainsi, si vous utilisez si ($ x = true) , le code situé dans le if sera exécuté, si vous utilisez si ($ x = false) le code ne sera pas exécuté. C'est une astuce qui permet de sauver une ligne ou deux de code, mais c'est aussi dangereux parce que si vous vouliez dire si ($ x == false) et tapé si ($ x = false) ce sera un bug qui peut être difficile à localiser.

Nay mes amis toutes les affectations de la condition génèrent cet avertissement. Je ne veux pas désactiver cela complètement, car = au lieu de == est une erreur de syntaxe à laquelle je suis enclin. En ce qui concerne la question de savoir pourquoi cela est nécessaire, je vais utiliser un exemple tiré du manuel PHP. C’est tiré de la section "Amélioration de MySQL". extensions ou 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"]);
    }

Malheureusement, j’ai développé les fonctions de base de données en utilisant cette technique et j’essaie de les utiliser dans Zend Studio. Cette erreur apparaît assez de fois pour être une vraie douleur. Je reformulerai les suggestions ici, car je valorise un code non ambigu, mais je vais aussi passer au manuel PHP et leur suggérer de changer l'exemple pour utiliser le meilleur style. Peut-être que certains d'entre vous pourraient faire de même et que nous pourrions améliorer la documentation?!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top