Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Ostoskorista

Sivun loppuun

Dasi [17.11.2005 13:42:26]

#

Eli olen tässä yrittänyt putkan ohjeiden ja muiden keskusteluaiheiden pohjalta kehitellä yksinkertaista ostoskoria. Tuli kuitenkin mutkia matkaan.

Ensinnäkin, jos tuotteen kohdalla on "Koriin" nappula, niin mihin se linkitetään? Siihen php-tiedostoonko, joka aloittaa ja määrittelee session, vai mihin?

Entä kun ollaan kassalla, luetaanko silloin vain aloitetusta sessiosta esim. tuotteen nimi ja hinta?

Tässä koodi, jonka olisi tarkoitus aloittaa sessio:

<?php
session_start();

$_SESSION["tuote"] =  telkkari;
$_SESSION["hinta"] =  1000;
?>

Tässä koodi, jonka olisi tarkoitus lukea session tiedot:

<?php
echo "Tuote:" . $_SESSION["tuote"] . "<br>";
echo "Hinta:" . $_SESSION["hinta"] . "<br>";
?>

Heikki [17.11.2005 13:52:26]

#

No siis, teet vaikka lisaakoriin.php-tiedoston, ja sitten linkität tuotteen kohdalla tiedostoon lisaakoriin.php?tuote=123 jossa 123 on tuotteen tunnusnumero (olettaen että käytät id-pohjaista järjestelmää). Tässä tiedostossa voisi olla jotain tyyliin:

<?php
session_start();
// Tässä tarkistat että $_GET['tuote'] on laillinen (eli ei ole muokattu käsin
// Sitten vaan lisäät tuotteen
$_SESSION["tuote"]=$_GET['tuote'];
?>

Ja tulostettaessa sitten haet tietokannasta (mysql/tekstitiedosto/mikä nyt onkaan) ko. tunnusnumeroa vastaavan tuotteen tiedot.


Ja sitten muista, että session_start(); on jokaisen sessioita käyttävän sivun alussa.


Ja rivisi:

$_SESSION["tuote"] =  telkkari;

on virheellinen, laita telkkari vaikka lainausmerkkeihin (tai käytä id-pohjaista systeemmiä joka helpottaa tekemistä PALJON).

Megant [17.11.2005 13:59:49]

#

Heikki kirjoitti:

Ja sitten muista, että session_start(); on jokaisen sessioita käyttävän sivun alussa.

Ja selvennykseksi että siellä ei saa olla edes html-koodia.

Dasi [17.11.2005 15:05:30]

#

Yritin tehdä nyt seuraavasti, mutta ei tuntunut toimivan.

Tuotteen linkki: koriin.php?tuote=1

koriin.php

<?php
session_start();

$_SESSION["tuote"]=$_GET['tuote'];
?>

+html-koodia

ostoskori.php

<?php
//muodostetaan yhteys tietokantapalvelimeen
$yhteys = mysql_connect() or die("Yhdistäminen ei onnistunut!");

//valitaan tietokanta "php"
mysql_select_db("php", $yhteys) or die("Tietokantaa ei löytynyt!");

//*** Tietojen hakeminen
$kysely = SELECT * FROM varasto WHERE id = '$_SESSION["tuote"]';

echo "$kysely" ;

//suljetaan yhteys
mysql_close($yhteys);
?>

Sitten on vielä MySQL-tietokanta, tietokanta.php

<?php
//muodostetaan yhteys tietokantapalvelimeen
$yhteys = mysql_connect() or die("Yhdistäminen ei onnistunut!");

//valitaan tietokanta "php"
mysql_select_db("php", $yhteys) or die("Tietokantaa ei löytynyt!");

//Laitetaan tietokantaan arvoja
CREATE TABLE varasto (id INT, tuote TEXT, hinta INT);

INSERT INTO varasto (id, tuote, hinta) VALUES ('1', ' tv', '1000');

