Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Ostoskoriskripti

Sivun loppuun

Triton [23.02.2009 19:49:30]

#

Toteutin hetken mielenjohteesta ostoskoriskriptin ja samalla toisen skriptin, jolla tuotteita voi lisätä ostoskoriin (lähinnä ostoskorin testaamisen vuoksi). Koko ns. "järjestelmä" on siinä mielessä tekstitiedostopohjainen, että kaikki tuotteiden tiedot ovat tekstitiedostossa, josta ne aina tarpeen tullen haetaan... Tein ostoskoriin myös oletusmuotoilut CSS:llä ja ne toimii ainakin Chromessa, Firefoxissa ja Operassa. Tyyliä muokkaamalla saa ostoskorista varsin helposti eri näköisen. Koodia muokkaamalla ostoskorista pitäisi varsin vähällä vaivalla saada MySQL:llä toimivan.

Toivon mukaan tästä on jollekin hyötyä!

lisaa_tuote.php

<?php

		//Aloitetaan sivun puskurointi
		ob_start();

		//Tulostetaan HTML-sivun alkurakenne
		echo "<html><head><title>Lisää tuote...</title></head><body>";

		//-----------------TUOTTEEN ESITTELY---------------

		//Avataan tuotetiedosto, mikä sisältää tiedot kaikista tuotteista
		$tuotteet = file("tuotteet.txt");

		//For-rakenteella käytään tuotetiedoston tuotteet läpi
		for ($i = 0; $i < count($tuotteet); $i++) {
			//Pilkotataan tuotteiden tiedot ja asetetaan ne omiin muuttujiin
			$tieto = explode(":",$tuotteet[$i]);
			$id = $tieto[0];
			$tuote = $tieto[1];
			$hinta = $tieto[2];

			//Tulostetaan tuotteen tiedot ja "lisää ostoskoriin" linkki
			echo "<p>Tuote: $tuote <br /> Hinta: $hinta €</p>";
			echo '<form action="#" method="POST"><p>
			<input type="hidden" name="id" value="'.$id.'">
			<input type="submit" value="Lisää ostoskoriin!" name="act"></p>
			</form>';
			echo "<hr />";

		}

		//-------------TUOTTEEN LISÄÄMINEN SEKÄ PÄIVITTÄMINEN--------------

		//Tarkistetaan, että lisättiinkö tuote ostokoriin
		if (isset($_POST['act'])) {
			//Tallennetaan muuttujaan POST-taulukon kautta lähetetty tieto
			$id = $_POST['id'];
			/* Tarkistetaan, että onko samaa tuotetta jo aijemmin lisätty ostoskoriin,
			jotta saadaan selville luodaanko uusi eväste vai päivitetäänkö vanhan evästeen määrä-tieto */
			if (!isset($_COOKIE['tuote'.$id])) {
				//Luodaan uusi eväste
				setcookie('tuote'.$id,$id.'=1',time() + 60*60*24);
			}
			else {
				/* Luetaan evästetättä, pilkotaan tiedot osiin ja tallennetaan
				omiin muuttujiin sekä korotetaan tuotteen määrää yhdellä */
				$cookie = explode("=",$_COOKIE['tuote'.$id]);
				$maara = $cookie[1] + 1;
				//Luodaan uusi eväste päivitetyin tiedoin
				setcookie('tuote'.$id,$id.'='.$maara,time() + 60*60*24);
			}

			//Päivitetään sivu
			header("Location: http://oma_url.../lisaa_tuote.php");

		}

		//-------------------------------------------------------------------------

		//Tulostetaan HTML-sivun loppurakenne
		echo "</body></html>";

		//Päätetään sivun puskurointi
		ob_flush();


?>

ostoskori.php

