Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Apua PHP-chatiin

Sivun loppuun

Aeklus [09.03.2008 20:09:03]

#

Heissan!
Olen näin alustavasti lukenus pari PHP opasta läpi, ja vielä on tietenkin se kieli vähän hakusessa.
Olen ajatellut kokeilla ohjelmoida sivuille PHP:hen perustuvan chatin, mutta en oikein pääse edes alkuun.
Joten, nyt päästään sitten itse asiaan.
Olisiko teillä heittää (joku joka chatin on ennenkin ohjelmoinut), niin jotain pientä pohjaa, joka toimisi jo "perus-chattina".
Muokkalaisin sitä tässä ajan kuluksi omanlaisekseni, ja samalla oppisinkin myös paljon PHP:stä :).
Chatin "rungon" tekijä saa halutessaan maininnan sivuillani, ja olisin hänelle tuhannesti kiitollinen avusta.

Ystävällisin terveisin,
Aeklus.

Jakke1 [09.03.2008 20:34:41]

#

Hakukin on ihan kiva. ;)

Aeklus [09.03.2008 20:37:55]

#

Hmm, itse en ainakaan onnistunut mitään sen erikoisempaa löytämään, vaikka varmaan olen jo 5 tuntia yhteensä eri puolilta nettimaailmaa etsinyt :o.
Ja lisäystä vielä tuohon aloitusviestiin, en kaipaa mitään PHP Free chattia tms. :)

Metabolix [09.03.2008 20:45:32]

#

Oletan, että kaipaat kirjautumista, ettei terrorisointi onnistu. Seuraava pitkä koodi on suoraan tähän kirjoitettu, mutta siinä pitäisi olla vähintäänkin jo valtaosa ideoista kohdallaan. HTML-puolta siinä ei vielä käsitellä käytännössä lainkaan, sen saat kirjoittaa itse. Muilta osin se voisi jopa toimia. :o

Ikuinen ongelma on tietenkin viestien hakeminen eli sivun päivittäminen. JS:llä se onnistuisi kätevästi, mutta ilman JS:ää täytyy päivittää koko sivu, jolloin kaikki käyttäjän muutokset — kuten kirjoitettava viesti — katoavat. Yksi ratkaisu olisi pitää viestejä erillisellä sivulla iframessa ja kaikkea muuta sen ulkopuolella, jolloin päivitys rajoittuisi viesteihin.

<?php # chat.php
include('funktiot.php');
header("Refresh: 10"); # Päivitetään sivua, jotta chat pyörii
aloita(); # session_start tms.
tulosta_sivun_ylaosa();
if (!kirjautunut()) {
	tulosta_kirjautumislaatikko();
} else {
	tulosta_kirjoituslaatikko();
	tulosta_viestit();
}
tulosta_sivun_alaosa();
?>
<?php # kirjaudu.php
include('funktiot.php');
aloita(); # session_start tms.
if (kirjautunut()) {
	die("Olet jo kirjautunut!\n");
}
if (empty($_POST['tunnus'])) {
	die("Tunnus puuttuu!\n");
}
if (empty($_POST['salasana'])) {
	die("Salasana puuttuu!\n");
}
if (!kirjaudu($_POST['tunnus'], $_POST['salasana'])) {
	die("Virheelliset käyttäjätiedot!\n");
}
# Palataan chattiin
header('Location: http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/chat.php');
?>
<?php # laheta.php
include('funktiot.php');
aloita(); # session_start tms.
if (!kirjautunut()) {
	die("Kirjaudu ensin!\n");
}
if (viesti_lahetetty()) {
	tallenna_viesti();
}
# Palataan chattiin
header('Location: http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/chat.php');
?>
<?php # funktiot.php
function aloita()
{
	session_start();
}
function tulosta_sivun_ylaosa()
{
	echo '<?xml version="1.0" encoding="utf-8"?>'."\n";
	echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'."\n";
########
?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi" lang="fi">
<head>
<title>Khat</title>
</head>
<body>
<?php
########
}
function tulosta_sivun_alaosa()
{
	echo '</body></html>';
}

