Newsgroup: it.comp.www.php
Titolo: semplice carrello in php

sto facendo degli esperimentini per creare un carrello elettronico ad 
uso mio personale.
Qualcuno potrebbe dirmi che è meglio fare tutto con qualcosa di già 
pronto o con qualche plugin ma 1) mi piaceva imparare qualcosa di nuovo 
2) non ho realmente trovato quello che faceva al mio caso.
Vi spiego cosa devo fare.
Ho bisogno di una semplicissima tabella in cui ci sono elencati dei 
prodotti, i prezzi, la quantità, descrizione, l'iva.
L'utente deve poter scegliere i prodotti ed aggiungerli al carrello.
Alla fine deve risultare il totale e ci dev'essere anche un pulsantino 
per inviare l'ordine (basta che parta una mail riepilogativa).
Allora sono riuscito a fare gran parte delle cose ma mi rimangono alcuni 
punti oscuri.
Non deridetemi perché non sono un programmatore php ma ho solo qualche 
conoscenza e ho fatto tutto in 2-3 giorni modificando un po' io da solo 
e spizzicando codice qua e là. Oltre mi rendo conto di non poterci 
andare a meno di non applicarmi allo studio ulteriormente.
Ho creato intanto una pagina html in cui ci sono nome, descrizione e 
prezzo in modo che venga una tabella formattata.
Il punto è che arrivato alla pagine del carrello con i prodotti elencati 
come faccio a mettere un pulsante che invii una mail memorizzando i dati 
selezionati? peraltro posso mettere un codice numerico di sicurezza da 
inserire per confermare l'ordine?
se però qualcuno mi dice che ciò si può fare tutto con qualche plugin 
già pronto in wordpress posso provare. Solo che quelli che ho visto io 
sono tremendamente più complessi di quello che devo fare io. Peraltro il 
carrello non devo usarlo propriamente io ma una persona abbastanza 
digiuna di computer.
 
se volete vi allego il codice nel caso vogliate sapere cosa ho fatto o 
nel caso qualcuno voglia fare qualcosa di simile (mi rendo conto che in 
certe parti è ridondante ma mi interessa il fine) :)
 
 
<?php
$host = 'xxx';
$user = 'xxx';
$password = 'xxx';
$database = 'xxx';
 
         $db = mysql_connect($host, $user, $password) or die 
("impossibile connettersi al server");
 
         mysql_select_db($database, $db) or die ("impossibile 
connettersi al database");
 
$sql="INSERT INTO prodotti (nome, descrizione, prezzo)
  VALUES
  ('$_POST[nome]','$_POST[descrizione]','$_POST[prezzo]')";
 
if (!mysql_query($sql,$db))
    {
    die('Error: ' . mysql_error());
    }
  echo "Hai aggiunto un prodotto al listino!";
 
mysql_close($db)
     ?>
 
 
"funzioni.php"
 
<?php
function usaCarrello()
{
   $carrello = $_SESSION['carrello'];
   if (!$carrello)
   {
     return 'Il carrello è vuoto.<br>';
   }else{
     $prodotti = @explode(',',$carrello);
     return 'Ci sono <a href="carrello.php">'.
     @count($prodotti). ' prodotti nel carrello.</a><br>';
   }
}
 
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>';
 
     foreach ($acquisti as $id=>$quantita)
     {
       $sql = 'SELECT * FROM prodotti WHERE id = '.$id;
       $res = $db->query($sql);
       $f = $res->fetch();
       @extract($f);
       $result[] = '<tr>';
       $result[] = '<td><a 
href="carrello.php?action=cancella&id='.$id.'">Cancella</a></td>';
       $result[] = '<td>'.$nome.' by '.$descrizione.'</td>';
       $result[] = '<td>&euro;'.$prezzo.'</td>';
       $result[] = '<td><input type="text" name="quantita'.$id.'" 
value="'.$quantita.'" size="3"></td>';
       $result[] = '<td>&euro;'.($prezzo * $quantita).'</td>';
       $somma += $prezzo * $quantita;
       $result[] = '</tr>';
     }
 
     $result[] = '</table>';
     $result[] = 'Totale: <b>&euro;'.$somma.'</b></br>';
     $result[] = '<button type="submit">Aggiorna il carrello</button>';
     $result[] = '</form>';
   }else{
     $result[] = 'Il carrello è vuoto.<br>';
   }
   return @join('',$result);
}
?>
 
"carrello.php"
 
<?php
@session_start();
@require('mysql.php');
@require('config.php');
@require('funzioni.php');
 