<?php

	//Puskuroidaan tiedostoa
	ob_start();

	//Tulostetaan HTML-sivun alkurakenne sekä asetetaan tyylitiedosto
	echo "<html><head><title>Ostoskori</title></head><body>
	<link href='style.css' type='text/css' rel='stylesheet'>";


	//---------------------------------OSTOSKORI-----------------------------------


	//Tulostetaan ostoskorin alkurakenne
	echo "<div class='palkki'><div class='seloste'>Tuote</div>
	<div class='seloste'>Määrä</div>
	<div class='seloste'>Hinta</div></div>";

	//Avataan tuotetiedosto (sisältää tiedot kaikista tuotteista)
	$tuotteet = file("tuotteet.txt");

	//Käydään foreach-rakenteella evästeet läpi, jotka sisältävät tuotteen id:n ja määrän
	foreach($_COOKIE as $tuote) {
		//Luetaan evästettä pilkkomalla id ja määrä omiin muuttujiin
		$tiedot = explode("=",$tuote);
		$id = $tiedot[0];
		$maara = $tiedot[1];
		//For-rakenteella käydään tuotetiedoston kaikki tuotteet läpi
		for ($i = 0; $i < count($tuotteet); $i++) {
			/* Pilkotaan tuotetiedoston tiedot omiin muuttujiin
			sen lisäksi lasketaan tuotteen määrän mukaan kokonaishinta */
			$tiedot = explode(":",$tuotteet[$i]);
			$tuoteID = $tiedot[0];
			$tuote = $tiedot[1];
			$hinta = $tiedot[2] * $maara;
			// Tarkistetaa, että vastaako evästeessä oleva id yhtään tuotteen id:tä,
			if ($id == $tuoteID) {
				//Lasketaan kaikkien ostoskorin tuotteiden yhteishinta
				$yht += $hinta;
				/* Tulostetaan ostoskorissa näkyvä rivi, jossa lukee tuotteen nimi,
				määrä, hinta sekä linkki, millä tuotteen voi poistaa */
				echo "<div class='tuote_palkki'><div class='tuote'>$tuote</div>
				<div class='tuote'>$maara kpl</div>
				<div class='tuote'>$hinta €</div>
				<div class='tuote'><a href='?tuoteID=$tuoteID&poista=true'>Poista</a></div></div>";
			}
		}
	}

	/* Tarkistetaan onko yhtään tuotetta lisätty ostoskoriin
	(eli tarkastetaan onko yhtään evästettä asetettu) */
	If (count($_COOKIE) != 0) {
		//Jos ehto on tosi tulostetaan palkki, jossa lukee tuotteiden yhteishinta
		echo "<div id='yhteensa'>Yhteensä: $yht €</div>";
	}
	else {
		//Muuten: tulostetaan teksti, joka ilmoittaa ostoskorin olevan tyhjä
		echo "<div id='yhteensa'>Ostoskorisi on tyhjä!</div>";
	}

	//Tulostetaan ostoskorin loppurakenne
	echo "</div><div class='palkki'></div>";


	//---------------------------------TUOTTEEN POISTAMINEN---------------------------------------


	//Tarkistetaan onko poista-linkkiä painettu
	if (isset($_GET['poista']) && $_GET['poista'] == true) {
		//Vastaanotetaan GET-taulukon kautta lähetetty tuotteen id
		$poistaID = $_GET['tuoteID'];
		/* Luetaan edellä vastaanotetun id:n avulla oikeaa evästettä ja pilkotaan sen tiedot
		omiin muuttujiin  */
		$tiedot = explode("=",$_COOKIE['tuote'.$poistaID]);
		$id = $tiedot[0];
		$maara = $tiedot[1];

		/* Selvitetään onko tuotteita ostoskorissa enemmän kuin yksi, jotta tiedetään
		poistetaanko koko eväste vai päivitetäänkö määrä-tieto  */
		if ($maara > 1) {
			//Vähennetään tuotteen määrää yhdellä ja päiviteen eväste luomalla uusi...
			$maara--;
			setcookie('tuote'.$id,$id.'='.$maara,time() + 60*60*24);
		}
		else {
			//Tuotteiden ollessa vain yksi, koko eväste poistetaan
			setcookie('tuote'.$id,'',time() - 60*60*24);
		}

		//Päivitetään ostoskori sivu, jotta saadaan tuotteen poisto samantien näkyviin
		header("Location: http://oma_url...ostoskori.php");

	}


	//---------------------------------------------------------------------------------------------------------------------

	//HTML-sivun loppurakenne
	echo "</body></html>";

	//Päätetään tiedoston puskurointi
	ob_flush();


?>

style.css

.palkki {
	border: 2px solid #000;
	background-color: #941414;
	width: 400px;
	height: 25px;
	margin-bottom: 5px;
}

.tuote_palkki {
	width: 404px;
	min-height: 25px;
	margin-bottom: 2px;
	border-bottom: 1px dotted #000;
}

#yhteensa {
	border-bottom: 1px solid #000;
	margin-bottom: 5px;
	margin-top: 5px;
	width: 392px;
	height: 17px;
	padding-top: 2px;
	padding-left: 12px;
	padding-bottom: 5px;
	font-family: arial;
	font-size: 12px;
	font-weight: bold;
}

