Eliminazione prodotto carrello

  • Creatore Discussione Creatore Discussione navajo75
  • Data di inizio Data di inizio

navajo75

Utente Attivo
16 Mar 2012
103
1
18
Buongiorno,

da questo link ho preso un carrello in php ed ho cercato di aggiustarlo alle mie esigenze.
Si è creato un problema che non riesco a risolvere e che mi impedisce di consegnare il sito al cliente.
Praticamente, quando elimino un prodotto dal carrello, questo visivamente sparisce, però quando si termina la procedura di checkout, il prodotto tolto va comunque a finire negli ordini all'interno del mio DB.
Questo accade perchè, prevedendo che gli utenti possano acquistare più di un prodotto, ho avuto la necessità di memorizzare le informazoni dei vari prodotti scelti in un array che sia anche una variabile di sessione e che qui di seguito riporto:

PHP:
if (!isset($_SESSION['prodotti'])) $_SESSION['prodotti'] = array();
	  $prodotti = $_SESSION['prodotti'];
	  $prodotto = array('nomecart' => $f['nome'],
					  'colorecostine' => $_POST['colorecostine'],
					  'colorecarta' => $_POST['colorecarta'],
	                  'colorestampa' => $_POST['colorestampa'],
					  'carattere' => $_POST['carattere'],
					  'quantita' => $_POST['quantita'],
					  'quantita_arch' => $_POST['quantita_arch'],
					  'quantita_21297' => $_POST['quantita_21297'],
					  'quantita_1521' => $_POST['quantita_1521'],
					  'titolo' => $_POST['titolo'], 	
					  'caratteretitolo' => $_POST['caratteretitolo'],
					  'sottotitolo' => $_POST['sottotitolo'],
					  'caratteresottotitolo' => $_POST['caratteresottotitolo'],
					  'indirizzocart' => $_POST['indirizzocart'],
					  'carattereindirizzocart' => $_POST['carattereindirizzocart'],
					  'telfaxcell' => $_POST['telfaxcell'],
					  'caratteretelfaxcell' => $_POST['caratteretelfaxcell'], 
					  'emailsito' => $_POST['emailsito'], 
					  'carattereemailsito' => $_POST['carattereemailsito'], 
					  'subtotaleco' => $f['prezzo'],
					  'modello' => $_POST['modello'],
					  'layout' => $_POST['layout']);
	  $prodotti[] = $prodotto; 
      $_SESSION['prodotti'] = $prodotti;

Deve esistere una maniera che mi consenta di eliminare il prodotto che non voglio più acquistare e nello stesso tempo far in modo che ciò che la sessione ha mantenuto in memoria, per quel prodotto stesso, venga cancellato; non riesco a farlo ed è molto tempo che ci sto sbattendo la testa.

Per dovere di onestà, vi dico che già avevo postato qualche mese fa e che Alessandro mi aveva offerto un altro tipo di carrello come soluzione alternativa. Ho provato ad implementarlo, ma con scarsissimo successo.
So che non dovrei aprire un nuovo thread per un argomento già trattato, ma credetemi che ho bisogno di risolvere.

Chiedendo dunque scusa a tutti, soprattutto ad Alessandro, spero che qualcuno possa aiutarmi ad uscire da questo pantano.

Saluti a tutti,
Marco
 
Ciao,
potresti provare cosi

salvi il prodotto in sessione in questo modo
PHP:
<?php

$prodotto = array(
    'nomecart' => $f['nome'],
    'colorecostine' => $_POST['colorecostine'],
    'colorecarta' => $_POST['colorecarta'],
    'colorestampa' => $_POST['colorestampa'],
    'carattere' => $_POST['carattere'],
    'quantita' => $_POST['quantita'],
    'quantita_arch' => $_POST['quantita_arch'],
    'quantita_21297' => $_POST['quantita_21297'],
    'quantita_1521' => $_POST['quantita_1521'],
    'titolo' => $_POST['titolo'],
    'caratteretitolo' => $_POST['caratteretitolo'],
    'sottotitolo' => $_POST['sottotitolo'],
    'caratteresottotitolo' => $_POST['caratteresottotitolo'],
    'indirizzocart' => $_POST['indirizzocart'],
    'carattereindirizzocart' => $_POST['carattereindirizzocart'],
    'telfaxcell' => $_POST['telfaxcell'],
    'caratteretelfaxcell' => $_POST['caratteretelfaxcell'],
    'emailsito' => $_POST['emailsito'],
    'carattereemailsito' => $_POST['carattereemailsito'],
    'subtotaleco' => $f['prezzo'],
    'modello' => $_POST['modello'],
    'layout' => $_POST['layout']
);

$idProdotto = ""; // qui dovresti recuperare un id univoco del prodotto

$_SESSION['prodotti'][$idprodotto] = $prodotto;
?>

e poi puoi eliminarlo con

PHP:
unset($_SESSION['prodotti'][$idprodotto]);

Non ho testato, è solo un idea da provare
 
Innanzitutto grazie per la risposta.
Ho testato la tua soluzione e succede che se metto un prodotto nel carrello e poi lo elimino, non viene scritto nulla nel DB.
Se poi, rimanendo in sessione, ne metto due e ne cancello uno, nel DB si scrivono tre prodotti: il primo solitario che avevo cancellato e gli altri due.

PHP:
if (!isset($_SESSION['prodotti'])) 
$_SESSION['prodotti'] = array();       
$prodotti = $_SESSION['prodotti'];      
$prodotto = array('nomecart' => $f['nome'],                       
'colorecostine' => $_POST['colorecostine'],                       
'colorecarta' => $_POST['colorecarta'],                       
'colorestampa' => $_POST['colorestampa'],                      
'carattere' => $_POST['carattere'],                       
'quantita' => $_POST['quantita'],                       
'quantita_arch' => $_POST['quantita_arch'],                       
'quantita_21297' => $_POST['quantita_21297'],                      
'quantita_1521' => $_POST['quantita_1521'],                       
'titolo' => $_POST['titolo'],                           
'caratteretitolo' => $_POST['caratteretitolo'],                      
'sottotitolo' => $_POST['sottotitolo'],                       
'caratteresottotitolo' => $_POST['caratteresottotitolo'],                       
'indirizzocart' => $_POST['indirizzocart'],                       
'carattereindirizzocart' => $_POST['carattereindirizzocart'],                       
'telfaxcell' => $_POST['telfaxcell'],                       
'caratteretelfaxcell' => $_POST['caratteretelfaxcell'],                        
'emailsito' => $_POST['emailsito'],                        
'carattereemailsito' => $_POST['carattereemailsito'], 
'subtotaleco' => $f['prezzo'],                       
'modello' => $_POST['modello'],                       
'layout' => $_POST['layout']);       
$prodotti[$id_prodotto] = $prodotto;        
$_SESSION['prodotti'] = $prodotti;

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

Dove sto sbagliando?
Saluti,
Marco
 
non cosi:
PHP:
$prodotti[$id_prodotto] = $prodotto;        
$_SESSION['prodotti'] = $prodotti;
ma
PHP:
$_SESSION['prodotti']['$idProdotto'] = $prodotto;

metti var_dump[$_SESSION['prodotti'] da qualche parte per controllare la struttura dell'array SESSION
 
Ti prego di avere tanta pazienza con me 0:)
Allora... così è come ho fatto, dovrebbe essere giusto:

PHP:
if (!isset($_SESSION['prodotti'])) $_SESSION['prodotti'] = array();
	  $prodotti = $_SESSION['prodotti'];
	  $prodotto = array('nomecart' => $f['nome'],
					  'colorecostine' => $_POST['colorecostine'],
					  'colorecarta' => $_POST['colorecarta'],
	                                  'colorestampa' => $_POST['colorestampa'],
					  'carattere' => $_POST['carattere'],
					  'quantita' => $_POST['quantita'],
					  'quantita_arch' => $_POST['quantita_arch'],
					  'quantita_21297' => $_POST['quantita_21297'],
					  'quantita_1521' => $_POST['quantita_1521'],
					  'titolo' => $_POST['titolo'], 	
					  'caratteretitolo' => $_POST['caratteretitolo'],
					  'sottotitolo' => $_POST['sottotitolo'],
					  'caratteresottotitolo' => $_POST['caratteresottotitolo'],
					  'indirizzocart' => $_POST['indirizzocart'],
					  'carattereindirizzocart' => $_POST['carattereindirizzocart'],
					  'telfaxcell' => $_POST['telfaxcell'],
					  'caratteretelfaxcell' => $_POST['caratteretelfaxcell'], 
					  'emailsito' => $_POST['emailsito'], 
					  'carattereemailsito' => $_POST['carattereemailsito'], 
					  'subtotaleco' => $f['prezzo'],
					  'modello' => $_POST['modello'],
					  'layout' => $_POST['layout']);
      $_SESSION['prodotti']['$id_prodotto'] = $prodotto;

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

Succede che se metto due prodotti nel carrello e ne elimino uno, si scrive una sola riga del DB (quindi quello che voglio io).
Il problema questa volta però, c'è l'ho se metto tanti prodotti nel carrello e poi ne elimino uno o due o più, lasciandone sempre comunque più di uno; in questo caso sempre una sola riga di DB si scrive.

In allegato t'invio il var_dump che mi hai chiesto.

Saluti ed ancora grazie,
Marco
 

Allegati

  • VD.jpg
    VD.jpg
    28 KB · Visite: 390
colpa mia, togli gli apici a $idProdotto
da
PHP:
$_SESSION['prodotti']['$idProdotto'] = $prodotto;
a
PHP:
$_SESSION['prodotti'][$idProdotto] = $prodotto;

IdProdotto nel var_dump deve rappresentare un id univoco per il prodotto che dovrai recuperare sempre tramite $_POST
 
Rieccomi :cool:

ho tolto gli apici come tu mi hai detto e poi ho inserito nell'array di sessione l'ID del prodotto.

PHP:
if (!isset($_SESSION['prodotti'])) $_SESSION['prodotti'] = array();
	  $prodotti = $_SESSION['prodotti'];
	  $prodotto = array('nomecart' => $f['nome'],
	  				  'id_prodotto' => $f['id'],
					  'colorecostine' => $_POST['colorecostine'],
					  'colorecarta' => $_POST['colorecarta'],
	                                  'colorestampa' => $_POST['colorestampa'],
					  'carattere' => $_POST['carattere'],
					  'quantita' => $_POST['quantita'],
					  'quantita_arch' => $_POST['quantita_arch'],
					  'quantita_21297' => $_POST['quantita_21297'],
					  'quantita_1521' => $_POST['quantita_1521'],
					  'titolo' => $_POST['titolo'], 	
					  'caratteretitolo' => $_POST['caratteretitolo'],
					  'sottotitolo' => $_POST['sottotitolo'],
					  'caratteresottotitolo' => $_POST['caratteresottotitolo'],
					  'indirizzocart' => $_POST['indirizzocart'],
					  'carattereindirizzocart' => $_POST['carattereindirizzocart'],
					  'telfaxcell' => $_POST['telfaxcell'],
					  'caratteretelfaxcell' => $_POST['caratteretelfaxcell'], 
					  'emailsito' => $_POST['emailsito'], 
					  'carattereemailsito' => $_POST['carattereemailsito'], 
					  'subtotaleco' => $f['prezzo'],
					  'modello' => $_POST['modello'],
					  'layout' => $_POST['layout']);
      $_SESSION['prodotti'][$id_prodotto] = $prodotto;

Così facendo però, ritorno al punto di partenza: mi inserisce cioè tutti i prodotti memorizzati nella sessione.
Se ne metto 5 e ne cancello 3, sempre 5 righe di DB mi scrive.
Ti allego un altro var_dump, per mostrarti che la variabile $id_prodotto è un valore univoco.
Dove sto sbagliando?

Saluti,
Marco
 

Allegati

  • VD2.jpg
    VD2.jpg
    83,7 KB · Visite: 344
Ah scordavo!
Anche senza aggiungere questa riga,

PHP:
'id_prodotto' => $f['id'],

comunque scrive nel DB tutti i prodotti memorizzati nella variabile di sessione.
 
Ah scordavo!
Anche senza aggiungere questa riga,
Si non serve

il vard_dump mi sembra corretto
hai
[6] => arrary(descrizione)
[19] => arrary(descrizione)
etc
quindi con questa istruzione
PHP:
unset($_SESSION['prodotti'][19];
Dovresti riuscire a eliminare solo la descrizione di quel prodotto

Sei sicuro che quando scrivi
PHP:
case 'cancella': 
          unset($_SESSION['prodotti'][$id_prodotto]);
$id_prodotto sia valorizzato correttamente?
 
Non sono sicuro che sia valorizzato correttamente.
Purtroppo ora devo andare al lavoro. Se dovessi avere tempo, farò delle prove da là, altrimenti ti faccio sapere domani mattina.
Per il momento grazie per la consueta pazienza e disponibilità

Saluti,
Marco
 
Ciao,

ho effettuato la seguente prova:
ho inserito $id_prodotto nell'array/variabile di sessione.

PHP:
'id_prodotto' => $f['id'],

Quest'array sta in una pagina, che contiene un form, la cui action invia a :

PHP:
echo "carrello.php?action=aggiungi&id=$id_prodotto";

Nella pagina carrello.php c'è la funzioncina che cancella i prodotti dal carrello e nella quale inserisco:

PHP:
unset($_SESSION['prodotti'][$id_prodotto]);

In questa stessa pagina ho provato a fare un var_dump della variabile di sessione

PHP:
var_dump($_SESSION['prodotti']);

e come puoi vedere dall'allegato ho messo tre prodotti, ciascuno dei quali con il suo ID univico.
Quindi, per quel poco che ne capisco, mi pare d'intendere che nella pagina carrello.php la variabile $id_prodotto si valorrizzi correttamente.
Tuttavia, ho provato ad eliminare due di que tre prodotti ed a procedere con la procedura di checkout, terminata la quale comunque vengono scritte tre righe di DB.

Non so più che pensare. Hai qualche altro suggerimento/prova da potermi far fare.

Saluti,
Marco
 

Allegati

  • VD3.jpg
    VD3.jpg
    84,7 KB · Visite: 330
Per completezza, aggiungo anche la funzione che mostra il carrello

PHP:
function mostraCarrello()
{
  global $db;
  $carrello = $_SESSION['carrello'];
  $somma = 0;
  if ($carrello)
  {
    $prodotti = @explode(',',$carrello);
    $acquisti = array();
    foreach ($prodotti as $prodotto)
    {
      $acquisti[$prodotto] = (@isset($acquisti[$prodotto])) ? $acquisti[$prodotto] + 1 : 1;
    }
    $result[] = '<form action="carrello.php?action=aggiorna" method="post" id="cart">';
    $result[] = '<table id="tabella_carrello">';
	$result[] = '<tr>';
	  $result[] = '<td class="td_header_carrello">Nome</td>';
	  $result[] = '<td class="td_header_carrello">Modello</td>';
	  $result[] = '<td class="td_header_carrello">Quantità</td>';
	  $result[] = '<td class="td_header_carrello">Prezzo</td>';
	  $result[] = '<td class="td_header_carrello">Subtotale</td>';
	  $result[] = '<td>&nbsp;</td>';
	  $result[] = '</tr>';

    foreach ($acquisti as $id=>$quanti)
    {
	  $sql = "SELECT * FROM prodotti WHERE id = '$id'";
      $res = $db->query($sql);
      $f = $res->fetch();
      @extract($f);
	  $quantita = $f['quantita'];
	  $modello = $f['modello'];
	  $result[] = '<tr>';
	  $result[] = '<td class="td_entry_carrello">'.$nome.'</td>';
	  $result[] = '<td class="td_entry_carrello">'.$modello.'</td>';
	  $result[] = '<td class="td_entry_carrello">'.$quantita.'</td>';
	  $result[] = '<td class="td_entry_carrello">&euro;&nbsp;'.$prezzo.'</td>';
	  $result[] = '<td class="td_entry_carrello">&euro;&nbsp;'.($prezzo * $quanti).'</td>';
	  $result[] = '<td align="center" class="td_entry_carrello"><a href="carrello.php?action=cancella&id='.$id.'" title="Elimina il prodotto dal carrello"><img src="img/carrello_img/elimina_prodotto.png" border="0"/></a></td>';
	  $result[] = '</tr>';
      $somma += $prezzo * $quanti;
    }

      $result[] = '</table></br>';
	  $iva = $somma * 21 / 100;
	  $totale = $somma + $iva;
	  $result[] = '<table id="tabella_conti">';
	  $result[] = '<tr>';
	  $result[] = '<td class="td_header_conti">Subtotale</td>';
	  $result[] = '<td class="td_entry_conti">&euro;&nbsp;'.$somma.'</td>';
	  $result[] = '</tr>';
	  $result[] = '<tr>';
	  $result[] = '<td class="td_header_conti">Iva</td>';
	  $result[] = '<td class="td_entry_conti">&euro;&nbsp;'.$iva.'</td>';
	  $result[] = '</tr>';
	  $result[] = '<tr>';
	  $result[] = '<td class="td_header_conti">Totale</td>';
	  $result[] = '<td class="td_entry_conti">&euro;&nbsp;'.$totale.'</td>';
	  $result[] = '</tr>';
	  $result[] = '</table>';
      $result[] = '</form>';
    }else{
      $result[] = '<div id="icona_attenzione"></div>';
	  $result[] = '<div id="carrello_vuoto">Nessun prodotto inserito nel carrello</div>';
	  $result[] = '<div id="divider_carrello"></div>';
    }
  return @join('',$result);
}
 
Sono tre giorni che ci sto provando in tutti i modi e non ne vengo a capo.
Qualcuno che possa aiutarmi per favore?

Saluti,
Marco
 
In questa stessa pagina ho provato a fare un var_dump della variabile di sessione
io intendevo un var_dump di $id_prodotto prima di
PHP:
unset($_SESSION['prodotti'][$id_prodotto]);
per vedere se $id_prodotto esiste ed è realmente l'id che vuoi eliminare dalla sessione
 
Scusami, ma come ti ho già scritto... con me ci vuole TANTA TANTA pazienza :p; sono alle primissime armi e siccome non lo faccio per mestiere non ho neppure molto tempo a disposizione per studiare.
Spero di aver capito questa volta cosa mi chiedevi di fare:

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

Se si tratta di questo, il var_dump mi butta fuori NULL; altrimenti ti chiedo (ennesima cortesia) di spiegarmi meglio ciò che intendevi.

Mille grazie,
Marco
 
prova cosi
PHP:
case 'cancella': 
          var_dump ($id_prodotto);

se ti restituisce sempre NULL vuol dire che in quella pagina $id_prodotto non è valorizzato

forse l'id prodotto lo hai in $_GET['id']

se si devi modificare l'unset in questo modo

PHP:
unset($_SESSION['prodotti'][$_GET['id']]);

ma non ho la sfera di cristallo e non posso sapere dove puoi aver messo l'id del prodotto
 
Grande Ciric... quasi più del caitano e non ti dico chi è, altrimenti c'è il rischio che in futuro non mi aiuti più :)
Ho fatto il var_dump come suggerito da te e la variabile $id_prodotto non si valorizzava.
Allora ho messo il GET nell'unset, sempre come suggerito da te, ed ora va tutto una meraviglia.

Grazie di cuore.
Marco
 

Discussioni simili