• User Newbie •

    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 9
    
    

    anche se è la prima volta che effettuo un acquisto.. come mai???


  • ModSenior •

    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.


  • User Newbie •

    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..


  • ModSenior •

    [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.


  • User Newbie •

    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


  • ModSenior •

    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.


  • User Newbie •

    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??


  • ModSenior •

    Hai spostato l'include come ti ho indicato sopra?


  • User Newbie •

    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


  • ModSenior •

    Hai provato a serializzare l'oggetto prima di metterlo in una variabile di sessione?


  • User Newbie •

    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?


  • ModSenior •

    Teoricamente in quel modo dovrebbe funzionare, io ho anche provato in locale e non ho problemi a fare quello che fai tu.
    È abbastanza strano...


  • User Newbie •

    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??