Pregunta

Recientemente comencé a usar Zend Studio, que informó como advertencia el siguiente tipo de código:

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

Para detener la advertencia, el código debe escribirse así:

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

¿Por qué está marcado como una advertencia? ¿Es tan malo?

Entiendo que la advertencia puede estar diseñada para detener errores como este:

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

que nunca terminará porque 1 se asigna a $ a, que a su vez devuelve 1 a la instrucción while, en lugar de probarse contra $ a y devolver falso a la instrucción while cuando $ a no es 1.

Error fácil de hacer que puede validar una advertencia, concedida, pero también se olvida de agregar $ f = fetch ($ q) al final del bloque while en el segundo ejemplo que también dará como resultado un bucle que nunca terminará. ¡Si cambio mi código para eliminar la advertencia y luego me olvido de agregar $ f = fetch ($ q) al final del bloque while, Zend no advertirá sobre eso!

Entonces, al eliminar la advertencia sobre un error común, me estoy preparando para un error común diferente.

Fuera de la sartén, al fuego.

¿Fue útil?

Solución

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

Otros consejos

Para que no tenga que reescribir todo su código sin una razón decente: Puede desactivar la detección de este posible error de programación en Ventana | Preferencias, PHP | Análisis semántico .

Esto probablemente está marcado como una advertencia porque las personas a menudo usan " = " por error cuando se refieren a " == " ;.

por ejemplo:

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

Esto nunca terminará, aunque si pensabas que habías escrito " == " ;, debería.

Zend Studio está tratando de ayudarlo a escribir un código mejor que depure más fácilmente. Deshabilitar la comprobación semántica no es una buena idea, simplemente barre los posibles problemas debajo de la alfombra y se perderá los problemas reales. Esa es una razón decente! No evite los mensajes de advertencia al ignorarlos, modifique su código implementando la solución correcta.

Como bien sabes, Zend Studio está construido sobre eclipse, que es un IDE de Java. En el lenguaje Java es ilegal hacer algo como esto:

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

Eso es porque incluso si 'getName' devuelve un valor nulo, se asignará a 's' y la conversión entre objetos y booleanos (que es el tipo requerido por las declaraciones de condición) es un poco más subjetiva que con PHP, por lo tanto, lanzará una excepción en tiempo de compilación.

La situación en PHP puede ser diferente, pero por alguna razón los desarrolladores de Zend decidieron dejar esta advertencia activa por defecto, puede deshabilitarla como se mencionó anteriormente, pero considero que lo ayudará cuando ocurra una asignación real en condición.

Limpiar la advertencia es bastante fácil simplemente asignando los resultados y luego comparándolo así:

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

En lugar de:

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

Como puede ver, no necesita grupos adicionales de código.

De todos modos es solo una advertencia, no tienes que preocuparte mucho por ellos.

En realidad, supongo que su pregunta ya ha sido respondida, de alguna manera. Pero para abordar su problema real, creo que esto podría ayudar.

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

Eso debería hacer el truco y la "Asignación en condición" -mensaje debería desaparecer.

Como nota al margen: use el operador igual de la misma manera que cuando niega cosas. También usa el signo igual con otros operadores como

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

y no

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

Eso me ayuda a recordar siempre cómo comparar valores y no asignarles valores.

La razón por la que es malo es que mucha gente usa " = " cuando entonces significaba " == "

El operador = devolverá la asignación a la izquierda, así que si usa if ($ x = true) se ejecutará el código dentro del if, si usa if ($ x = falso) el código no se ejecutará. Es un buen truco que puede guardar una o dos líneas de código, pero también es peligroso porque si quisiste decir if ($ x == false) y escribiste if ($ x = false) será un error que puede ser difícil de rastrear.

No, mis amigos todas las asignaciones en la condición generan esta advertencia. No quiero desactivar esto por completo, ya que = en lugar de == es un error de sintaxis al que soy propenso. En cuanto a la pregunta de por qué es necesario, usaré un ejemplo del Manual de PHP. Esto es de la sección sobre el "MySQL mejorado" extensiones o 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"]);
    }

desafortunadamente, he desarrollado mis funciones de base de datos usando esta técnica y estoy tratando de usarlas en Zend Studio. Este error aparece suficientes veces para ser un verdadero dolor. Reformularé con las sugerencias aquí, ya que valoro el código inequívoco, sin embargo, también voy a ir al manual de PHP y sugerirles que cambien el ejemplo para usar el mejor estilo. ¡¿Quizás algunos de ustedes podrían hacer lo mismo y nosotros podríamos mejorar la documentación ?!

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