Minulla on sivut joihin ei ole mitään salasanakyselyjä joten käyttäjää ei tunnisteta.
Olen tehnyt sivuille viestiohjelman jolla käyttäjät voivat kertoa juttuja. Aikaisemmin ei sinne ollut tungosta joten ohjelma jäi vähän puolitiehen. Nyt käyttäjiä alkaa olemaan niin paljon että tuo ohjelma alkaa sekoilemaan jos monta käyttäjää kirjoittaa samaan aikaan.
Esimerkiksi, kun käyttäjä vastaa toisen viestiin olen laittanut muuttujaan vastattavan viestin numeron mutta jos siellä on toinenkin kirjoittaja niin voi olla että muutujat vaihtuvat keskenään.
Nyt itse asiaan, miten tuollaisen voi välttää? Sen verran olen hajulla että sessiota siinä tarvitaan mutta sitten tulee tyhjä aukko tiedoissani. Miten nuo muuttujat talletetaan ettei ne mene sekaisin. Tietokanta ei ole hanskassa, vielä.
Mod. huom: käytä kappalejakoa, älä muuten painele enteriä!
Jos tieto koskee tiettyä lomaketta, ei kannata käyttää istuntoja vaan laittaa tieto lomakkeelle piilokenttään. Tällä tavalla saat viestin numeron $_POST-taulukkoon samalla tavalla kuin vastauksen tekstin.
<input type="hidden" name="muuttuja" value="<?php echo htmlspecialchars($muuttuja); ?>" />
Myös istunnoista kerrotaan oppaassa. Istuntojen huono puoli ongelmassasi on, että silloin käyttäjä ei voi kirjoittaa useaa vastausta samaan aikaan (eri tabeissa), koska kaikki vastaukset hyppäisivät viimeiseen valittuun viestiin.
Jos kuitenkin haluat käyttää istuntoja, laita ihan ensimmäiseksi – siis todella ihan ensimmäiseksi – jokaiselle istuntoja käyttävälle sivulle koodi, joka kutsuu funktiota session_start:
<?php session_start();
Sen jälkeen voit tallentaa tietoja taulukkoon $_SESSION:
$_SESSION["tieto"] = $muuttuja;
Vastaavasti voit hakea tallennetun tiedon näin:
if (!isset($_SESSION["tieto"])) { trigger_error("Istunto puuttuu tai on vanhentunut!", E_USER_ERROR); } else { $muuttuja = $_SESSION["tieto"]; }
Istunnot ovat tavallisesti voimassa parikymmentä minuuttia viimeisimmästä sivunlatauksesta.
Kiitos neuvoista.
Miten tunnistan kahdesta käyttäjästä sen kumman muuttuja on piilokentässä? Kysymyshän oli: miten erotan kahden yhtäaikaisen käyttäjän muuttujat toisistaan?
novari kirjoitti:
Miten tunnistan kahdesta käyttäjästä sen kumman muuttuja on piilokentässä? Kysymyshän oli: miten erotan kahden yhtäaikaisen käyttäjän muuttujat toisistaan?
Käyttäjä itse lähettää omat tietonsa, mukaan lukien sen piilokenttään kirjoitetun muuttujan sen lomakkeen mukana.
Siis niitä input-kenttiä on lomakkeellasi tuo yksi hidden-tyyppinen ja ne muut viestin kirjoitukseen tarkoitetut laatikot. Tietysti erotat, kuka oli kuka, kun se hidden-muuttuja saapuu lomakkeen käsittelevälle PHP-skriptille.
Tämä on minulle ihan uutta asiaa joten ehkä koodiesimerkki auttaisi ymmärtämään juttua.
Tässä on nyt pieni esimerkki HTML-lomakkeesta ja sitä käsittelevästä PHP-skriptistä.
<!-- Lomake alkaa. Sen tiedot lähetetään POST-tyyppisenä datana sivupyynnön yhteydessä osoitteeseen lomake.php --> <form method="post" action="lomake.php"> <!-- Tämä on piilotettu kenttä, joten sille ei ole omaa labelia. Huom! Korvaa tästä tuo muuttuja PHP:ssä käyttämäksesi viestin numeroksi. (eli tuo $vastattavanViestinId oikean nimiseksi) --> <input type="hidden" name="mihinvastaus" value="<?php echo htmlspecialchars($vastattavanViestinId); ?>" /> <!-- Käyttäjänimenkin kannattaisi olla oikeasti sisäänkirjautumisen mukaan, mutta esimerkin vuoksi tässä tällä tavoin tekstilaatikkona: --> <label for="kayttajanimi">Käyttäjänimesi:</label> <input type="text" name="kayttajanimi" /> <!-- Viestilaatikon kuvausteksti ja itse viestilaatikko --> <label for="viesti">Viestisi:</label> <textarea name="viesti"></textarea> <input type="submit" value="Lähetä viesti!" /> </form>
Ja PHP:n puolella sitten otetaan vastaan tuo lomake näin:
(Tuossa ylempänä olin nimennyt tämän lomake.php:ksi, mutta voi olla toki muunkin niminen.)
<?php // Tarkistetaan, onko lomakkeen tiedot lähetetty: if (isset($_POST['mihinvastaus']) && isset($_POST['kayttajanimi']) && isset($_POST['viesti']) { /* Kaikki tekstikentät on lähetetty! Tallennetaan viesti tässä kohtaa. Muuttuja $_POST['mihinvastaus'] sisältää sen viestin id:n, johon käyttäjä halusi vastata. Kannattaa tietysti myös tarkistaa, etteivät lähetetyt kentät ole tyhjiä. Esimerkiksi empty($_POST['viesti']) palauttaa true, jos viestikenttä on tyhjä tai false, jos se ei ole tyhjä */ } else { /* Lomaketta ei ole lähetetty. Tulostetaan HTML:nä virheviesti tai vaikkapa koko lomake käyttäjälle täytettäväksi. */ } ?>
Voit siis siirtää tuon koko lomakkeen tuohon jälkimmäisen koodilistauksen PHP-skriptin else-lohkoon.
Sen jälkeen tuo PHP-skripti toimii näin: Jos käyttäjä saapuu sivulle lomake.php ensimmäistä kertaa, ei mihinvastaus-, kayttajanimi- ja viesti-muuttujia ole asetettu (koska käyttäjä ei ole lähettänyt lomaketta sivupyynnön mukana), joten käyttäjälle tulostetaan tyhjä (tai jossain määrin esitäytetty) lomake. Jos taas samalle sivulle tullaan siten, että käyttäjä on lomakkeen kaikki muuttujat lähettänyt Lähetä viesti! -painikkeella, voidaan viesti kirjoittaa talteen.
Cornix kirjoitti:
==
Just saying...
Kiitos! Kokeilemalla varmaankin opin tuon.
Aihe on jo aika vanha, joten et voi enää vastata siihen.