.seloste {
	width: 100px;
	float: left;
	font-family: arial;
	font-size: 12px;
	font-weight: bold;
	text-align: center;
	text-decoration: underline;
	padding-top: 5px;
	color: #fff;
}

.tuote {
	width: 100px;
	float: left;
	font-family: arial;
	font-size: 12px;
	text-align: center;
	padding-top: 5px;
}

tuotteet.txt (oletus tuotteita

1:Tietokone:1155
2:Kännykkä:340
3:TV:1500

tsuriga [04.03.2009 15:21:48]

#

Missä FireFoxissa?

Asiaan: Tässä nyt on vähän vanhanaikaisesti sekoitettu koodivinkissä sivun rakenne ja toiminnallisuus, mikä tekee kaupan upottamisesta toisenlaiseen rakenteeseen vaivalloisempaa kuin olisi tarvis.

Kusmariini [06.03.2009 18:20:38]

#

Firefox on selain

jo123 [08.03.2009 18:10:34]

#

XD Niin selain se on. Hmmm tulikohan joku väärinkäsitys?

Triton [08.03.2009 19:59:13]

#

Tais tulla... Niin sehän ei ole FireFox vaan Firefox (toisin kuin olin tuonne esittelyyn alunperin kirjoittanut)... :D

tomijrinne [14.08.2009 13:32:02]

#

mun "tuotteet.txt"-tiedostossa on kymmmenen tuotetta. Seitsemän ensimäistä näkyy oikein, mutta sen jälkeen vaan kolme kohdetta ilman tekstiä. Eli näkyy pelkästään "Lisää ostoskoriin!" painiketta. Missäs kiikastaa?

simppeli [22.09.2009 16:12:02]

#

ihan hyvä, innosti minua kokoamaan oman php verkkokauppaskripan myslillä, rasittava bugi tässä on: välillä tuotteet eivät millään poistu ostoskorista :/

Mechax [08.10.2009 13:57:44]

#

Tosi näppärä ja helppo laittaa toimintaan! Demoa täällä:
http://mechax.dy.fi/osto

Voisin sisällyttää ton johonkin sivuun esikatseltavaksi huvin vuoksi.

Tuossa on vaan pieni bugi; Välillä kun on monta tuotetta ostoskorissa ja poistaa ylimmäisen kaikki kappaleet kokonaan niin lähtee kaikki tuotteet ostoskorista :/.

nerootto [11.03.2010 16:27:59]

#

Ei tässä voi tilata tuotteita. ?????

Macro [01.07.2010 21:18:55]

#

nerootto kirjoitti:

Ei tässä voi tilata tuotteita. ?????

Jotta ohjelmassa olisi mahdollisuus maksaakkin tuote, vaadittaisiin Visalta (tms?) maksullinen systeemi, jolla maksaminen toimisi.

Tuskin tämmöistä sovellusta kumminkaan käytetään kaupalliseen käyttöön, joten tuotteen tilausmahdollisuus ei ole kannattavaa.

Triton [03.07.2010 15:00:53]

#

Jotta tuotteen maksaminen onnistuu tarvitaan sopimukset eri pankkien kanssa.

Clacier [07.09.2010 18:07:19]

#

Olen jatkanut tätä koodia aika pitkälle. Ostoskorista lähetetään tiedot send.php:seen, joka lähettää tilauksen vastaanottajalle sekä adminille sähköpostiviestin. Enää yksi ongelma, millaisella koodilla saisi koko ostoskorin tyhjennettyä kerralla? Olisi todella tärkeä..

Metabolix [14.12.2011 20:24:56]

#

Koodin rakenne on epäselvä, tiedostoja pitäisi olla useampi ja toimintojen pitäisi olla funktioissa. Omatekoiset tiedostomuodot eivät yleensä ole hyväksi, serialize tai json_encode on parempi. Evästeviritelmä on ruma ja estää koodin järkevän uusiokäytön, kannattaisi käyttää vain yhtä evästettä, johon voi jälleen tallentaa joko serialisoitua dataa tai taulukon (tuote kerrallaan, muodossa kori[id]=maara). GET-pyyntöjen käyttö datan muokkaamiseen ei myöskään ole hyvä. HTML ja logiikka pitäisi pitää erillään, ja kaiken kukkuraksi vinkin HTML ei ole edes validia.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta