Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26

Discussione: Problema ciclo WHILE

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    125

    Problema ciclo WHILE

    Buongiorno,

    ho un problema con un ciclo WHILE, che non funziona come mi aspetto.

    <?php
    /*
    $sql = "SELECT * FROM prodotti WHERE id = '$carrello'";
    $res = $db->query($sql);
    while($f = $res->fetch()) {
    $importo = $f['prezzo'];
    $iva = $importo * 21 / 100;
    $totale = $importo + $iva;
    }
    */
    echo '<input type="text" name="importo" size="8" value="'.$carrello.'"/>';
    ?>

    Il codice è relativo ad una pagina che mostra un carrello, con la possibilità di aggiungere o togliere prodotti dal suo interno.
    Se io stampo a video un campo di testo e nel suo value ci metto la variabile $carrello, l'output mi riporta con esattezza gli ID relativi ai prodotti inseriti nel carrello stesso, separati da una virgola.
    Ora, togliendo il commento dal codice su riportato, il mio ragionameno, premettendo che mastico poco il PHP, è stato il seguente: se con un ciclo mi scorro tutte le righe della tabella prodotti e recupero da ciascuna il prezzo, posso poi applicare l'IVA, calcolare il totale e stamparlo a video, sostituendo $carrello con $totale.
    Così facendo, mi calcola solo il totale del primo prodotto che inserisco nel carrello.
    Se ne aggiungo altri, rimango fermo al valore precedente e quindi il totale non si aggiorna.
    Dove sto sbagliando?
    Aiutatemi perfavore.

    Grazie a tutti

  2. #2
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    fai così

    Codice PHP:

    foreach ($res as $f)
    {
        
    //corpo del ciclo


  3. #3
    Utente di HTML.it L'avatar di m4rko80
    Registrato dal
    Aug 2008
    residenza
    Milano
    Messaggi
    2,655
    Ciao, questo e' un ciclo:
    codice:
    $sql = "SELECT * FROM prodotti WHERE id = '$carrello'";
    $res = $db->query($sql);
    while($f = $res->fetch()) {
    $importo = $f['prezzo'];
    $iva = $importo * 21 / 100;
    $totale = $importo + $iva;
    }
    quindi se stai all interno e devi calcolare un totale dei vari record trovati dovresti fare una cosa così:
    codice:
    $totale = 0;
    $sql = "SELECT * FROM prodotti WHERE id = '$carrello'";
    $res = $db->query($sql);
    while($f = $res->fetch()) {
    $importo = $f['prezzo'];
    $iva = $importo * 21 / 100;
    $totale = $totale + $importo + $iva; //continui a sommare al totale che avevi già altrimenti continua a rigenerare $totale come fosse nuova
    }
    Stesso discorso se devi mostrare una lista, o crei un array nel ciclo e poi lo usi al di fuori o crei la visualizzazione all'interno del ciclo

    codice:
    $sql = "SELECT * FROM prodotti WHERE id = '$carrello'";
    $res = $db->query($sql);
    while($f = $res->fetch()) {
    $importo = $f['prezzo'];
    $iva = $importo * 21 / 100;
    $totale = $importo + $iva;
    echo 'visualizza importo: '.$importo; //e così via
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    125
    Grazie per la risposta, ma neanche così funziona. Mi continua a calcolare solo il prezzo ivato del primo prodotto inserito nel carrello.

    ------------------------------------------------------------------------------

    <?php
    $sql = "SELECT * FROM prodotti WHERE id = '$carrello'";
    $res = $db->query($sql);
    foreach ($res as $f) {
    while($f = $res->fetch()) {
    $importo = $f['prezzo'];
    $iva = $importo * 21 / 100;
    $totale = $importo + $iva;
    }
    }
    echo '<input type="text" name="importo" size="8" value="'.$totale.'"/>';
    ?>

    -------------------------------------------------------------------------------

    Forse può essere utile che posti anche il codice relativo al carrello

    -------------------------------------------------------------------------------

    $carrello = $_SESSION['carrello'];
    if(@isset($_GET['action']))
    {
    $action = $_GET['action'];

    switch ($action)
    {
    case 'aggiungi':
    if ($carrello)
    {
    $carrello .= ','.$_GET['id'];
    }else{
    $carrello = $_GET['id'];
    }
    break;

    case 'cancella':
    if ($carrello)
    {
    $prodotti = @explode(',',$carrello);
    $acquisto = '';
    foreach ($prodotti as $prodotto)
    {
    if ($_GET['id'] != $prodotto)
    {
    if ($acquisto != '')
    {
    $acquisto .= ','.$prodotto;
    }else{
    $acquisto = $prodotto;
    }
    }
    }
    $carrello = $acquisto;
    }
    break;

    case 'aggiorna':
    if ($carrello)
    {
    $acquisto = '';
    foreach ($_POST as $key=>$value)
    {
    if (@stristr($key,'quantita'))
    {
    $id = @str_replace('quantita','',$key);
    $prodotti = ($acquisto != '') ?
    @explode(',',$acquisto) : @explode(',',$carrello);
    $acquisto = '';

    foreach ($prodotti as $prodotto)
    {
    if ($id != $prodotto)
    {
    if ($acquisto != '')
    {
    $acquisto .= ','.$prodotto;
    }else{
    $acquisto = $prodotto;
    }
    }
    }

    for ($i=1;$i<=$value;$i++)
    {
    if ($acquisto != '')
    {
    $acquisto .= ','.$id;
    }else{
    $acquisto = $id;
    }
    }
    }
    }
    }
    $carrello = $acquisto;
    break;
    }
    }

    $_SESSION['carrello'] = $carrello;
    ?>

    -------------------------------------------------------------------------------

    Grazie di nuovo

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    125
    Grazie anche a te m4rko80,

    anche con il tuo metodo, continua comunque a non sommare i prezzi ivati dei prodotti inseriti nel carrello; rimane sempre e comunque il primo che è stato messo.

    Sembra che il ciclo faccia un solo giro, anche se i prodotti nel carrello sono più di uno.

    HELP ME PLEASE!!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    ma... hai verificato cmq che la variabile su cui cicli contenga davvero tutti i prodotti e non solo il primo, a questo punto (se hai applicato le modifiche che ti sono già state indicate, ovviamente!)? Stampa a video il suo contenuto...

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    125
    eiyen il problema è proprio questo.
    Le modifiche l'ho applicate e se la stampo a video visualizzo solo il prezzo ivato del primo prodotto inserito nel carrello.
    Quindi è probabilmente come dici tu: cioè il ciclo gira una sola volta.
    Quello che mi chiedo io però, e torniamo al punto di partenza, perchè se ho 3 prodotti inseriti nel carrello e stampo a video la variabile di sessione $carrello, mi stampa esattamente i tre ID dei prodotti, mentre sui record della tabella prodotti si ferma al prezzo del primo prodotto messo nel carrello????

  8. #8
    Utente di HTML.it L'avatar di m4rko80
    Registrato dal
    Aug 2008
    residenza
    Milano
    Messaggi
    2,655
    Ci sarà un errore nelle query forse che non vediamo perche' usi metodi tuoi tipo ->fetch()
    Controlla le query, se i dati estratti sono giusti dovrebbe essere tutto a posto

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    125
    Forse mi sbaglio, ma se ci fosse un errore sulla query non dovrebbe segnalarlo?

    Chiedo una cortesia, poichè credo che così non ne usciamo. Del resto mi rendo anche conto che è diffile per chi tenta di aiutare, farlo senza avere tutto il codice sott'occhio.

    Il carrello l'ho preso fatto da un sito. Posso postare il link o è contro le regole?

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    esegui la query da un pannello tipo phpmyadmin e controlla che ti restituisca tutti i record: se sì allora è sbagliato il fetching, se no è sbagliata la struttura tabellare o il processo di inserimento dei dati

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.