Eliminare un prodotto dal carrello

Ciao a tutti, sto impazzendo da ore a capire come fare ad eliminare un articolo dal carrello creato tramite le sessioni. In pratica ho creato il tutto tramite questo script:

session_start();

if (!session_is_registered("carrello"))
{
$carrello = array(); // variabile per il carrello
session_register("carrello");

}

All' interno di un ciclo for stampo a video tutti gli articoli e per ognuno di essi vi è un link che vorrei servisse per eliminare l'articolo che ha come identificativo un valore che passo tramite il metodo GET. Il link è il seguente:

<a href="elimina_articolo.php?indice=<?php echo $i ?>">Elimina</a>

Una volta cliccato sul seguente link dovrebbe attivarsi questo script:

if($_GET)
{

unset($carrello[$_GET['indice']]);
}

Ora il problema che riscontro è il seguente:

Se elimino gli articoli dal basso verso l'alto non ho nessun problema, ma se li elimino dall'alto verso il basso o comunque inizio almeno dal penultimo articolo, non me li cancella, o meglio, il valore me lo cancella ma comunque mi rimane  il record vuoto che risulta essere presente nella sessione, infatti facendo count($carrello), il numero non viene decrementato. Non riesco a capire come mai.

inviato 6 anni fa
MGbyte78
modificato 6 anni fa
Mario Santagiuliana
X 0 X

Non hai capito l'uso delle sessioni.

Per eliminare un qualcosa dalla sessione vedi un esempio come questo:

http://www.php.net/manual/en/function.unset.php#50382

Se elimino gli articoli dal basso verso l'alto

Non ci è di aiuto sapere questa cosa...non conosciamo la struttura del tuo script.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Si infatti non mi sono spiegato bene, cercherò di farlo meglio. Ho un array $carrello dove ho memorizzato tutti gli articoli. Se voglio eliminare un articolo all' interno di questo array utilizzo la stringa:

unset($carrello[$_GET['indice']]);

dove per indice intendo il valore passato da un link inerente all' articolo che voglio cancellare.

Quello che ho notato è questo: Se ho memorizzato nell'array ad esempio due elementi (o due articoli) e cancello il primo con indice "0" mi cancella il primo elemento mentre il secondo me lo svuota (senza che glielo chieda), se cancello prima l'elemento con indice "1" e poi quello con indice "0" funziona tutto bene. Insomma sono vincolato a cancellare gli articoli dall 'indice più alto al più basso ma ciò non è funzionale perchè potrei essere interessato a cancellare solo il primo articolo.

Se uso la funzione $carrello[$_GET['indice']]=array() funziona bene ma me li svuota solamente gli elementi, potrei in questo caso fare un ciclo con un controllo e contare solo gli elementi "pieni" e tenere conto solo di questi, però mi chiedo , è possibile che devo usare questo escamotage e non poter eliminare semplicemente gli articoli senza problemi con la funzione unset?

Non so se sono stato chiaro, in caso contrario inserisco tutto il codice della pagina.

risposto 6 anni fa
MGbyte78
modificato 6 anni fa
X 0 X

Adesso ti sei spiegato.

Prova a vedere questo commento:

http://www.php.net/manual/en/function.unset.php#89881

P.S. ti consiglio di leggere bene la documentazione ufficiale e anche i commenti, in questi casi spesso già esiste una soluzione, basta valutarla ed adattarla ai propri script.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Secondo me dovresti cambiare approccio.

Dovresti usare la variabile $_SESSION (come consigliato dal manuale).

Nel tuo caso, usa $_SESSION['carrello'] ed evita session_is_registered() e session_register()

Per eliminare un elemento: unset($_SESSION['carrello'][$id])

risposto 6 anni fa
Massimiliano Arione
X 0 X

Perchè? Che problemi potrei avere con session_is_registered ?

Comunque ho risolto, in pratica quando elimino un elemento dall 'array devo poi reindicizzare il tutto con la funzione array_values.

risposto 6 anni fa
MGbyte78
X 0 X

Perchè? Che problemi potrei avere con session_is_registered ?

Comunque ho risolto, in pratica quando elimino un elemento dall 'array devo poi reindicizzare il tutto con la funzione array_values.

Come ti ho detto, ti rimando al manuale per le funzioni.

Piuttosto, credo che ti converrebbe usare come chiave dell'array del carrello gli id dei prodotti.

risposto 6 anni fa
Massimiliano Arione
X 0 X

Ma infatti uso già l'id degli array passati tramite il metodo get.

risposto 6 anni fa
MGbyte78
X 0 X
Ma infatti uso già l'id degli array passati tramite il metodo get.

Io non ti ho detto questo: ti ho detto di usare gli id degli oggetti come chiavi.

Ora tu non stai usando chiavi (ovvero stai usando le chiavi automatiche, quelle che partono da 0).

Io ti sto dicendo di usare come chiave un id (immaginando che gli oggetti che stai inserendo in questo carrello abbiamo degli id, con cui li hai memorizzati sul database). In questo modo dovresti evitare i problemi che hai.

risposto 6 anni fa
Massimiliano Arione
X 0 X

Ma veramente ora funziona tutto alla grande, anche perchè grazie alla funzione array_values anche se uso gli indici che partono da zero non mi da nessun problema, piuttosto grazie per la dritta dell' usare $_SESSION, ho ascoltato il tuo consiglio.

Ciao

risposto 6 anni fa
MGbyte78
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda