Aiuto su utilizzo ARRAY ed eventuale salvataggio all'interno del database!

  • Creatore Discussione Creatore Discussione vitelli
  • Data di inizio Data di inizio

vitelli

Utente Attivo
23 Mar 2012
41
0
0
Allora ragazzi, mi sto imbattendo in un progettino a titolo di studio (università) e sto incappando in un problema enon riesco a venirne fuori.. la cosa che dovrei fare consiste nell'avere un carrello e riuscire a memorizzare i prodotti che il cliente inserisce all'interno del carrello all'interno di un eventuale array da inviare poi ad un campo della tabella (ORDINI) anche intavolati uno dietro l'altro su unica riga, poi successivamente una pagina rileggere il contenuto e lo stampa a video.

vi mostro il codice così vi sarà più chiara la situazione:
if (isset($_SESSION['cart']))
{
echo "<table border=0 cellspacion=0 cellpadding=0 width='500'>";
$totale=0;
foreach ($_SESSION['cart']as $id => $x)
{

$risultatoquery=mysql_query("SELECT Nome,Prezzo FROM prodotti where id=$id")or die (mysql_error());
$miariga=mysql_fetch_array($risultatoquery);
$nome=$miariga['Nome'];
$nome=substr($nome,0,100);
$prezzo=$miariga['Prezzo'];
$costo=$prezzo*$x;
$totale=$totale+$costo;
echo "<tr>";
echo "<td align='left'>Prodotto: $nome </td>";
echo "<td align='right'>X $x <a href='cart.php?id=".$id."&action=remove'>Riduci</a></td>";
echo "<td align='right'>= $costo €";
echo "<tr>";
}
allora la variabile $nome, contiene il nome del prodotto inserito nel carrello dall'utente, logicamente se la stampo a video o la provo ad inserire all'interno della tabella, come risultato avrò solo l'ultimo oggetto che il cliente ha inserito e quindi perdo i prodotti precedenti... quindi perciò avevo pensato ad un array! solo che non so come impostarlo all'interno di questa SESSION... :(
 
Ultima modifica:
Ciao ^^ pure io sto affrontando questo tipo di argomento per studio ( università ) ^^

secondo me potresti per prima cosa creare una nuova variabile dove memorizzi il risultato della query MySql ;

Successivamente potresti fare un foreach e poi un controllo cn l'if e inizializzare le variabili SESSION ^^
 
ciao
@vitelli
benvenuto sul forum, e visto che è la prima volta quindi non sai: racchiudi sempre il codice tra gli appositi tag
seconda riga barra di formattazione del post una delle ultime tre iconcine
 
Ringrazio per la risposta.. ma purtroppo ad ora ancora non sono riuscito a gestire questo problema...qualcuno può illuminarmi??? :( mi sento un pò sconfortato dato che senza questo array (dove memorizzo i prodotti ordinati dall'utente) non posso creare una pagina per la cucina dove visualizzare gli ordini e quindi gestire le loro evasioni.
 
Puoi usare le funzioni serialize() e unserialize() per convertire l'array in stringa e viceversa:
PHP:
<?php
session_start();
$var = array('foo', 'bar');
$_SESSION['var'] = serialize($var);
?>
E nella pagina in cui leggi i dati:
PHP:
<?php
session_start();
$var = unserialize($_SESSION['var']);
?>
 
Ragazzi ho provato in questo modo, ho creato l'array eppoi ho assegnato all'array una sessione...ma quando vado a stampare mi ritrovo solo lo stamp dell'ultimo elemento inserito all'interno del carrello e non tutto il resto.. vi allego le semplici righe che ho provato a scrivere:

PHP:
	$risultatoquery=mysql_query("SELECT Nome,Prezzo FROM prodotti where id=$id")or die (mysql_error());
						$miariga=mysql_fetch_array($risultatoquery);
						$nome=$miariga['Nome'];
						$nome=substr($nome,0,100);
						$prezzo=$miariga['Prezzo'];
						$costo=$prezzo*$x;
						$totale=$totale+$costo;
						$miaarray = array($nome);
						$_SESSION['arrays']=$miaarray;

in una pagina di prova, ho provato a stampare in questo modo:

PHP:
foreach($_SESSION['arrays'] as $key=>$value)
					{
					// and print out the values
						echo 'The value of $_SESSION['."'".$key."'".'] is '."'".$value."'".' <br />';
					}
ma purtroppo mi visualizza solo l'ultimo elemento inserito nel carrello! :(
 
Questo succede perché tu sovrascrivi l'array precedente. Quando l'utente aggiunge un elemento al carrello devi fare qualcosa del genere:
PHP:
<?php
session_start();

// ...
// supponendo che $data contenga i dati del nuovo prodotto

$_SESSION['cart'][] = $data;
?>
 
prima di tutto grazie per la collaborazione che mi stai dando! ora ti faccio vedere l'intero codice del carrello, così che puoi avere meglio in occhio la situazione e indicarmi le modifiche da effettuare!

PHP:
					<?php
					
					
					
					echo "<h2> Carrello della Spesa </h2>";		
					
					if(isset($_GET['id']))
						$id=$_GET['id'];
					else 
						$id=1;
					
					if(isset($_GET['action']))
						$action=$_GET['action'];
					else 
						$action="empty";
						
					switch($action)
					{
					case "add":
					if (isset($_SESSION['cart'][$id]))
						$_SESSION['cart'][$id]++;
					else
						$_SESSION['cart'][$id]=1;
					
					break;
					case "remove":
					if (isset($_SESSION['cart'][$id]))
					{
						$_SESSION['cart'][$id]--; 
						if ($_SESSION['cart'][$id]==0)
							unset($_SESSION['cart'][$id]);
					}		
					break;
					case "empty":
					unset($_SESSION['cart']);
					break;
					}
						
					/*Display carrello */
					if (isset($_SESSION['cart']))
					{
						echo "<table border=0 cellspacion=0 cellpadding=0 width='500'>";
						$totale=0;
						foreach ($_SESSION['cart']as $id => $x)
						{
						
						$risultatoquery=mysql_query("SELECT Nome,Prezzo FROM prodotti where id=$id")or die (mysql_error());
						$miariga=mysql_fetch_array($risultatoquery);
						$nome=$miariga['Nome'];
						$nome=substr($nome,0,100);
						$prezzo=$miariga['Prezzo'];
						$costo=$prezzo*$x;
						$totale=$totale+$costo;
						$miaarray = array($nome);
						$_SESSION['arrays']=$miaarray;
						// $nome=$miariga['Nome'];
						// $myarray=array('nome'=>$nome);
						
						//STAMPEREMO TUTTO IN UNA VARIABLE SESSIONE/PRODOTTI
						
						echo "<tr>";
						echo "<td align='left'>Prodotto:  $nome </td>";
						echo "<td align='right'>X  $x <a href='cart.php?id=".$id."&action=remove'>Riduci</a></td>";
						echo "<td align='right'>= $costo €";
						echo "<tr>";
						}
						
					echo "<tr>";
					echo "<td align='right'> Totale=  </td>";
					echo "<td align='right'><b><br> $totale €</b></td>";
					echo "</tr>";
					echo "</table>";
					}
					else
						echo "Il carrello è vuoto";
					?>
 
Dando una sistemata al tuo script viene fuori questo:
PHP:
<?php
session_start();

// manca la connessione al database qui
// ...

echo '<h2>Carrello della spesa</h2>';

// il valore di default di $action non può essere 'empty', o il carrello verrà
// svuotato se l'utente non specifica un'azione da eseguire
$action = isset($_GET['action']) ? $_GET['action']   : '';
$id     = isset($_GET['id'])     ? (int) $_GET['id'] : 1;

switch ($action) {
    case 'add':
    {
        if (isset($_SESSION['cart'][$id])) {
            $_SESSION['cart'][$id]++;
        } else {
            $_SESSION['cart'][$id] = 1;
        }
        
        break;
    }
    
    case 'remove':
    {
        if (isset($_SESSION['cart'][$id]))
        {
            if ($_SESSION['cart'][$id] == 1) {
                unset($_SESSION['cart'][$id]);
            } else {
                $_SESSION['cart'][$id]--;
            }
        }
        
        break;
    }
    
    case 'empty':
    {
        $_SESSION['cart'] = array();
        break;
    }
}

if (isset($_SESSION['cart'])) {
    echo <<<EOF
        <table border="0" cellspacion="0" cellpadding="0" width="500">
EOF;
    
    $total = 0;
    
    foreach ($_SESSION['cart'] as $id => $num) {
        $sql   = 'SELECT nome, prezzo FROM prodotti WHERE id = %d';
        $query = mysql_query(sprintf($sql, $id)) or die(mysql_error());
        
        // prodotto inesistente: forse rimosso mentre l'utente navigava?
        if (mysql_num_rows($query) == 0) {
            unset($_SESSION['cart'][$id]);
            continue;
        }
        
        $row = mysql_fetch_assoc($query);
        
        $name = substr($row['nome'], 0, 100);
        $cost = $row['prezzo'] * $num;
        $total += $cost;
        
        echo <<<EOF
            <tr>
                <td>Prodotto: {$nome}</td>
                <td>x{$num} <a href="{$_SERVER['PHP_SELF']}?id={$id}&action=remove">Riduci</a></td>
                <td>= €{$cost}</td>
            </tr>
EOF;
    }

echo <<<EOF
            <tr>
                <td>Totale:</td>
                <td>€{$total}</td>
            </tr>
        </table>
EOF;
} else {
    $_SESSION['cart'] = array();
    echo 'Il carrello è vuoto.';
}
?>
Che dovrebbe essere perfettamente funzionante, a parte il fatto che manca una lista da cui aggiungere i prodotti.

Non ho capito a cosa ti serviva l'altra sessione se hai già $_SESSION['cart']?
 
Perfetto, grazie per le correzioni apportate al codice, ora però come faccio a stampare i nomi dei prodotti inseriti nel cliente e diciamo ordinati in una successiva pagina???

ho provato così, solo che mi restituisce il numero della sessione ed il numero di oggetti inseriti nel carrello di quel prodotto ( ma non il nome)

PHP:
foreach($_SESSION['cart'] as $key=>$nome)
					{
					// and print out the values
						echo 'The value of $_SESSION['."'".$key."'".'] is '."'".$nome."'".' <br />';
					}
 
scusami ma finalmente ora ho capito il vero modo d'uso delle sessioni...! non ho fatto la query che mi serviva per ricavare il nome del'oggetto, e facendola basandomi sull'ID, mi sono ricavato i nomi e sono riuscito a stamparli a video all'interno di un'altra pagina...ora devo trovare solo come salvarli all'interno di un database in modo da poter richiamarli dall'utente "Cucina"!
 
Ciao ^^ pensavo che potevi salvare i dati nel database attravers una sessione :

$_SESSION['']=$result[''] dove il nome nell'array risulatnte deve richiamare il nome contenuto nella variabile session.

Esempio :

$record = mysql_fetch_array($result);
$_SESSION['user_id'] = $record['id'];

fammi sapere ^^
 
Visto che visualizzi la lista in due pagine, crea un file functions.inc.php:
PHP:
<?php
function showCart()
{
    if (!isset($_SESSION['cart'])) {
        $_SESSION['cart'] = array();
    }
    
    if (count($_SESSION['cart']) > 0) {
        echo <<<EOF
        <table border="0" cellspacion="0" cellpadding="0" width="500">
EOF;

    $total = 0;

    foreach ($_SESSION['cart'] as $id => $num) {
        $sql   = 'SELECT nome, prezzo FROM prodotti WHERE id = %d';
        $query = mysql_query(sprintf($sql, $id)) or die(mysql_error());

        // prodotto inesistente: forse rimosso mentre l'utente navigava?
        if (mysql_num_rows($query) == 0) {
            unset($_SESSION['cart'][$id]);
            continue;
        }

        $row = mysql_fetch_assoc($query);

        $name = substr($row['nome'], 0, 100);
        $cost = $row['prezzo'] * $num;
        $total += $cost;

        echo <<<EOF
            <tr>
                <td>Prodotto: {$nome}</td>
                <td>x{$num} <a href="{$_SERVER['PHP_SELF']}?id={$id}&action=remove">Riduci</a></td>
                <td>= €{$cost}</td>
            </tr>
EOF;
    }

    echo <<<EOF
            <tr>
                <td>Totale:</td>
                <td>€{$total}</td>
            </tr>
        </table>
EOF;
    } else {
        echo 'Il carrello è vuoto.';
    }
}
?>
E modifica così il primo file:
PHP:
<?php
require_once __DIR__ . '/functions.inc.php';

session_start();

// manca la connessione al database qui
// ...

echo '<h2>Carrello della spesa</h2>';

// il valore di default di $action non può essere 'empty', o il carrello verrà
// svuotato se l'utente non specifica un'azione da eseguire
$action = isset($_GET['action']) ? $_GET['action']   : '';
$id     = isset($_GET['id'])     ? (int) $_GET['id'] : 1;

switch ($action) {
    case 'add':
    {
        if (isset($_SESSION['cart'][$id])) {
            $_SESSION['cart'][$id]++;
        } else {
            $_SESSION['cart'][$id] = 1;
        }

        break;
    }

    case 'remove':
    {
        if (isset($_SESSION['cart'][$id]))
        {
            if ($_SESSION['cart'][$id] == 1) {
                unset($_SESSION['cart'][$id]);
            } else {
                $_SESSION['cart'][$id]--;
            }
        }

        break;
    }

    case 'empty':
    {
        $_SESSION['cart'] = array();
        break;
    }
}

showCart();
?>
Nell'altro file in cui devi mostrare la lista dei prodotti:
PHP:
<?php
require_once __DIR__ . '/functions.inc.php';

session_start();

// manca la connessione al database qui
// ...

echo '<h2>Carrello della spesa</h2>';

showCart();
?>
 
Visto che visualizzi la lista in due pagine, crea un file functions.inc.php:
PHP:
<?php
function showCart()
{
    if (!isset($_SESSION['cart'])) {
        $_SESSION['cart'] = array();
    }
    
    if (count($_SESSION['cart']) > 0) {
        echo <<<EOF
        <table border="0" cellspacion="0" cellpadding="0" width="500">
EOF;

    $total = 0;

    foreach ($_SESSION['cart'] as $id => $num) {
        $sql   = 'SELECT nome, prezzo FROM prodotti WHERE id = %d';
        $query = mysql_query(sprintf($sql, $id)) or die(mysql_error());

        // prodotto inesistente: forse rimosso mentre l'utente navigava?
        if (mysql_num_rows($query) == 0) {
            unset($_SESSION['cart'][$id]);
            continue;
        }

        $row = mysql_fetch_assoc($query);

        $name = substr($row['nome'], 0, 100);
        $cost = $row['prezzo'] * $num;
        $total += $cost;

        echo <<<EOF
            <tr>
                <td>Prodotto: {$nome}</td>
                <td>x{$num} <a href="{$_SERVER['PHP_SELF']}?id={$id}&action=remove">Riduci</a></td>
                <td>= €{$cost}</td>
            </tr>
EOF;
    }

    echo <<<EOF
            <tr>
                <td>Totale:</td>
                <td>€{$total}</td>
            </tr>
        </table>
EOF;
    } else {
        echo 'Il carrello è vuoto.';
    }
}
?>
E modifica così il primo file:
PHP:
<?php
require_once __DIR__ . '/functions.inc.php';

session_start();

// manca la connessione al database qui
// ...

echo '<h2>Carrello della spesa</h2>';

// il valore di default di $action non può essere 'empty', o il carrello verrà
// svuotato se l'utente non specifica un'azione da eseguire
$action = isset($_GET['action']) ? $_GET['action']   : '';
$id     = isset($_GET['id'])     ? (int) $_GET['id'] : 1;

switch ($action) {
    case 'add':
    {
        if (isset($_SESSION['cart'][$id])) {
            $_SESSION['cart'][$id]++;
        } else {
            $_SESSION['cart'][$id] = 1;
        }

        break;
    }

    case 'remove':
    {
        if (isset($_SESSION['cart'][$id]))
        {
            if ($_SESSION['cart'][$id] == 1) {
                unset($_SESSION['cart'][$id]);
            } else {
                $_SESSION['cart'][$id]--;
            }
        }

        break;
    }

    case 'empty':
    {
        $_SESSION['cart'] = array();
        break;
    }
}

showCart();
?>
Nell'altro file in cui devi mostrare la lista dei prodotti:
PHP:
<?php
require_once __DIR__ . '/functions.inc.php';

session_start();

// manca la connessione al database qui
// ...

echo '<h2>Carrello della spesa</h2>';

showCart();
?>

ottima idea alessandro :D
 
Ok..ho letto tutto e visto il codice e ringrazio già tutti per la grossa mano che mi state danto, solo che non capisco dove avviene la memorizzazione in array da inviare poi con una INSERT al mio database... :S scusate ma sto alle prime armi e per far questo progetto mi sto sbattendo un pò cercandoci di capire qualcosa..

allora tornando a quello che ho compilato io, in una seconda pagina chiamata INOLTRO che non è altro una specie di riepilogo di quello che nella sessione ha ordinato l'utente e che quindi deve essere inviato al Database..

PHP:
<?php 
					foreach($_SESSION['cart']as $id => $x)
					{
					$risultatoquery2=mysql_query("SELECT Nome,Prezzo FROM prodotti where id=$id")or die (mysql_error());
					$miariga=mysql_fetch_array($risultatoquery2);
					$nome=$miariga['Nome'];
					$nome=substr($nome,0,100);
					$prova=array();
					$prova=$nome;
					// and print out the values
					echo 'Nome del prodotto ordinato '."'".$nome."'".' quantità '."'".$x."'".' <br />';
					echo $prova;
					}
					
					?>

allora posso fare qualcosa per dire al mio codice di inviare ogni variabile $nome del ciclo foreach all'interno di un array (in questo caso per prova l'ho chiamato $prova) dato che come vede se stampo $prova, visualizzo solo l'ultimo elemento del ciclo foreach...diciamo è come se mi mancasse l'indice da incrementare all'interno dell'array..poi dopo di questo vorrei inviare tutto sotto forma di stringa al database così da salvare in una sola riga il tutto (ID_UTENTE| PRODOTTI ORDINATI | TOTALE SPESO |).
 
Ora che i prodotti vengono memorizzati correttamente nella sessione, per inserirli fai così:
PHP:
<?php
session_start();

// metti qui la connessione al database
// ...

$sql = "INSERT INTO ordini (id_utente, prodotti, totale) VALUES (%d, '%s', %d)";
$sql = sprintf($sql, $_SESSION['id_utente'], addslashes(serialize($_SESSION['cart'])), $totale);

mysql_query($sql) or die(mysql_error());
?>
Visto che per calcolare il totale avresti bisogno di recuperare nuovamente i dati di tutti i prodotti in sessione, crea una funzione che lo fa automaticamente e mettila in functions.inc.php.
 
Ultima modifica:
Allora, ho configurato il tutto così come mi hai descritto tu, ora noto che ho solo un problema nella dichiarazione di questa SESSION_

PHP:
<?php
session_start();

// metti qui la connessione al database
// ...

$sql = "INSERT INTO ordini (id_utente, prodotti, totale) VALUES (%d, '%s', %d)";
$sql = sprintf($sql, $_SESSION['id_utente'], addslashes(serialize($_SESSION['cart'])), $totale);

mysql_query($sql) or die(mysql_error());
?>
al posto di id_utente, cosa devo inserire??? dato che mi dice che non è dichiara "Notice: Undefined index: id_utente in C:\xampp\htdocs\Order\inoltro.php on line 60"
ho provato nell'inserire la sessione Amministratore, con la quale mi connetto per prova e noto che non da errori, solo che non mi salva all'interno della tabella l'IDUTENTE giusto, infatti la tabella mi da errore nella scritta dato che non trova corrispondenza con l'IDUTENTE della tabella UTENTI (se cancello la relazione tra le due tabella, mi ritrovo il valore 0 all'interno della riga della tabella Ordini), il salvataggio dei prodotti pare che funzioni alla grande, infatti salva l'id del prodotto e la quantità del prodotto selezionato dall'utente, per il totale vedo di lavorarci dopo, ma penso che mi basti semplicemente una query sui vari costi e la loro somma prima di fare la INSERT da inviare al DB.
 
guarda il Login lo faccio in questo modo:

PHP:
	<?php
		$p = $_GET['azione']; //il GET consente di creare valori da inserire nelle url
		
		// Mi trovo nella pagina di login --> login.php?azione=login
		if ($p == "login") {
				
			if (!isset($_POST['invia'])) { //se non ho premuto sul tasto 'invia' del form, stampami il form
				/*Andiamo a raccogliere i dati necessari per il login, cioè username e password	*/?>
				
				<form method="post" action="#" id="formlogin">
					<ul> 
						<li>
							<label for="username">Username</label>
							<input type="text" name="username" id="username" />
						</li>
					
						<li>
							<label for="password">Password</label>
							<input type="password" name="password" id="password" />
						</li>
					</ul>
					
					<input type="submit" name="invia" id="login" value="Accedi" />
				</form>
				
	<?php
			} else { //altrimenti verifica se le credenziali inserite sono corrette ed eventualmente effettua il login
				//Creiamo i valori del form
				$username = mysql_real_escape_string($_POST['username']);
				$password = mysql_real_escape_string($_POST['password']);
				
				/*Dopo aver creato i valori del form, dobbiamo controllare se i campi sono vuoti */
				if ($username == "") {
					echo "ERRORE - Campo username vuoto";
					
				} elseif ($password == "") {
					echo "ERRORE - Campo email vuoto";
					
				} else { //Recuperiamo i dati dal database
				
					$passwordcript=md5($password); //criptiamo la password in md5
					
					$recuperadati = mysql_query("SELECT * FROM utenti WHERE username='$username' AND password='$passwordcript'");
					$verificadati = mysql_num_rows($recuperadati);
					
					if ($verificadati == 1) { //Se è presente all'interno della tabella utenti un utente che ha quell'username e quella password effettuiamo il login
						
						$sessione = mysql_fetch_array($recuperadati); //recupera le informazioni dell'utente
						
						if ($sessione['privilegi'] == 1) { //verifichiamo se l'utente che si è loggato è amministratore
							$_SESSION['amministratore'] = $sessione['username']; //apriamo la sessione per l'amministratore con quella username
							echo "Login effettuato con successo (come amministratore)... Attendi.";
							header("Refresh: 2; URL= index.php");   //Redirect alla home page dopo il login
																	
						} 
						else if ($sessione['privilegi'] == 3) { //verifichiamo se l'utente che si è loggato come cuoco/cucina
							$_SESSION['cucina'] = $sessione['username']; //apriamo la sessione per la cucina con questo username
							echo "Login effettuato con successo dalla cucina... Attendi.";
							header("Refresh: 2; URL= index.php");   //Redirect alla home page dopo il login
						}
						else { //il login è stato effettuato da un utente semplice
							$_SESSION['utente'] = $sessione['username']; //apriamo la sessione per l'utente con quella username
							echo "Login effettuato con successo... Attendi.";
							header("Refresh: 2; URL= index.php");   //Redirect alla home page dopo il login
						}
						
					} else { // Se non è presente un utente con quella username e quella password
						echo "ERRORE - Dati non presenti nel database";
					}
				}
			}
		
		// Mi trovo nella pagina di logout --> login.php?azione=logout
		} elseif ($p == "logout") {
			
			session_destroy(); //chiudo la sessione
			echo "Logout effettuato con successo!";
			header("Refresh: 1; URL= index.php"); //redirect alla home page
		}
	?>
 
Direi che un po' l'intera applicazione è strutturata male. Che senso ha chiamare la sessione in tre modi diversi a seconda dei privilegi dell'utente? Avresti dovuto creare, al limite, due sessioni: una contenente l'ID (e non lo username!) dell'utente, e un'altra contenente il livello di accesso.
 

Discussioni simili