Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Ridondanza ciclo while/foreach

    Ciao, non riesco a spiegarmi una cosa...Devo popolare una lista dopo un'interrogazione ad un db.
    Il codice php per popolarla è il seguente, o meglio per semplificare non ho messo i tag <SELECT> e <OPTION VALUES>, ma l'errore che ottengo è lo stesso...

    codice:
    while ($row = mysql_fetch_assoc($result)) {
    foreach ($row as $value) {
    echo 'id= '.$row['movietype_id'].' valore= '.$row['movietype_label'] . '
    '; } 
    }
    La cosa strana che ottengo è che la funzione echo, mi stampa due volte gli stessi valori!!

    id= 7 valore= Action
    id= 7 valore= Action
    id= 3 valore= Adventure
    id= 3 valore= Adventure

    etc
    etc

    cosa che non accade se elimino l'istruzione foreach....sapete dirmi perché? Grazie!

  2. #2
    Per forza: cicli due volte lo stesso array con il FOREACH all'interno del WHILE!
    Codice PHP:
    while ($row mysql_fetch_assoc($result)) {

    echo 
    'id= '.$row['movietype_id'].' valore= '.$row['movietype_label'] . '
    '


    Prova così: dovrebbe funzionare.

    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  3. #3
    Grazie alcio 74! Nel frattempo me ne ero accorto, volevo anche sapere in che modo php ripete la scrittura dei valori...ossia

    codice:
    while ($row = mysql_fetch_assoc($result)) {
    in $row ci dovrebbe essere il primo record risultante dalla query

    codice:
     foreach ($row as $value) {
    qui ci dovrebbero nessere sempre i primi valori. All'uscita del ciclo foreach, il ciclo while non dovrebbe puntare già al prossimo record?

  4. #4
    Allora.... credo sia il caso di fare un paio di considerazioni.
    Una sulla tua domanda, una sul possibile motivo per il quale ottieni dallo script un comportamento anomalo.

    Il while analizza rigo per rigo l'array che tu crei con il mysql_fetch_assoc().
    Quindi il suo comportamento nello script è valido.
    L'istruzione che prevede l'interrogazione dal DB e l'estrapolazione dei vari dati risultanti funziona a dovere, restituendo un array associativo.
    Il ciclo di WHILE non fa altro che leggere un rigo di array per ciclo (fintanto che l'espressione passata come argomento sia TRUE).
    Nello stesso argomento, però, associ la funzione di creazione dell'array associativo ad una variabile ($row), che risulterà essere un array associativo proprio perché tu glielo imponi.
    FOREACH legge (rigo per rigo come il while) l'array estraendone i parametri.
    L'errore che fai nel secondo ciclo è quello di avere un array a più dimensioni e andare ad associare una sola variabile.
    Mi spiego con due righe di codice:
    Codice PHP:
    // tuo metodo: IMPRECISO
    foreach ($row as $value) { 
               
    // ........
    }
    // metodo CORETTO
    foreach ($row as $id_film => $label_film) { 
               
    // ........

    Con questo metodo, while e foreach sono sostanzialmente intercambiabili (per un array come questo).

    Spero di essere stato chiaro.
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  5. #5
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da alextalamonti
    All'uscita del ciclo foreach, il ciclo while non dovrebbe puntare già al prossimo record?
    All'uscita del ciclo, certo.
    Il problema è che all'INTERNO del ciclo il tuo codice veniva eseguito una volta per ogni campo contenuto. Siccome i campi sono due, ti stampava due volte il valore.
    Avrebbe avuto più senso fatto così
    Codice PHP:
    while ($row mysql_fetch_assoc($result)) {
      foreach (
    $row as $key => $value) {
        echo 
    "$key = $value - "; } 
      echo 
    '
    '
    ;


  6. #6
    Ok!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.