$carrello = $_SESSION['carrello'];
if(@isset($_GET['action']))
{
   $action = $_GET['action'];
 
   switch ($action)
   {
     case 'aggiungi':
     if ($carrello)
     {
       $carrello .= ','.$_GET['id'];
     }else{
       $carrello = $_GET['id'];
     }
     break;
 
     case 'cancella':
     if ($carrello)
     {
       $prodotti = @explode(',',$carrello);
       $acquisto = '';
       foreach ($prodotti as $prodotto)
       {
         if ($_GET['id'] != $prodotto)
         {
           if ($acquisto != '')
           {
             $acquisto .= ','.$prodotto;
           }else{
             $acquisto = $prodotto;
           }
         }
       }
       $carrello = $acquisto;
     }
     break;
 
     case 'aggiorna':
     if ($carrello)
     {
       $acquisto = '';
       foreach ($_POST as $key=>$value)
       {
         if (@stristr($key,'quantita'))
         {
           $id = @str_replace('quantita','',$key);
           $prodotti = ($acquisto != '') ?
           @explode(',',$acquisto) : @explode(',',$carrello);
           $acquisto = '';
 
           foreach ($prodotti as $prodotto)
           {
             if ($id != $prodotto)
             {
               if ($acquisto != '')
               {
                 $acquisto .= ','.$prodotto;
               }else{
                 $acquisto = $prodotto;
               }
             }
           }
 
           for ($i=1;$i<=$value;$i++)
           {
             if ($acquisto != '')
             {
               $acquisto .= ','.$id;
             }else{
               $acquisto = $id;
             }
           }
         }
       }
     }
     $carrello = $acquisto;
     break;
   }
}
 
$_SESSION['carrello'] = $carrello;
?>
 
<?php
class MySQL
{
   var $host;
   var $user;
   var $password;
   var $database;
   var $connessione;
   var $errore;
 
   function MySQL ($host,$user,$password,$database)
   {
     $this->host=$host;
     $this->user=$user;
     $this->password=$password;
     $this->errore=$database;
     $this->connessione();
   }
 
   function connessione()
   {
     if (!$this->connessione = @mysql_connect($this->host, $this->user, 
$this->password))
     {
       trigger_error('Impossibile connettersi a MySQL.');
       $this->errore=true;
     }
     elseif (!@mysql_select_db($this->errore,$this->connessione))
     {
       trigger_error('Impossibile connettersi al database.');
       $this->errore=true;
     }
   }
 
   function notifica_errore()
   {
     if ($this->errore) return true;
     $notifica=mysql_error($this->connessione);
     if (empty($notifica)) return false;
     else return true;
   }
 
   function query($sql)
   {
     if (!$qRes=mysql_query($sql,$this->connessione))
     trigger_error (
     'Query fallita: '.mysql_error($this->connessione).
     ' SQL: '.$sql);
     return new MySQLResult($this,$qRes);
   }
}
 
class MySQLResult
{
   var $mysql;
   var $query;
   function MySQLResult(& $mysql,$query)
   {
     $this->mysql=& $mysql;
     $this->query=$query;
   }
 
   function fetch()
   {
     if ($f=mysql_fetch_array($this->query,MYSQL_ASSOC))
     {
       return $f;
     }
     else if ($this->size() > 0)
     {
       mysql_data_seek($this->query,0);
       return false;
     }else{
       return false;
     }
   }
 
   function size()
   {
     return mysql_num_rows($this->query);
   }
 
   function insertID()
   {
     return mysql_insert_id($this->mysql->connessione);
   }
 
   function notifica_errore()
   {
     return $this->mysql->notifica_errore();
   }
}
?>
 
"config.php"
 
 
<?php
$host = 'xxx';
$user = 'xxx';
$password = 'xxx';
$data = 'xxx';
$db = &new MySQL($host,$user,$password,$data);
?>
 

Ciao,
come prima cosa non è chiaro se questa sarà una funzione di Backoffice (usata internamente) oppure dai singoli utenti: sembra più la prima ipotesi visto che parli del fatto che andrà usato da qualcuno che non sei tu e che è a digiuno di computer.
 
I carrelli che trovi in giro sono più orientati alla seconda ipotesi, fermo restando che tutto può essere adattato, ma secondo me per modificare un codice scritto da altri bisogna essere più competenti rispetto a fare tutto da zero (a meno che non vuoi cambiare solo i colori).
 
Inoltre scrivere tutto per conto proprio da più soddisfazione, e quando in futuro sarà necessario aggiungere qualcosa sarà più veloce capire dove mettere le mani.
 
Io farei tutto per conto mio, quindi continuerei quello che stai facendo.
 
Ho guardato il codice molto velocemente, quindi potrei dire una cazzata, ma mi sembra che mancano da gestire un po' di informazioni:
-questi ordini di chi sono? appartengono ad un solo cliente? o sono generali? nel primo caso devi memorizzare l'informazione del cliente
-ti interessa distinguere tra un ordine e l'altro? se butti tutto dentro una tabella non sai cosa era di un ordine e cosa di un altro se non ci associ un id
 
L'ordine potrebbe essere scritto solo alla fine, magari tenendolo memorizzato nelle variabili di sessione, in quel modo gli puoi associare un id: per fare questo devi aggiungere un pulsante per 'chiudere' l'ordine.
 
Mettere il pulsante è semplice, mandare una email anche (con il comando 'mail' se il server è propriamente configurato), ma capire cosa mandare se non tieni i prodotti dell'ordine corrente in memoria o non gli assegni un id univoco in modo da poter poi recuperare i prodotti da inviare nell'email.
 
Il processo logico di funzionamento di quello che ti serve chiaramente non ha molto a che fare con PHP ed è applicabile in tutti linguaggi, quindi cerca di capire prima cosa ti serve e poi cerca di realizzarlo.
 
Spero di averti un po' chiarito le idee.
 
---
 
Alex
 
BABEWARS 
http://www.babewars.net