function tulosta_kirjautumislaatikko()
{?>
	<form action="kirjaudu.php" method="post">
	<p>Kirjaudu:</p>
	<p>Tunnus: <input type="text" name="tunnus" /></p>
	<p>Salasana: <input type="password" name="salasana" /></p>
	<p><input type="submit" name="lah" value="Lähetä!" /></p>
	</form>
<?php
}
function tarkista_md5($tunnus, $md5_salasana)
{
	# Tiedosto muodossa "tunnus\nsalasana\n..."
	$f = file('tunnukset.txt');
	for ($i = count($f); $i > 1;) {
		$s = trim($f[--$i]);
		$t = trim($f[--$i]);
		if ($t === $tunnus && md5($s) === $md5_salasana) {
			return true;
		}
	}
	return false;
}
function kirjaudu($tunnus, $salasana)
{
	# $salasana .= "NaCl tms. suola";
	$md5_salasana = md5($salasana);
	if (!tarkista_md5($tunnus, $md5_salasana)) {
		return false;
	}
	$_SESSION['md5_salasana'] = $md5_salasana;
	$_SESSION['tunnus'] = $tunnus;
	return true; # Kirjautuminen onnistui
}
function kirjautunut()
{
	# Hyödynnetään tarkistuksessa aiempaa funktiota
	return tarkista_md5($_SESSION['tunnus'], $_SESSION['md5_salasana']);
}

function tulosta_kirjoituslaatikko()
{
?>
	<form action="laheta.php" method="post">
	<p>Kirjoita viestisi:</p>
	<textarea name="viesti" rows="3" cols="60"></textarea>
	<p><input type="submit" name="lah" value="Lähetä!" /></p>
	</form>
<?php
}
function viesti_lahetetty()
{
	return isset($_POST['viesti']); # Jos on viesti, niin sitten on. :)
}

# Oikeastihan viestit tallennettaisiin tietokantaan tai jaettaisiin edes jotenkin järkevästi, ettei viestitiedosto kasva liikaa. Tässä nyt kuitenkin näin.
function tallenna_viesti()
{
	$v = base64_encode( $_SESSION['tunnus']) .' '. base64_encode( $_POST['viesti']);
	$f = fopen('viestit.txt', 'a');
	fwrite($f, $v."\n");
	fclose($f);
}
function tulosta_viestit($lkm = 40)
{
	$t = file('viestit.txt');
	$j = count($t) - $lkm;
	if ($j < 0) {
		$lkm += $j;
		$j = 0;
	}
	for ($i = 0; $i < $lkm; ++$i) {
		list($lah, $v) = explode(' ', $t[$j + $i], 2);
		$lah = htmlspecialchars( base64_decode($lah));
		$v = htmlspecialchars( base64_decode($v));
		echo "<p><em>$lah</em>: $v</p>\n";
	}
}
?>

Edit. Muokattu toimivaksi. :)

Aeklus [09.03.2008 20:52:58]

#

Mitä kaikkia filuja tuossa pitää luoda, ja mille arvoille chmodata ne? :).
Html koodit voin itse värkätä sitten tuohon.

Antti Laaksonen [09.03.2008 21:37:11]

#

Tässä on vielä toinen esimerkki chatista, joka on melko lyhyt mutta ominaisuuksiltaan puutteellinen. Kuitenkin tästä pitäisi selvitä chatin toteutuksen perusidea. Selain jaetaan kehysten avulla kahteen osaan, joista ylemmässä näkyvät viestit ja alemmassa näkyy kirjoituslomake. Viestisivun alussa on metatagi, joka aiheuttaa sivun päivityksen kahden sekunnin välein. Näiden lisäksi tarvitset tiedoston viestit.txt, johon pitää antaa kirjoitusoikeus. Tiedostossa ovat kaikki chatiin lähetetyt viestit, mutta niistä näytetään vain 20 uusinta.

*** chat.html
<frameset rows="80%, 20%">
<frame src="viestit.php">
<frame src="kirjoitus.php">
</frameset>
*** viestit.php
<?php
// päivitys 2 sekunnin välein
echo "<meta http-equiv=\"refresh\" content=\"2\">";
// luetaan viestit tiedostosta
$viestit = file("viestit.txt");
// näytetään 20 uusinta viestiä
for ($i = 20; $i > 0; $i--) {
    $kohta = count($viestit) - $i;
    if ($kohta >= 0) {
        echo $viestit[$kohta] . "<br>";
    }
}
?>
<?php
if ($_POST["viesti"] <> "") {
    $tied = fopen("viestit.txt", "a");
    fwrite($tied, $_POST["viesti"] . "\r\n");
    fclose($tied);
}
?>
<form action="kirjoitus.php" method="post">
<input type="text" name="viesti">
<input type="submit" value="Lähetä">
</form>

Dude [09.03.2008 22:07:08]

#

Auttaisko tämä:https://www.ohjelmointiputka.net/koodivinkit/25082-php-lootapalaute

pistemies [09.03.2008 22:41:06]

