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:
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).
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.
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ää?
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.
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?
Systeemmisi toimii niin kauan kun käyttäjiä piisaa, useammalla käyttäjälle tuo yksi tiedosto ei tietenkään toimi.
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?
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() { ..... } } ?>
Aihe on jo aika vanha, joten et voi enää vastata siihen.