- Home
- Categorie
- Coding e Sistemistica
- PHP
- Associare un acquisto ad un utente
-
Associare un acquisto ad un utente
Salve ragazzi.
Ecco il quesito. Allora, ho implementato una serie di script in php che mi consentono di inserire, all'interno di un'area amministrazione e poi nella home page del sito, degli eventi (spettacoli ecc). Gli utenti che vogliono effettuare l'acquisto devono essere registrati e quindi loggati.Se vogliono acquistare un evento devono clikkare, in home, sull'evento di loro interesse e vengono rimandati ad una pagina dove compare quell'evento, quindi con il suo id identificativo, ove trovano un form che gli consente di scegliere numero biglietti e viene calcolato il totale. Clikkando sul bottone acquista i dati relativi all'acquisto vengono inseriti in una tabella chiamata ordini.
Ora, il problema è questo. Non riesco a passare i dati relativi all'utente, ossia il nome, il cognome, la via, ecc.
Il file che controlla il passaggio dati è questo:
[PHP]
<?php
$numero = htmlentities(strip_tags($_POST["numero"]));
$totale = htmlentities(strip_tags($_POST["totale"]));include("config.php");
mysql_connect($db_host,$db_user,$db_password,$db_name) or die ("non riesco a connettermi");
mysql_select_db("$db_name") or die ("Non riesco a selezionare il database");
mysql_query("insert into ordini (numero, totale) values ('$numero', '$totale')") or die( mysql_error() . "<br>" . $sql) ;
$ultimo_id = mysql_insert_id();
mysql_close();
?>
<table width="400" bgcolor="#f5f5f5" align="center" cellpadding="0" cellspacing="5" border="0">
<tr>
<td>
<div align="center">
<h1><font color="#000000" size="4">Dettaglio acquisti</font></h1>
</div><br></td></tr>
</table>
<br>
<table width="400" bgcolor="#FFFFFF" align="center" cellpadding="0" cellspacing="5" border="0">
<tr><td>
<?php
include("config.php");
mysql_connect($db_host, $db_user, $db_password, $db_name) or die ("non riesco a connettermi");
mysql_select_db("$db_name") or die ("Non riesco a selezionare il database");
$dati = mysql_query("SELECT date_format(data,'%d-%m-%Y %H:%i') AS 'dataora' FROM ordini WHERE ordine_id='$ultimo_id'");
$array = mysql_fetch_array($dati);
echo "<h3>Biglietti acquistati</h3> $numero<br><br>";
echo "<h3>Costo totale:</h3> $totale<br>";
echo "Acquistato il ".substr($array ['dataora'],0,10)." alle ". substr($array ['dataora'],11,5);
mysql_close();
?>
<br>
<br>
<?php
include("config.php");
mysql_connect($db_host, $db_user, $db_password, $db_name) or die ("non riesco a connettermi");
mysql_select_db("$db_name") or die ("Non riesco a selezionare il database");$dati = mysql_query("SELECT * FROM ordini WHERE ordine_id='$ultimo_id'");
$array = mysql_fetch_array($dati);
echo " <tr>";
echo "<td><a href="modifyevent.php?id=" . $array['ordine_id'] . "">modifica</td> ";
echo "<td><a href="menuorg.php">Torna al menu</td> ";
echo "</tr>";
mysql_close();
?>
[/PHP]La struttura delle due tabelle, utenti e ordini, è questa:
CREATE TABLE
utenti
(
utente_id
int(3) NOT NULL auto_increment,
username
varchar(30) NOT NULL default '',
password
varchar(34) NOT NULL,
confermapassword
varchar(34) NOT NULL,
nome
varchar(30) NOT NULL default '',
cognome
varchar(30) NOT NULL default '',
giorno
int(2) NOT NULL default '',
mese
int(2) NOT NULL default '',
anno
int(4) NOT NULL default '',
cap
int(10) NOT NULL default '',
provincia
varchar(30) NOT NULL default '',
indirizzo
varchar(30) NOT NULL default '',
civico
int(5) NOT NULL default '',
mail
char(255) NOT NULL default '',
data
timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
ip
char(15) NOT NULL default '',
PRIMARY KEY (utente_id
),
UNIQUE KEYid
(utente_id
),
KEYid_2
(utente_id
)
)CREATE TABLE
ordini
(
ordine_id
int(5) NOT NULL auto_increment,
numero
int(5),
totale
decimal (5,2),
data
timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (ordine_id
)
)quella degli eventi:
CREATE TABLE
eventi
(
event_id
int(5) unsigned NOT NULL auto_increment,
evento
text NOT NULL,
luogo
text NOT NULL,
dataevento
varchar(50) NOT NULL default '',
ora
varchar(50) NOT NULL default '',
descrizione
text NOT NULL,
disponibilita
int(3),
prezzo
decimal (5,2),
autore
varchar(50) NOT NULL default '',
data
timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
nome
varchar(50) NOT NULL default '',
size
varchar(25) NOT NULL default '',
type
varchar(25) NOT NULL default '',
immagine
longblob NOT NULL,
pub
int(1) NOT NULL default '0',
PRIMARY KEY (event_id
)
)Come posso risolvere il problema? In modo che all'evento venga associato, al momento dell'acquisto, l'utente che lo sta acquistando? (con tutti i suoi dati, nome, cognome ecc...)
Grazie mille
-
Ciao, non sarebbe meglio se in ordine inserissi l'id dell'utente? In questo modo quando servono i dati dell'utente che ha acquistato li recuperi tramite l'id.
PS: forse ti conviene inserire solo un include(config) all'inizio.
-
Si avevo pensato anche io di inserire l'id_utente. Ma mi sfugge una cosa. Nel momento in cui un un utente entra, acquista. I dati vengono inviati alla tabella ordine. Ma come viene passato il valore dell'id_utente? Oppure come vado poi a pescare i dati per quell'ordine relativi a quell'utente?
Mi spiego, l'utente dovrebbe poi visualizzare una pagina ove ha i dettagli dell'ordine: il suo nome e cognome, indirizzo per la spedizione, l'evento acquistato, il numero di biglietti acquistati ed il totale dell'acquisto...
-
Beh per ripescare i dati si usano le select di sql. Per passare l'id_utente, penso convenga salvarlo in sessione quando l'utente si logga. Per la pagina con la visualizzazione, una volta che hai i dati è semplice.
-
Salvarlo in sessione che intendi? Io utilizzo le sessioni per verificare, in una pagina, che l'utente sia registrato memorizzandoci all'interno username. Se la la variabile di sessione è diversa da username, allora si rimanda alla pagina login.
Mi sfugge come memorizzare l'id_utente
per intenderci:
If ($_SESSION ['username'] != true)
ecc
-
// l'utente si logga...
$_SESSION ['userID'] = $userID; //userID è preso dalla fomr di login
....
più avanti salvi dentro il db la varibile $_SESSION ['userID']
-
Aspetta però, stiamo parlando di due dati diversi o sbaglio? Da un lato serve l'id_utente. Dall'altro, tramite la sessione, passi l'username. O no?
-
Puoi passare quello che vuoi era solo un esempio...
-
Vorrei capire però una cosa. Supponiamo di avere le due tabelle. Ordini e utenti. In entrambe abbiamo il campo id_utente. Chiaro che quando un utente si registra, su id_utente della tabella utenti viene dato un valore (autoincrement, per esempio uno). Ma è chiaro che su quella ordini non viene dato nessun valore.
L'id_utente della tabella ordini viene compilato quando l'utente effettua l'acquisto. Ma non è detto che i due id_utente coincidano. Non so se mi spiego. Magari un utente di registra e non acquista. Subito dopo se ne registra un altro, con id_utente pari a 2. Questo acquista e valorizza l'id_utente della tabella ordini con 1. Non c'è corrispondenza tra gli Id_utente delle due tabelle. In una (utenti) ho 2, nell'altra (ordini) ho 1.
Come faccio a relazionarle?
Credo di aver scritto un po' di castronerie.....
-
Beh non credo funzioni così. L'utente si registra e prende un id, supponiamo 3. Poi si registra l'utente 4. Ora, l'utente 4 fa un acquisto, ma tu ovviamente devi sapere qualeutente fa l'acquisto, quindi devi farlo loggare e salvarti in sessione il suo id. quindi quando l'utente 4 va a fare un acquisto, tu sai che è l'utente 4, e dentro la tabella acquista salvi 4 come id_utente.
-
Ho risolto il problema in questo modo. Ora ho diverse tabelle, di cui mostro la struttura:
CREATE TABLE
utenti
(
utente_id
int(3) NOT NULL auto_increment,
username
varchar(30) NOT NULL default '',
password
varchar(34) NOT NULL,
confermapassword
varchar(34) NOT NULL,
nome
varchar(30) NOT NULL default '',
cognome
varchar(30) NOT NULL default '',
giorno
int(2) NOT NULL default '',
mese
int(2) NOT NULL default '',
anno
int(4) NOT NULL default '',
cap
int(10) NOT NULL default '',
provincia
varchar(30) NOT NULL default '',
indirizzo
varchar(30) NOT NULL default '',
civico
int(5) NOT NULL default '',
mail
char(255) NOT NULL default '',
data
timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
ip
char(15) NOT NULL default '',
PRIMARY KEY (utente_id
),
UNIQUE KEYid
(utente_id
),
KEYid_2
(utente_id
)
)La seconda, eventi:
CREATE TABLE
eventi
(
event_id
int(5) unsigned NOT NULL auto_increment,
evento
text NOT NULL,
luogo
text NOT NULL,
dataevento
varchar(50) NOT NULL default '',
ora
varchar(50) NOT NULL default '',
descrizione
text NOT NULL,
disponibilita
int(3),
prezzo
decimal (5,2),
autore
varchar(50) NOT NULL default '',
data
timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
nome
varchar(50) NOT NULL default '',
size
varchar(25) NOT NULL default '',
type
varchar(25) NOT NULL default '',
immagine
longblob NOT NULL,
pub
int(1) NOT NULL default '0',
PRIMARY KEY (event_id
)
)La terza, ordini:
CREATE TABLEordini
(
ordine_id
int(5) NOT NULL auto_increment,
utente_id
int(5) NOT NULL,
event_id
int(5) NOT NULL,
numero
int(5),
totale
decimal (5,2),
data
timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (ordine_id
)
)Come vedete nell'ultima ho i campi che mettono in relazione le tre tabelle. In questo modo vorrei ottenere, in una pagina, tutti i dati relativi agli acquisti effettuati da un determinato utente. Ad esempio, l'utente 1 che eventi ha acquistato, quanti biglietti per singolo evento, il costo totale. La query sarebbe questa, ma da un problema.
codice PHP:
<?php
include("config.php");
mysql_connect($db_host,$db_user,$db_password,$db_name) or die ("non riesco a connettermi");
mysql_select_db("$db_name") or die ("Non riesco a selezionare il database");
if(empty($_GET["id"])){
echo"Non hai selezionato nulla";
}
else{$dati = mysql_query("SELECT utenti., eventi., ordini.*
FROM utenti
INNER JOIN ordini ON ordini.utente_id = utenti.utente_id
INNER JOIN eventi ON eventi.event_id = ordini.event_id
WHERE utenti.utente_id ='".$_GET['id']."'") or die( mysql_error() . "<br>" . $sql);
$array = mysql_fetch_array($dati);echo "<h3>Evento acquistato</h3> $array[evento]<br><br>";
echo "<h3>Biglietti acquistati</h3> $array[numero]<br><br>";
echo "<h3>Costo totale:</h3> $array[totale]<br>";
echo "Acquistato il ".substr($array ['dataora'],0,10)." alle ". substr($array ['dataora'],11,5);
mysql_close();
}
?>Il problema è semplice, l'esecuzione di questa query mi da solo un risultato, il primo acquisto effettuato da un determinato utente. Dal primo in poi nulla. Esce fuori solo il primo, gli altri eventualmente fatti è come se non esistano all'interno del database. Come mai? Io vorrei che uscisse fuori la lista di tutti gli ordini effettuati, con nome e cognome dell'utente, la sua via, numero civico, eventi acquistati, numero biglietti per singolo evento, totale costo dei biglietti acquistati per ogni singolo evento.
Perchè non salta fuori, dove sto sbagliando?
-
Devi usare un ciclo while, ad esempio:
while ($array = mysql_fetch_array($dati)){
echo "<h3>Evento acquistato</h3> $array[evento]<br><br>";
........
}