- Home
- Categorie
- Coding e Sistemistica
- Coding
- Dubbi e problemi gestione sessioni
-
Dubbi e problemi gestione sessioni
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
- 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:- La funzione session_start() va eseguita anche se non sono necessari i dati all'interno della pagina html?
- 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?
- Sto lavorando in locale, c'è qualcosa che devo cambiare nelle impostazioni del file php.ini??
- Perchè sono sbagliati i pezzi commentati in cesta.html? (vedi codice che segue)
- è 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:
*caratteristicheProdotto.html
[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>[/html]- 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');
?>[/php]
*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(); ?>[/html]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:
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
-
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');
}
?>
[/PHP]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!"; }
?>
[/PHP]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:__PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => cart [id] => Array ( [0] => PR01 ) => Array ( [0] => 5 ) => 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 9anche se è la prima volta che effettuo un acquisto.. come mai???
-
Ciao GHoldenBoy,
questa cosa non ha senso:
[php]
$cest = new cart();
//esiste quindi modifico il carrello esistente
$cest= $_SESSION["carrello"];
$cest->add("SE00",1,0,50);
[/php]
Se $cest è un istanza, non puoi fare $cest = una variabile, distruggeresti l'istanza.
-
ma in teoria dentro $_SESSION["carrello"] non ho un elemento di tipo carrello?? io volevo recuperare i dati di QUEL carrello, aggiungerci i prodotti, e aggiornarlo nuovamente alla fine con $_SESSION["carrello"]=$cart ..
ci deve essere qualcosa che non ho capito bene..
-
[php]
$cest = new cart();
$cest= $_SESSION["carrello"];
$cest->printcart();
[/php]
Allora la prima riga puoi tranquillamente toglierla, non ha senso creare un istanza per poi sostituirla subito.
Dall'errore sembra manchi la definizione della classe, cioè tu fai:
[php]
$cest= $_SESSION["carrello"];
[/php]Ma prima di fare questo devi avere:
[php]
class cart
{
.....
}
[/php]
Se manca ottieni quell'errore.
-
Ah ok, non devo creare un istanza della classe per poterci passare il valore (il mio era un approccio molto Java)!!
La classe del carrello non dovrebbe essere nell' include_once("cart.php");
Ora modifico qualcosa e tengo aggiornato il post!
Grazie per l'interessamento
-
Se la definizione della classe è in include_once("cart.php"); prova a spostare l'include in modo venga incluso prima di session_start.
EDIT: Altrimenti puoi serializzare l'oggetto prima di salvarlo nella sessione.
-
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 ) => Array ( [0] => 3 ) => 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 ) => Array ( [0] => ) => 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??
-
Hai spostato l'include come ti ho indicato sopra?
-
sisi.. la chiamata aggiungiProdotto è così:
[php]
<?php
include_once("cart.php");
include_once("startSess.php");
//necessario sennò non riconosce il metodo add
$cart= new cart();
//questo non me lo stampa mai!
if (isset($_SESSIO["carrello"])) echo "carrello riconosciuto";
$cantidad= $_POST['cantidad'];
$cart->add("PR00",$cantidad,0,1200);
$_SESSION["carrello"]= $cart;
include('cesta.html');?>
[/php]e la stampaCarrello.pho inclusa in cesta.html è
[php]
<?php
include_once("cart.php");
include_once("startSess.php");
$cest= new cart();
if(isset($_SESSION["carrello"])){
print_r($_SESSION["carrello"]);
print_r($_SESSION["carrello"]);
$cest= $_SESSION["carrello"];
$cest->printcart();
} else {
$cest->printcart(); }
?>
[/php]ed è questa che stampa l'errore che riferivo
-
Hai provato a serializzare l'oggetto prima di metterlo in una variabile di sessione?
-
se con serializzare intendi fare serialize() sul dato prima di inserirlo e su unserialize() sul $_SESSION si si ci ho provato ma non va..
Esistono altri modi?
-
Teoricamente in quel modo dovrebbe funzionare, io ho anche provato in locale e non ho problemi a fare quello che fai tu.
È abbastanza strano...
-
anche io sto lavorando in locale ed è così che deve funzionare il mio portale per l'esame!
Io sto utilizzando WAMP server con Apache, MySQL e PHP, mi sembra che tutto mi funzioni a parte questo della gestione delle sessioni!!
Non so cosa può essere, devo fare delle modifiche ai file dei programmi (httpd.conf, php.ini, my.ini) ???Io la seriazizzazione l'avevo fatta così:
caricaprodotto.php
[php]
<?php
include_once("cart.php");
session_start();
$cart= new cart();
//questo non me lo stampa mai!
if (isset($_SESSION["carrello"])) {
$cart= unserialize($_SESSION["carrello"]);
$cart->add("PR00",$cantidad,0,1200);
$resul= serialize($cart);
$_SESSION["carrello"]= $resul;
}else{
$cantidad= $_POST['cantidad'];
$cart->add("PR00",$cantidad,0,1200);
$resul= serialize($cart);
$_SESSION["carrello"]= $resul; }
include('cesta.html');?>
[/php]stampacarello.php
[php]
<?php
include_once("cart.php");
include_once("startSess.php");
$cest= new cart();
if(isset($_SESSION["carrello"])){
print_r($_SESSION["carrello"]);
$cest= unserialize($_SESSION["carrello"]);
$cest->printcart();
} else {
$cest->printcart(); }
?>
[/php]ma ottengo come risultato*
( ! ) Warning: unserialize() expects parameter 1 to be string, object given in C:\Portale\wamp\www\segurafinal\aggCamDom.php on line 7! ) Fatal error: Call to a member function add() on a non-object in C:\Portale\wamp\www\segurafinal\aggCamDom.php on line 8
e non continua..* Ho sbagliato qualcosa io??