Domanda

Di recente ho iniziato a utilizzare Zend Studio che ha segnalato come avviso il seguente tipo di codice:

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

Per interrompere l'avviso, il codice deve essere scritto in questo modo:

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

Perché questo è contrassegnato come un avvertimento? È così male?

Comprendo che l'avviso può essere progettato per bloccare errori come questo:

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

che non terminerà mai perché 1 viene assegnato a $ a che a sua volta restituisce 1 all'istruzione while, anziché essere testato contro $ a e restituire false all'istruzione while quando $ a non è 1.

Errore facile da fare che può convalidare un avviso, concesso, ma dimentica di aggiungere l'ulteriore $ f = fetch ($ q) alla fine del blocco while nel secondo esempio che comporterà anche un ciclo che non terminerà mai. Se cambio il mio codice per rimuovere l'avviso e poi dimentico di aggiungere $ f = fetch ($ q) alla fine del blocco mentre Zend non avviserà di questo!

Quindi, rimuovendo l'avvertimento riguardante un errore comune, mi sto preparando per un diverso errore comune.

Fuori dalla padella, nel fuoco.

È stato utile?

Soluzione

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

Altri suggerimenti

Quindi non dovrai riscrivere tutto il tuo codice senza un motivo decente: Puoi disabilitare il rilevamento di questo potenziale errore di programmazione in Finestra | Preferenze, PHP | Analisi semantica .

Questo è probabilmente contrassegnato come un avvertimento perché le persone usano spesso " = " per errore quando significano " == " ;.

es:

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

Questo non terminerà mai, anche se se pensassi di aver scritto " == " ;, dovrebbe.

Zend Studio sta cercando di aiutarti a scrivere codice migliore che semplifichi il debug. Disabilitare il controllo semantico non è una buona idea, si limita a spazzare potenziali problemi sotto il tappeto e ti perderai i problemi reali. Questa è una ragione decente! Non evitare i messaggi di avviso ignorandoli, modifica il codice implementando la soluzione corretta.

Come ben sai Zend Studio è basato su eclipse, che è un IDE Java. Nel linguaggio Java è ilegal fare qualcosa del genere:

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

Questo perché anche se 'getName' restituisce un valore nullo, verrà assegnato a 's' e il casting tra oggetti e valori booleani (che è il tipo richiesto dalle istruzioni condition) è un po 'più soggettivo come con PHP, quindi genererà un'eccezione in fase di compilazione.

La situazione in PHP potrebbe essere diversa, ma per qualche motivo gli sviluppatori di Zend hanno deciso di lasciare questo avviso attivo per impostazione predefinita, è possibile disabilitarlo come menzionato prima, ma ritengo che ti aiuterà quando si verifica un vero incarico in condizioni.

La pulizia dell'avviso è abbastanza semplice semplicemente assegnando i risultati e confrontandolo in questo modo:

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

Invece di:

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

Come puoi vedere non hai bisogno di ulteriori mazzi di codice.

Comunque è solo un avvertimento, non devi preoccuparti molto di loro.

In realtà, immagino che alla tua domanda sia già stata data una risposta, in qualche modo. Ma per risolvere il tuo vero problema, penso che ciò potrebbe aiutare.

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

Questo dovrebbe fare il trucco e il messaggio "Assignment in condition" dovrebbe scomparire.

Come un sidenote: usa l'operatore uguale allo stesso modo di quando neghi qualcosa. Puoi anche usare il segno di uguale con altri operatori come

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

e non

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

Questo mi aiuta a ricordare sempre come confrontare i valori e non assegnare loro valori.

La ragione per cui è male è che molte persone usano " = " quando poi significava " == "

L'operatore = restituirà l'assegnazione a sinistra, quindi se usi if ($ x = true) il codice all'interno di if verrà eseguito, se usi if ($ x = false) il codice non verrà eseguito. È un trucco accurato che può salvare una o due righe di codice ma è anche pericoloso perché se intendevi if ($ x == false) e digitato if ($ x = false) sarà un bug che può essere difficile da rintracciare.

No, i miei amici tutti le assegnazioni nella condizione generano questo avviso. Non desidero disattivarlo completamente, poiché = anziché == è un errore di sintassi a cui sono incline. Per quanto riguarda il motivo per cui è necessario, userò un esempio dal Manuale PHP. Questo è tratto dalla sezione "MySQL migliorata" estensioni 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"]);
    }

sfortunatamente, ho sviluppato le mie funzioni di database usando questa tecnica e sto provando a usarle in Zend Studio. Questo errore si presenta abbastanza volte da essere un vero dolore. Riformulerò con i suggerimenti qui, dato che apprezzo il codice inequivocabile, tuttavia vado anche sul manuale di PHP e suggerisco che cambino l'esempio per usare lo stile migliore. Forse alcuni di voi potrebbero fare lo stesso e potremmo migliorare la documentazione ?!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top