#

Aeklus kirjoitti:

Mitä kaikkia filuja tuossa pitää luoda, ja mille arvoille chmodata ne? :).
Html koodit voin itse värkätä sitten tuohon.

Kannattaa hiukan tutustua PHP:n chmod-ohjeisiin.
Kaikki tiedostot, joihin kirjoitetaan jotakin, pitää chmodata riittävästi, palvelimesta riippuen 0666 tai 0664.
Hakemistot, joissa kirjoitettavat tiedostot sijaitsee, pitää chmodata 0775 tai 0777 polun ylimmästä hakemistosta alkaen (tämäkin on palvelin-kohtainen, olen huomannut). Hakemistojen suhteen sama pätee, jotta voisi luoda tiedostoja määrättyyn hakemistoon.

Wizard [10.03.2008 16:13:40]

#

Pekka Mansikka kirjoitti:

Kannattaa hiukan tutustua PHP:n chmod-ohjeisiin.
Kaikki tiedostot, joihin kirjoitetaan jotakin, pitää chmodata riittävästi, palvelimesta riippuen 0666 tai 0664.
Hakemistot, joissa kirjoitettavat tiedostot sijaitsee, pitää chmodata 0775 tai 0777 polun ylimmästä hakemistosta alkaen (tämäkin on palvelin-kohtainen, olen huomannut). Hakemistojen suhteen sama pätee, jotta voisi luoda tiedostoja määrättyyn hakemistoon.

Ihan pakko päteä hieman: kun ja jos modaat oikeudet 0777, niin avaat palvelimen hakemisto koko maailmalle kaikilla oikeuksilla - hakkerille se on sama kuin "tervetuloa ja toivottavasti viihdyt - tallenna mitä vaan ja aja mitä vaan". Linuxissa apache palvelin kannattaa ajaa sellaisella tunnuksella joka on (mieluiten) hakemistojen omistaja jolloin modauksia EI tarvita. Esimerkiksi oletuksena taitaa olla 'nobody' jolloin varmasti kerää ongelmia itselleen juuri hakemisto-oikeuksien muodossa kun availee turhaan noita oikeuksia.

Toinen asia on se, että nuo tiedostot jotka ovat "tietosäilöjä", tulisi sijoittaa julkisen puolen ulottumattomiin eli pois julkisesta hakemistosta jonnekin toiseen hakemistoon. Tämähän on idea esimerkiksi MVC -mallissa.


--W--

Blaze [10.03.2008 17:01:46]

#

Pekka Mansikka kirjoitti:

Aeklus kirjoitti:

Mitä kaikkia filuja tuossa pitää luoda, ja mille arvoille chmodata ne? :).

Kannattaa hiukan tutustua PHP:n chmod-ohjeisiin.
Kaikki tiedostot, joihin kirjoitetaan jotakin, pitää chmodata riittävästi, palvelimesta riippuen 0666 tai 0664.

Satunnainen avautuminen:
Mua ärsyttää kun ihmiset puhuu "chmodaamisesta", niinku se ois jotain salatiedettä. Sitähän se ei oo, vaan Unix-tyylisissä käyttöjärjestelmissä komennon, jolla vaihdetaan tiedoston oikeuksia, nimi sattuu vain olemaan chmod (CHange MODe).
Siis toistan: "chmod" ei tee mitään ihmeellistä, se vain muuttaa tiedoston käyttöoikeuksia.

Puhukaa ihmiset mieluummin "oikeuksien antamisesta" kuin "chmodaamisesta", kiitos.

php-Niko [12.03.2008 08:43:33]

#

Sori OT, mutta vaivaa yksi asia.:

A.L. laittoi 'Viestit.php' mallin ja siinä mua vähän ihmetyttää. Tuossa lisäät tuon metan ilman <head>:ia ? Kai se noinkin käy, mutta ihmetyttää vaan kun tuossa ei ole mitään muuta.
oikeastihan se menisi kuitenkin näin:

<html>
<head>
<title>Asd</title>
<meta http-equiv="refresh" content="2">
</head>
...

Sori kuitenkin OT.

Antti Laaksonen [12.03.2008 09:13:36]

#

Minusta ei kannata ottaa mallia, jos tavoittelee validia HTML-koodia. Yritän pitää esimerkit mahdollisimman yksinkertaisina, kun selaimet kuitenkin armahtavat näissä asioissa.

php-Niko [12.03.2008 15:12:11]

#

Selvä! Kiitti kuitenkin. Eipähän tarvitse enää pähkäillä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta