Dubbi e problemi gestione sessioni

GHoldenBoy

Nuovo Utente
24 Giu 2011
5
0
0
Ciao,
mi sono approcciato al PHP da poco comunque sto cercando di scrivere un portale di e-commerce in PHP e HTML che lavora in locale con base dati MySQL collegato all'ERP AbanQ. Il mio approccio è stato, html per le pagine (mostrare immagini, informazioni..) e php per gestire le varie funzioni delle pagine (si fa così, no?).
Ho due problemi fondamentali che riguardano entrambi l'utilizzo delle variabili di sessione: il carrello e il sistema di login.
Gli ho implementati entrambi ma appena cambio pagina perdo tutti i dati che avevo salvato nella prima.

Spiego con un po' più di dettaglio il problema del carrello che penso quando avrò risolto questo il comportamento da usare nel login sarà esattamente identico:
- carrello.php rappresenta il concetto di carrello, con la possibilità di aggiungere/togliere articoli (costruito anche grazie alla guida su questo sito!)
- carico i prodotti presenti su una base dati MySql. Il cliente può selezionare il prodotto che desidera e verrà indirizzato ad una pagina html con le caratteristiche del prodotto che contiene un form per l'aggiunta di una determinata quantità di prodotto nel carrello
- cesta.html dovrebbe mostrare i contenuti del carrello
Per intenderci:
Prodotti [.html] --> Pagina delle specifiche prodotto con Form [.html] --> form [.php] --> stampaCarrello [.html]

Ho letto molto sull'argomento, ma non riesco ancora a capire dove è carente ciò che ho programmato. Qualche consiglio?
Dubbi amletici:
1) La funzione session_start() va eseguita anche se non sono necessari i dati all'interno della pagina html?
2) Sbaglio perchè sto usando troppo html (non so, è davvero poco che programmo con php, magari alcune funzioni non sono supportate in html)? Devo rifare tutto con estension php?
3) Sto lavorando in locale, c'è qualcosa che devo cambiare nelle impostazioni del file php.ini??
4) Perchè sono sbagliati i pezzi commentati in cesta.html? (vedi codice che segue)
5) è un errore creare un nuovo elemento carrello nel php? credo che lì dovrei aggiungere un controllo..

Inserisco un po' di codice per farvi capire meglio:
* specificheProdotto.html (solo parte col form):
HTML:
<!--- parte grafica --->
 <FORM action="aggCamDom.php" method="post">            
 <font size="3pt">PRECIO: 1200 euro </font><br/> 			 
 <font size="3pt">Número de unidades </font> 			  
<input type="text" name="cantidad" size="20"><BR>  			 
 <INPUT type="submit" value="Anadir a la cesta"><BR></p>         
</FORM>

aggCamDom.php
PHP:
<?php
    session_start();
    include("carrello.php");
    $cart = new carrello();
    $cantidad= $_POST['cantidad'];
    $cart->add("PR00",$cantidad,0,1200);
    $_SESSION["carrello"]= $cart;
    include('cesta.html');
?>

Cesta.html
HTML:
<?php session_start(); ?>

<!------ vario per implementare interfaccia HTML --------->

 <?php
//Qui se metto:
// import("carrello.php"); $cesta= new carrello();
//mi da errore (mi dice che non posso richiamare carrello.php) ma pensavo si dovesse fare così!
     $cesta= $_SESSION['carrello']; 
        $cesta->printcart();
 ?>

Se eseguo queste istruzioni pari pari mi appare su cesta.html il contenuto del carrello che deve avere.. Se poi però mi metto a navigare e quindi dalla pagina cesta.htlm passo, non so, nuovamente all'index.html ritornando a cesta.html mi da quest'errore:


Codice:
Fatal error: main() [function.main]: The script tried to execute a method or access a property of an incomplete object. 
Please ensure that the class definition "carrello" of the object you are trying to operate on was loaded _before_ unserialize() gets called or 
provide a __autoload() function to load the class definition in C:\Portale\wamp\www\segurafinal\cesta.html on line 25
 
Ultima modifica:
1) La session_start() devi invocare soltanto nei file dove intendi usare le variabili di sessione.
2) Non ho capito cosa intandi con usare troppo html.
3) A prima vista non c'è niente che dovresti cambiare nel file php.ini. Però ho notato che usi il codice php nei file .html e questo deve essere specificato nella configurazione del server web in modo che interpreti il codice php.
4) Visto che nel aggCamDom.php includi carrello.php e poi includi anche Cesta.html. Nel Cesta.html includi nuovamente carrello.php. Alla fine il file carrello.php sarà incluso due volte e se questo file contiene delle dichiarazioni ci sarà errore della ridichiarazione delle funzioni o classi. Usa include_once.
5) Non è un errore creare nuovo elemento carrello nel php se questo carrello è stato precedentemente dichiarato.
 
ho provato a modificare qualcosa ma sono ancora più confuso!! Ho pensato che era possibile gestire la stampa del carrello non da cesta.html ma con un altra funzione in .php e ho pensato di modificare i php dei form per l'aggiunta del preciso prodotto al carrello per effettuare un miglior controllo:

*aggiungiProdotto.php
PHP:
<?php
	session_start();
//controllo se già esiste un carrello
	if(isset($_SESSION["carrello"])){
                print_r($_SESSION["carrello"]);
		include("cart.php");
		$cest = new cart();
//esiste quindi modifico il carrello esistente
		$cest= $_SESSION["carrello"];
		$cantidad= $_POST['cantidad'];
		$cest->add("SE00",1,0,50);
		$_SESSION["carrello"]= $cest;
		include('cesta.html');
	}else{
//non esiste, creo un nuovo carrello
		include("cart.php");
		$cest = new cart();
		$cantidad= $_POST['cantidad'];
		$cest->add("SE00",1,0,50);
		$_SESSION["carrello"]= $cest;
		include('cesta.html'); 
	}
?>

stampaCest.php inclusa in cesta.html
PHP:
<?php 
session_start();
if(isset($_SESSION["carrello"])){
	include_once("cart.php");
	$cest = new cart();
	$cest= $_SESSION["carrello"]; 
	$cest->printcart();
} else {
		echo "carrello vuoto!"; }
?>

Con queste modifiche, non mi stampa più nemmeno il primo carrello, non mi aggiunge proprio i prodotti.. Perchè?
Il print_r($_SESSION["carrello"]) in aggiungiProd.php dopo il controllo dell'esistenza del carrello mi da come risultato:
Codice:
__PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => cart [id] => Array ( [0] => PR01 ) [qt] => Array ( [0] => 5 ) [vt] => Array ( [0] => 0 ) [precio] => Array ( [0] => 70 ) ) 

Fatal error: main() [function.main]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "cart" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in C:\Portale\wamp\www\segurafinal\aggCamEst.php on line 9

anche se è la prima volta che effettuo un acquisto.. come mai???
 
Prima di usare il carrello contenuto nella variabile della sessione $_SESSION['carrello'] la classe del carrello deve essere già dichiarata nel file. Quindi prima di utilizzare il carrello includi il file con la definizione della classe carrello.
 
Ho modificato così l'aggiunta dei prodotti:
PHP:
<?php
	session_start();
	include_once("cart.php");
	if(isset($_SESSION["carrello"])){
		$cart = new cart();
		$cart= $_SESSION["carrello"];
		$cantidad= $_POST['cantidad'];
		$cart->add("PR00",$cantidad,0,1200);
		$_SESSION["carrello"]= $cart;
		include('cesta.html');
	}else{
		$cart = new cart();
		$cantidad= $_POST['cantidad'];
		$cart->add("PR00",$cantidad,0,1200);
		$_SESSION["carrello"]= $cart;
		include('cesta.html'); 
	}
?>
questo per ogni tipo di prodotto che si può inserire

il session_start() va inserito anche nelle pagine html in cui ci sono i vari "include()" dei file php?? Ho provato sia con che senza ma non mi da importanti svolte!!


p.s. grazie dreamer86 per lo sbattimento!
 
Basta che prima di usare le variabili della sessione la sessione è stata creata con session_start(). In teoria cercare di aprire due volte la sessione nello stesso file (quindi compreso anche le sue inclusioni) crea un errore a livello di notifica. Una buona norma sarebbe creare un file separato dove invochi la funzione session_start() e poi la includi con include_once oppure require_once nei file che hanno bisogno. In questo modo eviti che la funzione session_start() viene invocata sia direttamente nel file sia nelle sue inclusioni.
 
Penso di aver individuato la fonte di problema! Se seguo l'iter normale di vendita quindi:
Pagina con dettagli --> Form per la quantita --> Cesta riassuntiva
mi da la tabella che mi deve stampare. Ho messo un messaggio di stampa del carrello (print_r($_SESSION["carrello"]);) prima della stampa dei prodotti se il carrello risultava con alcuni oggetti. Il risultato è:

cart Object ( [id] => Array ( [0] => PR00 ) [qt] => Array ( [0] => 3 ) [vt] => Array ( [0] => 0 ) [precio] => Array ( [0] => 1200 ) )

Se subito dopo riclicco sul bottone che mi dovrebbe riportare alla stessa pagina html (la solita cesta) ottengo come risultato:

__PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => cart [id] => Array ( [0] => PR00 ) [qt] => Array ( [0] => ) [vt] => Array ( [0] => 0 ) [precio] => Array ( [0] => 1200 ) )

e un bel messaggio d'errore

Fatal error: main() [function.main]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "cart" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in C:\Portale\wamp\www\segurafinal\stampCarr.php on line 8


il problema è quindi che lui si ricorda le caratteristiche del'oggetto, ma non ricorda che è un elemento della classe cart.php!!

Può essere questa la fonte di tutto il problema?? consigli per risolverlo??
 
Errore fatale è causato del fatto che stai usando un oggetto prima che è stata dichiarata la classe in quel file. Oggetto derivato dal esterno (nel tuo caso dalla variabile di sessione) contiene tutte le informazioni delle sue proprietà ma per eseguire i metodi di quel oggetto serve dichiarazione della classe. Assicurati che nel file stampCarr.php in quelche ramo if non arrivi a usare il carrello senza prima aver invocato include sul file contenente la dichiarazione della classe carrello.
 

Discussioni simili