//suljetaan yhteys
mysql_close($yhteys);
?>

Mikäs mättää?

Heikki [17.11.2005 15:50:20]

#

Ainakin tuo session_start(); puuttuu tuosta ostoskori.php:n alusta (sessiomuuttujista ei saa tietoa, jos tuota ei ole kutsuttu).

Ja lisäksi tietojen tulostus on väärin, pitäisi olla jotenkin näin:

<?php
//--
//*** Tietojen hakeminen
$kysely = SELECT * FROM varasto WHERE id = '$_SESSION["tuote"]';

echo "Ostoskorissa on tuote " .  mysql_result($kysely, 0, "tuote") . " joka maksaa " . mysql_result($kysely, 0, "hinta") . "<br>";
?>

Ja pikku vinkkinä: kun pistät koodia sano miten se ei toimi, ei ole kiva käydä kaikke läpi kun sanotaan vain että tämä ei toimi. Jos kuvailet ongelmaa, on ratkaisukin nopeampaa.

Dasi [17.11.2005 17:54:23]

#

Juuh, saattaa johtua siitäkin, ettei MySQL oikein pelitä, joten tässä on seuraava epätoivoinen yritys tiedostojen avulla toteutettuna:

Tuotteen linkki edelleen: koriin.php?tuote=1

koriin.php

<?php

$ID = $_GET['tuote']; // $ID sis. tuotteen ID
$tt = fopen("kori.txt", "w");
fwrite($tt, "$ID"); // Kirjoitetaan tuotteen ID kori.txt filuun

fclose($tt);

?>

ostoskori.php

<?php

$vv = fopen("kori.txt", "r"); //Avataan edellä kirj. kori.txt
$rivi = fgets($vv, 1024);    //$rivi sisältää tuotteen ID:n

fclose($tt);

$pp = fopen("$rivi.txt", "r"); //Avataan ID:n niminen tekstitiedosto, esim 1.txt

$tiedot = fgets($pp, 1024); //Luetaan tuotteen tiedot tuotteen ID:n nimisestä filusta

echo "Tuote, hinta: $tiedot" //Tulostetaan tuotteen tiedot

?>

Palvelimella on jokaista tuote ID:tä kohden ID:n niminen .txt tiedosto, eli 1.txt, 2.txt, jne. joissa tuotteen tiedot ovat muotoa:

telkkari, 1000€

Ongelma on, että ostoskori.php tulostaa vain "Tuote, hinta:" eikä ollenkaan niitä tuotteen tietoja. Käsittääkseni näin toteutettuna mitään sessioita ei tarvita?

Heikki [17.11.2005 21:33:02]

#

Systeemmisi toimii niin kauan kun käyttäjiä piisaa, useammalla käyttäjälle tuo yksi tiedosto ei tietenkään toimi.

Dasi [18.11.2005 15:47:21]

#

Toimiiko, jos käyttää tiedoston sijasta niitä sessioita ja tallentelee sinne ne ID:t ja hakee sitten tekstitiedostoista tuotetiedot?

Jos a.php:ssa määritellään $xyz, niin voiko b.php:ssa tämän $xyz:n tietoja käsitellä, ts. välittyvätkö ne a.php:sta b.php:een?

lapm [18.11.2005 22:30:40]

#

Hmm, mitenkähän minulla tuleekin mieleen että kannattaisi käyttää assosioivaa taulukkoa jossa tuote ID toimii avaimena ja varsinaisena datana on tuotemäärä. :)

Tallettaisi sitten tuon ostoskori olion siihen sessioon. :)

<?php

$uusikori = new ostoskori;

class ostoskori
{
	var $Kori;

	function ostoskori()
	{
	}
	function lisaatuote($Tuoteid,$Maara)
	{
		$this->Kori[$Tuoteid] = $Maara;
	}
	function listaatuotteet()
	{
		.....
	}
}
?>

Sivun alkuun

Vastaus

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

Tietoa sivustosta