ugrás a tartalomhoz

Vendégkönyv lapozás

almasiweb · 2012. Már. 29. (Cs), 17.42
Üdv!
Csináltunk a suliba vendégkönyvet! illetve ott elkezdtük de miután hogy nekem is kellene a weblapomra így otthon folytattam, szóval megírtam hogy Mutassa az időt is, az ip címet mentse, Illetve kijavítottam a smyle-s hibát, és moderációs részt is csináltam.
Csak sajnos a lapozást még meg szeretném oldani ebbe kérnék segítséget, mert sajnos annyira még nem vagyok jó php-s hogy ez menjen (a többi a suliban tanultak miatt könnyen ment ) Köszönöm előre is a segítséget!

A kód: (write.php)
<?php
//1. rész
 $nick=$_POST["nick"]; 
 $hsz=$_POST["hsz"]; 

$datum  =   date("Y-m-d H:i:s");  
$ip=$_SERVER['REMOTE_ADDR']; //ip cím
$miles=array("<img src=msolygo.png></img>","<img src=vigyorgo.gif></img>","<img src=tok.png></img>");
$mit=array(":) ",":D",":P");
$xd=str_replace($mit,$miles,$hsz); //smyle csere

$tiltott=array("csúnya","ronda");
$modera=array("*modera*","*buta*");
$modi=str_replace($tiltott,$modera,$xd); //üzenet moderálás
$modinev=str_replace($tiltott,$modera,$nick); // név moderálás


    //[b] bbcode-félkövér
    $modi = preg_replace("/\[admin\](.*)\[\/admin\]/","<strong>$1</strong>",$modi);
	

 if (empty($nick)||empty($hsz))
 {
 print("Minden mezőt kikell tölteni <a href=index.html>Vissza</a>");
 }
 
 
//2. rész
 else
 {
 $nick=strip_tags ($nick, '<. a><. b><. i><. u>');
  $hsz=strip_tags ($hsz, '<. a><. b><. i><. u>');
  
  //3. rész
  $fajl=fopen("hszol.txt", "a");
  fputs($fajl, "$modinev|$datum|$modi|$ip#");
  fclose($fajl);
  header("Location: read.php");}
  ?>
  
Read.php
<?php>
//1. rész
print ("<body bgcolor=000000><center><font size=2><stong><br>Vendégkönyv</center></font></strong>");
$fajlnev="hszol.txt";
$fajl=fopen($fajlnev, "r");
$meret=filesize("hszol.txt");
$kiir=fread($fajl, $meret);
//2. rész

$modi=explode("#", $kiir);
$hsznum=count($modi);

//3.rész

for ($x=$hsznum-2; $x >0; $x=$x-1)
{
$a=explode("|", $modi[$x]);
print("<table align=center width=400px border=0><tr><td bgcolor=grey><strong>Nick:</storng>$a[0].$a[1]-$a[3]</td></tr><tr><td bgcolor=white>$a[2]</td></tr></table>");
}?>
<a href="index.html"><center><font color=white size=2><strong>Üzenet írása</strong></center></a>
Index.html (ez majd összelesz vonva php-vel később, csak suliban így kérték)
<form action="write.php" method="POST">
Nicknév <input type="text" name="nick"><br>
Hozzászólás <input type="text" name="hsz"><br>
<input type="Submit" value="küld"><br>
</form>
Előre is köszönöm!
 
1

A könnyebbik lehetőség nem

kuka · 2012. Már. 29. (Cs), 17.59
A könnyebbik lehetőség nem jöhetne szóba? Mármint az adatbázis használata.

Nemcsak a lapozót lehet könnyebben összedobni vele, hanem az adatok épségét sem kockáztatod. (Mint látom nem használsz lockot, márpedig a moderálásnál újraírásnak is lennie kellene és annak a lockját itt is vizsgálni kellene.) Emellett ha kedved tartja majd keresni, sorba rendezni, IP cím szerint csoportosítani, az is könnyebb lesz adatbázissal.
2

Hát adatbázist meg még csak

almasiweb · 2012. Már. 29. (Cs), 18.56
Hát adatbázist meg még csak most kezdtünk tehát azért lett ebben írva. lehet hogy jobb lenne azzal nem tudom de egyenlőre szerintem jó így mert ha aztán meg hasonló feladatot
Illetve esetleges költözéskor jobb ez szerintem hogy nem kell az adatbázissal sem kínlódni.
Illetve sok idő lenne átírni szerintem, és azért már a nagyobb része kész.
3

már a nagyobb része

kuka · 2012. Már. 29. (Cs), 19.25
már a nagyobb része kész.
Bocs, de szerintem nem volna kár újraírni. Bár lehet, hogy most még korai volna, pár hónapot még kellene előtte tapasztaljál. De nem tök egyedül kellene csináld, a Weblabor tagjai irányíthatják lépteidet.

Ahogy elnézem, még az is összezavarná a szkriptet ha a látogató használná a mezőelválasztó | és a bejegyzés elválasztó # karaktereket valamely űrlapmezőben. Adatbázis használata esetén az ilyen elválasztókkal sem volna gond.

Ezen kívül például arra sincs védelem, hogy a látogató ne másolhassa be például Arany János Toldi trilógiáját.
4

Hát ebben igazad van, csak

almasiweb · 2012. Már. 29. (Cs), 20.44
Hát ebben igazad van, csak sajnos már nagyon kellene a weblapra mert ami most van az elég furcsa (néha nem lehet üzit küldeni stb. és mindenki utál egy üzit 2 beírni.) Plusz azt írnak bele amit akarnak sajnos. Később nyilván énis az adatbázisra gondoltam pláne ennyi érv után.

a Elválasztókról igazad van. De gondolom az is tiltható mint pl az <a> kód is.

Toldi dolog: az is jogos. az a rész kimaradt egyenlőre de az egy egyszerű űrlap tulajdonsággal kiküszöbölhető.

Úgy hogy kérek titeket hogy ebben a formában is segítsetek köszi előre is.:)
6

Legyen. Persze a szép

kuka · 2012. Már. 30. (P), 09.22
Legyen. Persze a szép megoldás az volna amit Poetro felvázolt, de attól tartok az még kissé meredek volna neked.

Sajnos a magyarázás nem az erősségem, úgyhogy inkább kiegészítettem a kódodat a lapozóval. Olvasd át, változtass benne és figyeld mi hogyan romlik el tőle, majd ha szükséges, kérdezz.

<h1>Vendégkönyv</h1>

<table>
<?php

$lap = intval($_GET['lap']);
$perlap = 10;

//1. rész
$fajlnev="hszol.txt";
$fajl=fopen($fajlnev, "r");
$meret=filesize("hszol.txt");
$kiir=fread($fajl, $meret);

//2. rész
$modi=explode("#", $kiir);
$hsznum=count($modi) - 1;
$lapszam = ceil($hsznum / $perlap);
if ($lap < 1 || $lap > $lapszam) $lap = 1;

//3.rész
for ($i = 0; $i < $perlap; $i++) {
  $hszam = $hsznum - ($lap - 1) * $perlap - $i - 1;
  if ($hszam < 0) break;
  $a=explode("|", $modi[$hszam]);
  print "<tr><td>Nick: $a[0].$a[1]-$a[3]</td>\n</tr><tr><td>$a[2]</td></tr>\n";
}

?>
</table>

<p>
<?php

if ($lap) {
  echo '<a href="', $_SERVER['PHP_SELF'], '?lap=0">első</a>', "\n";
  echo '<a href="', $_SERVER['PHP_SELF'], '?lap=', $lap - 1, '">előző</a>', "\n";
}

for ($i = 1; $i <= $lapszam; $i++ ) {
  if ($i == $lap) echo '<b>', $i,  '</b>', "\n";
  else echo '<a href="', $_SERVER['PHP_SELF'], '?lap=', $i, '">', $i, '</a>', "\n";
}

if ($lap < $lapszam) {
  echo '<a href="', $_SERVER['PHP_SELF'], '?lap=', $lap + 1, '">következő</a>', "\n";
  echo '<a href="', $_SERVER['PHP_SELF'], '?lap=', $lapszam, '">utolsó</a>', "\n";
}

?>
</p>

<a href="index.html">Üzenet írása</a>
Az eltüntetett elavult és hibás formázások és díszítések pótlására használj CSS-t.
7

Köszönöm szépen. Igen igen Át

almasiweb · 2012. Már. 30. (P), 11.17
Köszönöm szépen.
Igen igen Át olvasom és változtatom.
Természetesen CSS lesz hozzá berakva-ez csak ilyen suliba csinált Test kinézet.

Amúgy valamiért nem jó.
Parse error: syntax error, unexpected T_DNUMBER in F:\xampplite\htdocs\zsolt\vende\read.php on line 6
9

Parse error: syntax error,

kuka · 2012. Már. 30. (P), 11.27
Parse error: syntax error, unexpected T_DNUMBER in F:\xampplite\htdocs\zsolt\vende\read.php on line 6
Mármint, hogy a $lap = intval($_GET['lap']); sor? Érdekes. A fentebbi kódomat kimásoltam innen a Weblaborról és még mindig működik. Változtattál már rajta valamit? Ha igen, mutasd.
10

Igen az a sor. Nem lett

almasiweb · 2012. Már. 30. (P), 11.37
Igen az a sor.
Nem lett módosítva semmi
11

Hát én abban a sorban csak

kuka · 2012. Már. 30. (P), 11.59
Hát én abban a sorban csak egy notice-ra látok okot. Mivel jobb ötletem nincs, egyelőre szüntessük meg a notice okát, aztán még gondolkozunk. Azt a 6. sort cseréld ki erre:

$lap = isset($_GET['lap']) ? intval($_GET['lap']) : 0;
12

Na az érdekes hazaértem és

almasiweb · 2012. Már. 30. (P), 15.13
Na az érdekes hazaértem és itthon meg jó volt, tehát az működik. de amit adtál másik kódot az is jó
Most már csak annyi segítség kellene hogy azt a két elválasztót (# | ) valahogy tiltani hogy a azt írjuk be akkor azt ne vegye figyelembe így mint a <a> esetén pl hogy egyszerűen azt nem írja.

a másik gondot meg a MAXLENGTH dologgal megoldom :) az űrlaposat hogy bármennyi szöveg írjható
13

Nem jó

Poetro · 2012. Már. 30. (P), 15.36
A MAXLENGTH alatt nem tudom, mire gondolsz. Ugyanis bármi is van beállítva a HTML-ben azt egy kattintás kikapcsolni. Szóval ezzel ne nagyon számolj. Az elválasztó karaktereket meg valahogy escapelni kellene, és egy kicsit összetettebb szétszedést kellene alkalmazni, mondjuk egy preg_split vagy hasonló képében.
14

Most már csak annyi segítség

kuka · 2012. Már. 30. (P), 15.58
Most már csak annyi segítség kellene hogy azt a két elválasztót (# | ) valahogy tiltani hogy a azt írjuk be akkor azt ne vegye figyelembe így mint a <a> esetén pl hogy egyszerűen azt nem írja.
Én inkább egy olcsó megoldást választanék: az illető karaktereket HTML karakter entitásként írnám be. Így a megjelenítéskor nem lesz velük plusz munka, az állományba meg nem lesznek benne. A lecserélésük pedig így nézne ki, mondjuk a moderálás után beszúrva:

$modi=str_replace(array('#','|'),array('&#35;','&#124;'),$modi);
$modnev=str_replace(array('#','|'),array('&#35;','&#124;'),$modnev);
Egyetlen gond: a HTML karakter entitások maguk is tartalmaznak # karaktert, ezért azt lecserélném mondjuk @-ra. Az HTML karakter entitásként úgy néz ki, hogy &#64;. Próbáld megejteni a cserét, ha gond akad, kérdezz.

Persze ismét Poetro írta a szép megoldást, de a reguláris kifejezések ilyen böhöm nagy szövegek esetében nem éppen a leggyorsabbak. Főleg, hogy kellene bele egy kis negatív look-behind assertion.
a másik gondot meg a MAXLENGTH dologgal megoldom :) az űrlaposat hogy bármennyi szöveg írjható
Arra ne alapozz. Az csak útmutatás, nem tiltás. A webprogramozás első számú szabálya: soha se bízz a kintről jövő adatokban. Mi van akkor ha nem is böngésző áll a kapcsolat túloldalán, hanem egy telnet kliens amibe azt ír be a felhasználó amit csak akar?
16

Ok ez megvan. Még három

almasiweb · 2012. Már. 30. (P), 19.02
Ok ez megvan.
Még három kérés

1.) Ha http://valami.hu/ akkor az átalakítható linké amivel megnyitható Új lapon, (persze ha sértő szó akkor a http://modera.hu cím legyen :D)

2.) Olyanra gondoltam hogy alapból ír egy szöveget a mező mondjuk hogy Nicknév ha rákattintok eltűnik a szöveg. Javasript kódot láttam már rá de azt a Write.php-be kellene de a header meg nem örül a html js kódoknak

3.) Jelenleg úgy van hogy ha nem írunk be egy mezőt akkor kiad egy új oldalt egy szöveggel ami csúnya fehér meg minden azt szeretném párbeszéd panelra tenni úgyszintén ugyanaz a gondom mint az elébb a header miatt.

Köszönöm előre is !
18

Ami a linkesítést

kuka · 2012. Már. 30. (P), 19.24
Ami a linkesítést illeti:

$modi = preg_replace('!https?://\S+!', '<a href="$0" target="_blank">$0</a>', $str);
Ami a sértő szavakat illeti, szerintem felejtsd el. Úgysem lehet hatékonyan szűrni.

Ami a második pontot illeti, HTML5 megoldja. (Lásd a példakódot lentebb.)
Ami a JavaScriptes alternatívát illeti, nem értem miféle headernek volna köze hozzá és kinek nem tetszene.

Ami a ki nem töltést illeti, HTML5 szintén megoldja:

<input type="text" name="nick" placeholder="Nicknév" required><br>
<input type="text" name="hsz" placeholder="Hozzászólás" required><br>
A JavaScript ellenőrzés persze megoldást jelentene olyan böngészők esetében amelyek nem ismerik a HTML5 újításait. Viszont mint írtam, úgyis le kell ellenőrizni mindent szerver oldalon.

Plusz egy kérdés: a hozzászólás mező miért nem textarea? Általában azt szokták ilyen esetben használni.
19

Na ez is jó ! Azért nem

almasiweb · 2012. Ápr. 1. (V), 18.42
Na ez is jó !
Azért nem textarea mert suliba nem úgy kérték de azt majd átírom

Következő kérés most már tényleg ez a utolsó :)

Felvénnék még egy űrlapot weblap hoz (űrlap kódba berakni php-n bekérve az változóba $web)az lenne a kérdésem hogy olyan kellene hogy ha abba az űrlapba webcímet írunk akkor az is megnyitható legyen de oly módon hogy ha rá kattintunk a névre tehát a akkor lehessen megnyitni. (új lapon)

Tehát van egy név mező ugye meg lenne egy web mező és ha valaki ír a web mezőbe akkor a akkor a küldés után a név re kattintva ugrana elő a weblap.

köszi előre is!
20

Bocs, de ez most az a

kuka · 2012. Ápr. 1. (V), 18.53
Bocs, de ez most az a pillanat mikor kikívánkozik a kérdés: mit próbáltál és hol akadtál el?
21

az mégse fontos az a neves

almasiweb · 2012. Ápr. 2. (H), 10.54
az mégse fontos az a neves link, legalábbis most a főadmin azt mondta (Suliba kezdtük el de gondoltam felrakom a webemre -ha már csináltuk, mért is ne- és ez egy Gta Játékszerverre webjére megy majd-admin jogért csinálgatom a webet :))

amúgy mondtad azt a moderálásos dolgot az azért kell mert ez egy játék szeró weblapra megy és ha valakit bannolunk akkor elkezdi az adminokat szidni meg ilyenek. és legalább a csúnya szavak többségit szűröm úgy már jó. Bár ez is kijátszható pl ha a szóba tesz de ha már 10 esetből 8. nak nem sikerült kiírnia amit akart már jó.

Amúgy kérdés az hogy a localhoston jól mutatja az időt de ha felrakom tárhelyre ott már több órás eltérés van (pl 10:43-kor írtam az üzit de ő csak 04:43-at mutat. Ez szerver oldali idő beállítási hiba? Valahogy javítható mondjuk időzónával vagy bármivel?
22

Próbáld ezt tenni a szkript

kuka · 2012. Ápr. 2. (H), 12.07
Próbáld ezt tenni a szkript elejére:

date_default_timezone_set('Europe/Budapest');
Ami a szűrést illeti, te például a „csúnya” szavat távolítottad el. De mi van ha a troll hadilábon áll a helyesírással („csunya”), mondatot kezd („Csúnya”), ordít („CSÚNYA”), szótagol („csú-nya” esetleg „c-s-ú-n-y-a”), módosított betűket használ („(*)” – matematikai dupla vonásos betűk), idegen írásrendszerek betűit használja („сѕциүа” – cirill betűk). Ezekben az esetekben az írás könnyen olvasható marad de a szűrőn nem akad fent. Persze mindezt lehet kombinálni is, esetleg leet átírással is rondítani („(5ú|\|y4”). Ezért én nem fektetnék munkát az ilyen szűrőbe.

(*) – Ezt a Weblabor elkúrja. Előnézetnél még rendben, de mentés után itt levágja a szöveget végét.
23

OK működik. köszi. a

almasiweb · 2012. Ápr. 3. (K), 14.32
OK működik. köszi.

a moderálásban igazad van kipróbáltam :) Arra gondoltam hogy egy admin.php-t csináltam amin lesz a vendégkönyv meg valami jelszóval védett fájl lesz vagy egy belépő rendszeres Utóbbihoz van már forrásom(még évekkel ezelőtt találtam) és akkor azon az admin.php-n lenne egy piros x amivel az adott sort lehet törölni. Bár nem tudom hogy ilyet lehet-ne e

Ha csak nincs valami egyszerűbb megoldás a problémára. Mert hogy a txt ből törölgetni a sok üzenet után már problémásabb lenne főleg amilyen átláthatatlan tud lenni. Korábbi ip címet tároló txt-ből jól tudom.
24

Mert hogy a txt ből

kuka · 2012. Ápr. 3. (K), 14.57
Mert hogy a txt ből törölgetni a sok üzenet után már problémásabb lenne főleg amilyen átláthatatlan tud lenni.
Hát erre csak azt írhatom, hogy ennek nem kell feltétlenül így lennie. Én utolsó lehetőségként sem gondoltam volna arra a # és | elválasztós formátumra. Például ilyen formátumban tárolt vendégkönyv szövegszerkesztővel is könnyen idomítható:
1.1.1.1 2012.01.01 http://elso.hu/ Első név
Első beírás a vendégkönyvbe.

* Dupla üres sor határolja bejegyzéseket.
* Első sor meta adat, a többi a bejegyzés szövege.
* A bejegyzés első és utolsó sora nem lehet üres, dupla üres sor nem lehet.
* A szimpla üres sor bekezdés elválasztó.


2.2.2.2 2012.02.02 http://masodik.hu/ Második név
Második beírás a vendégkönyvbe.


.
(A . csak azért van ott, hogy a Weblabor BBCode nyekergetője ne tüntesse el a záró dupla üres sort.)

Amit admin.php ügyben írtál, nem értem. Azt hittem az már készen van, legalábbis a korábbi „moderációs részt is csináltam” szavaidból úgy értettem, hogy az már megvan.
25

Értem, Kész az admin.php de

almasiweb · 2012. Ápr. 3. (K), 19.40
Értem, Kész az admin.php de az avval a moderációval csak amit írtam hogy ha beírjuk hogy csúnya akkor át írja de az mint kiderült az nem valami jó pl akkor már csak akkor se ha egy betűt nagy betűvel ír a szóból.

Most azzon gondolkodom hogy esetleg a sértő dolgokat tartalmazó sört törölni. És akkor történhetne weben nem kéne jegyzet tömbözni. És így akkár a többi adminból is lehetne moderátor.
ezt találtam de sajnos nem megy
if ($_GET['muvelet'] == 'torol')
{
     if ($_GET['mit'])
     {
          $fajl = 'hszol.txt';
          $fajl_ertek = file_get_contents($fajl);
          $torol = trim($_GET['mit']);

          if (strstr($file_ertek, $torol)){
               $csere = str_replace($torol,'',$fajl_ertek);
               $megnyit = fopen($fajl, 'w');
               flock($megnyit, LOCK_EX);
               fwrite($megnyit, $csere);
               flock($megnyit, LOCK_UN);
               fclose($megnyit);
               echo 'sor törölve...'.$torol.'';
          }else{
               echo 'nem talalhato a keresett sor:  '.$torol.' ';
          }
     }
}

?>
26

ezt találtam de sajnos nem

kuka · 2012. Ápr. 4. (Sze), 10.12
ezt találtam de sajnos nem megy
Szerintem megy, legfeljebb nem úgy ahogy használni próbálod. szkript.php?muvelet=torol&mit=csúnya formában lekérve kitörli a „csúnya” szót az adatállományból.

Remélhetőleg előtte van valamicske ellenőrzés is, mert így bárki bármit kitörölhet. Ha pedig pont a bejegyzés vagy mező elválasztókat törlik, akkor egyetlen mozdulattal tönkretették az adatállományt.
27

Hát nem találja

almasiweb · 2012. Ápr. 4. (Sze), 16.01
Hát nem találja sort
Csináltam egy text.txt beírtam az url címit torol.php?muvelet=torol&mit=valami és nem törötlte hanem kiírta hogy nincs ilyen sor vagy mi és a valami szó volt a 1. sorban tehát megkéne etalálnia
28

Az csak azért történik, mert

kuka · 2012. Ápr. 4. (Sze), 17.15
Az csak azért történik, mert helyesírási hiba van az if feltételében: $fajl_ertek helyett $file_ertek.
29

Na énis visszatértem csak a

almasiweb · 2012. Ápr. 10. (K), 18.10
Na énis visszatértem csak a szünetben nem értem rá :)
Ok jogos, köszi és működik is!
Most egy ip tiltót csinálok.

Van egy ilyen kódom:
<?php
$ip[] = "127.0.0.1";
$ip[] = "1.1.1.1";
if(in_array($_SERVER['REMOTE_ADDR'], $ip))
die("<center><br><br><br><br><br>Sajnálom, erről a számítógépről nem tekintheti meg az oldalt!</center>");


?>
Ezzel az a gond hogy ha tárhelyere rakom akkor az ip-t nem jól mutatja ezt üzeneteknél mentet ip-knél vettem észre. Ott javítottam is egy ilyennel.
if (@getenv("HTTP_X_FORWARDED_FOR")) $ip = @getenv("HTTP_X_FORWARDED_FOR");  
else $ip = @getenv("REMOTE_ADDR");
Miután hogy csak ezzel mutatja jól. Így ezt kellene valahogy összevonni a tiltásnál if(in_array($_SERVER['REMOTE_ADDR'], $ip))helyett a második kódot használja és működjön is a tiltás.

Meg még azon gondolkodom hogy űrlappal felvenni az tiltott ip-ket (most tárhelyről kéne php fáljba írni. az admin.php-ben de először az ip cím tiltás működjön most az a fontosabb! :)
köszönöm előre is :)
30

Hát először is én az $ip

kuka · 2012. Ápr. 10. (K), 18.35
Hát először is én az $ip tömbnek valami beszédesebb nevet adnék, például $tiltott. Ezután a szükséges változtatások már logikusan következnek:

<?php
if (@getenv("HTTP_X_FORWARDED_FOR")) $ip = @getenv("HTTP_X_FORWARDED_FOR");
else $ip = @getenv("REMOTE_ADDR");

$tiltott = array("127.0.0.1", "1.1.1.1");
if (in_array($ip, $tiltott))
  die("<center><br><br><br><br><br>Sajnálom, erről a számítógépről nem tekintheti meg az oldalt!</center>");
?>
31

Oké köszi Én valahogy

almasiweb · 2012. Ápr. 10. (K), 20.35
Oké köszi
Én valahogy összeakartam vonni @ elé beírtam az in_array meg ilyenek. Tényleg sokat kell még tanulgatni ebből :)

Másik olyat lehet hogy a $tiltott tömböt űrlappal is felesen tölteni. Néztem a php 24 órát meg a netet is de nem találtam hasonlót :)
5

Elválasztó

Poetro · 2012. Már. 29. (Cs), 21.19
Először is, szükséged lenne egy elválasztóra, ami elválasztja egymástól az üzeneteket. Ezek után meg kell valahogy számolnod, hogy mennyi ilyen elválasztó karakter(sorozat) van a fájlban, majd ezt érdemes eltárolni valahova, hogy ne kelljen minden alkalommal az egész fájlt beolvasni. Ha lehet érdemes lehet eltárolni bájt szinten, hol kezdődnek az egyes üzenetek, mert ekkor már csak erre a bájtra kell lépni, majd beolvasni onnan X bájtnyi adatot (egy üzenet), majd a következőt stb. Ekkor ugye ha a 100. oldalon vagy akkor nem kell újból beolvasni a teljes fájlt, hogy megtaláld, hol található az ezredik üzenet (mondjuk oldalanként 10 üzenet megjelenítése esetén).

Azaz amire igazából szükséged van, az egy index fájl. Ez eltárolja, mennyi üzeneted van, és hogy az egyes üzenetek hány bájtot foglalnak. Ekkor csak ezen a jóval kisebb fájlon kell végigmenni, ami ha ideálisan tárolod a számokat (mondjuk 4-8 bájton), akkor már a fájl méretéből meg lehet mondani, hogy mennyi üzenet van, illetve mivel fix méreten van tárolva egy üzenet hossza, ezért a fájlban közvetlenül oda tudsz pozicionálni ahhoz az üzenetnek a hosszához, amire szükséged van. Azaz 4 bájtos üzenetméretekkel számolva, a 100. üzenet hossza a 400. bájton kezdődik, és 4 bájtot kell innen beolvasni, majd számmá alakítani.
8

Igen igen, köszönöm ezt is de

almasiweb · 2012. Már. 30. (P), 11.19
Igen igen, köszönöm ezt is de ahogy Kuka mondta ez még még meredek
15

Megírtam

Poetro · 2012. Már. 30. (P), 17.29
Megírtam. De nem feltétlen a legbiztonságosabb, de azért valószínűleg elég megbízhatóan működik.

<?php
// Felkészülés
$page = isset($_GET['page']) && is_numeric($_GET['page']) ? abs((int) $_GET['page']) : 0;
$index_name = 'index.bin';
$data_name = 'hsz.bin';
$message = '';

// Volt beküldve adat?
if (!empty($_POST['op'])) {
  // Minimális ellenőrzés
  if (empty($_POST['nick']) || empty($_POST['hsz'])) {
    $message = 'Adj meg nicknevet és hozzászólást';
  }
  else {
    // Megnyitjuk a fájlokat.
    if (($if = fopen($index_name, 'ab')) && ($hf = fopen($data_name, 'ab'))) {
      flock($if, LOCK_EX);
      flock($hf, LOCK_EX);
      // Lekérdezzük az aktuális fájlméretet, majd kiírjuk az adatokat.
      $filesize = filesize($data_name);
      $data = pack('LA32A*', 
        time(),
        str_pad(substr($_POST['nick'], 0, 32), 32),
        $_POST['hsz']
      );
      if (fwrite($hf, $data)) {
        fflush($hf);
        if (!filesize($index_name)) {
          fwrite($if, pack('L', 0));
        }
        fwrite($if, pack('L', $filesize + strlen($data)));
        fflush($if);
      }
      // Bezárjuk a fájlokat.
      flock($hf, LOCK_UN);
      flock($if, LOCK_UN);
      fclose($if);
      fclose($hf);
    }
    header('Location: hsz.php' . ($page ? '?page='. $page : ''));
    exit();
  }
}

// Lekérdezzük a hozzászólásokat.
$comments = array();
$count = is_readable($index_name) ? filesize($index_name) / 4 - 1 : 0;
$perpage = 10;
$maxpages = ceil($count / $perpage);

// Megnyitjuk a fájlokat.
if ($if = fopen($index_name, 'rb')) {
  fseek($if, $page * $perpage * 4);
  $index = array_values(unpack('L*', fread($if, ($perpage + 1) * 4)));
  // Ha már vannak hozzászólások, kiolvassuk őket.
  if (count($index) && ($hf = fopen($data_name, 'rb'))) {
    $ilen = count($index) - 1;
    for ($i = 0; $i < $ilen; $i++) {
      fseek($hf, $index[$i]);
      $data = fread($hf, $index[$i + 1] - $index[$i]);
      $comments[] = array_merge(
        unpack('L', $data), // dátum
        unpack('A32', substr($data, 4)), // nick
        unpack('A*', substr($data, 32)) // hozzászólás
      );
    }
  }
}
?>
<!DOCTYPE HTML>
<html lang="en-US">
<head>
  <meta charset="UTF-8">
  <title>Hozzászólások</title>
</head>
<body>
  <h1>Hozzászólások (<?php echo $count; ?>)</h1>
  <?php if (count($comments)): ?>
  <ol start="<?php echo $page * $perpage + 1; ?>">
    <?php foreach($comments as $i => $comment) : ?>
    <li>
      <div class="author">Beküldte:
        <?php echo htmlspecialchars($comment[1], ENT_QUOTES); ?>
        (<?php echo date('r', $comment[0])?>)
      </div>
      <div class="comment">
        <?php echo htmlspecialchars($comment[2], ENT_QUOTES); ?>
      </div>
    </li>
    <?php endforeach; ?>
  </ol>
  <?php endif; ?>
  <?php if ($count > $perpage) : ?>
    <ul>
      <?php if ($page > 0) : ?>
      <li><a href="hsz.php?page=<?php echo $page - 1; ?>">Előző</a></li>
      <?php endif; ?>
      <li><?php echo $page + 1; ?> / <?php echo $maxpages; ?></li>
      <?php if ($page < $maxpages - 1) : ?>
      <li><a href="hsz.php?page=<?php echo $page + 1; ?>">Következő</a></li>
      <?php endif; ?>
    </ul>
  <?php endif; ?>
  <form action="" method="post">
    <?php if ($message) : ?>
    <p><?php echo $message; ?></p>
    <?php endif; ?>
    <div class="form-item">
      <label for="nick">Nicknév:</label>
      <input type="text" id="nick" name="nick" />
    </div>
    <div class="form-item">
      <label for="hsz">Hozzászólás:</label>
      <textarea name="hsz" id="hsz" cols="30" rows="10"></textarea>
    </div>
    <div class="form-item">
      <input type="submit" name="op" value="küld" />
    </div>
  </form>
</body>
</html>
Szerintem amíg nem érted, addig jobb, ha nem használod, mert van benne pár érdekes dolog.
17

Köszönöm szépen neked is a

almasiweb · 2012. Már. 30. (P), 19.08
Köszönöm szépen neked is a segítséget már ugyan Kuka megírta, de elmentem ezt is később még jó lehet :)

Jó dolgok vannak benne
32

(Válasz a 31.

kuka · 2012. Ápr. 11. (Sze), 09.15
(Válasz a 31. hozzászólásra)
Másik olyat lehet hogy a $tiltott tömböt űrlappal is felesen tölteni.
Persze. Ugyanúgy ahogy űrlapból új hozzászólást lehet küldeni és azt egy PHP szkript beírja egy szöveges állományba majd egy másik PHP szkript kiolvassa onnan és felhasználja. Tök ugyanazt kell eljátszani a tiltott IP címekkel is, szóval kezdheted azzal, hogy másolatot készítesz a write.php-ról, majd a szükséges részeket átírod.

Itt már csak annyi változás lenne, hogy az eddigi deklaráció helyett file() függvénnyel állományból olvastatod be a $tiltott tömb tartalmát. Persze az állomány formátuma ehhez más kell legyen: minden IP cím külön sorban.
33

Oké értem erre a részre majd

almasiweb · 2012. Ápr. 13. (P), 19.41
Oké értem erre a részre majd később visszatérek.
Most meg megcsinálom az utolsó simításokat majd tesztelek. Ezt majd később ez annyira nem fontos egyenlőre! Eddig ilyen ingyenes vendégkönyv volt beágyazva. és csak 2 ip-t kellet tiltani január 1 óta azt meg egyenlőre beírható php fáljba is.
34

Illetve már csak a php-s

almasiweb · 2012. Ápr. 13. (P), 19.45
Illetve már csak a php-s űrlap hossz megadás érdekelne. mert mondtad hogy a html-esre ne alapozzak. mert ha telnet klienssel ír akkor gond van. Igazából csak annyit írni hogy túl hosszú üzenet tehát nem kell ilyen szétdarabolós izé köszi előre is :)

Másik felraktam tárhelyre
És lett egy olyan problémán hogy az ű és ő karakterek nem jelenleg meg természetesen ezt az egyik túl kedves tagunk észrevette Az árvíztűrő tükörfúrógép ből ez lett "árvízt&_369;r&_337; tükörfúrógép "
Kérdés ezt hogyan lehet orvosolni? Köszi előre is!
35

Ez tipikus karakterkódolási hiba,

Pepita · 2012. Ápr. 13. (P), 23.47
itt a WL-en sok-sok fórumtémát/cikket találhatsz róla.
Van ugye a content-type...charset... a HTML-ben, és van a php.ini-nek is default_charset, és mentetted a fájlokat is vmilyen kódolással. Ezeknek kell mind megegyezniük (pl. UTF-8).
37

Rendben köszönöm, sikerült is

almasiweb · 2012. Ápr. 16. (H), 09.47
Rendben köszönöm, sikerült is megoldani!
36

A maxlength HTML attribútumot

kuka · 2012. Ápr. 14. (Szo), 15.21
A maxlength HTML attribútumot azért írd csak be. Az inputba mindenképpen a textareaba csak HTML5 esetében, mert korábban nem volt. Ezzel a házirendet betartókat megkíméled a fölösleges üzenetektől.

A legegyszerűbb ha rögtön az elején ellenőrzöd és ha nincs rendben akkor le is állítod a feldolgozást:

<?php
//1. rész
$nick=$_POST["nick"];
$hsz=$_POST["hsz"];

$hiba = array();
if (strlen($nick) > 10) $hiba[] = 'a Nicknév legtöbb 10 karakter lehet';
if (strlen($hsz) > 100) $hiba[] = 'a Hozzászólás legtöbb 100 karakter lehet';
if ($hiba) {
  echo '<p>Ne szórakozz. Azt mondtam, hogy</p><ul>',
    implode("\n", array_map(function($v){return "<li>$v</li>";}, $hiba)),
    '</ul>';
  exit;
}
A 10 és 100 helyett persze olyan méretet írsz amilyet akarsz, csak egyezzenek a HTML maxlength attribútumokban használtakkal.

Persze ez nem a legszebb eljárás. Sokkal elegánsabb ha a vendégkönyv listázása, a beküldés űrlap és az új beírás feldolgozása egyetlen szkript által van lekezelve. Úgy mint Poetro megoldásában. De mivel nálad a beküldés űrlap még csak nem is PHP hanem statikus HTML, ezért a hibaüzeneteket nem lehet a hibás űrlapmezők mellett feltüntetni.
38

rendben köszönöm! Ez is jó is

almasiweb · 2012. Ápr. 16. (H), 10.01
rendben köszönöm! Ez is jó is lett! :)

Egy utolsó kérésem még lenne. Ugyanis ez a vendégkönyv nekem beágyazva van. És ha valaki bizonyos karakter mennyiséget egybe ír akkor kicsit szétesek az egész (konkrétan megjelenik a alsó oldalra görgetősáv. ami ronda. Ez a szövegnél nem probléma oda nem nagyon írnak szóköz nélkül illetve meg lehet oldani hogy bizonyos karakter hosz útán rakjon bele szóközt (ezt a weblaboron találtam ) de a linkkel probléma van ugyanis az nem bontható szét szóközökkel mert nem működne tehát valami ilyesmi kellene hogy a felhasználó beírja: (pl: http://weblabor.hu/forumok/temak/111723/hozzaszolas/87377) akkor valahogy átírná [Link] szóra így ez a probléma megoldódna.

Köszönöm előre is
39

Vagy egyszerűen törhetőre

kuka · 2012. Ápr. 16. (H), 14.17
Vagy egyszerűen törhetőre állítod CSS-ből:

.hozzaszolas {
  word-wrap: break-word;
  overflow-wrap: break-word;
}
40

Oké beraktam Css-be De

almasiweb · 2012. Ápr. 16. (H), 19.07
Oké beraktam Css-be De valamiért nem tördel.
 print "<tr><td><font size=2,9px face=Arial><font color=#00FFFF><p class=hozzaszolas><b>$a[0]: </font></b>$a[2] <font color=#848283 size=2,3px><i>($a[1])</i> </p></font><hr></hr></td></font>\n</tr>";  
Próbáltam <p class <div class= illetve <div id= vel is a fentin kivül de úgyse
41

Ha szabványos megjelenítést

kuka · 2012. Ápr. 16. (H), 19.32
Ha szabványos megjelenítést vársz el a böngészőtől, akkor adj neki szabványos HTML-t.
Ömlesztett tag leves esetén csak találgatni fogja, hogy mit akarsz. Aztán vagy eltalálja, vagy nem.

Ez így nálam működik:

print "<p class=hozzaszolas><b>$a[0]:</b> $a[2] <i>($a[1])</i></p><hr>\n";
Persze jó volna kigyomlálni a HTML többi részét is. Első sorban a táblázatot valamint az elavult tageket és attribútumokat.
42

Ok, felraktam ezt Firefox ban

almasiweb · 2012. Ápr. 17. (K), 11.20
Ok, felraktam ezt Firefox ban jó-bár ahogy elnézem az alapból szét bontja normálisan (4.0.1 biztosan). Én Crome-t használok az nem bontja ezek után nem tudom (most suliban vagyok itt nincs crome) IE8 az továbbra sem bont.

Sajnos persze a látogatóim minden féle böngészőt használnak és igen meglepő módon még Internet Explorer 6!!!-is előfordul meg Firefox 3.6!!!



azt a korábban emlegetet [link] dolgot azt nehéz megcsinálni?
43

Sajnos persze a látogatóim

kuka · 2012. Ápr. 17. (K), 12.02
Sajnos persze a látogatóim minden féle böngészőt használnak és igen meglepő módon még Internet Explorer 6!!!-is előfordul meg Firefox 3.6!!!
Ez nem kellene gond legyen. Can I use szerint a word-wrap támogatva van azokban a böngészőkben.
azt a korábban emlegetet [link] dolgot azt nehéz megcsinálni?
Nem. Ha a korábban közölt kódból indulsz ki, akkor pár másodperc.
44

Jó megvolt a linkes dolog :D

almasiweb · 2012. Ápr. 17. (K), 16.15
Jó megvolt a linkes dolog :D tényleg csak pár másodperc volt :)
Css-t hagyom az a linkes dolog után nem fontos már. :)

De most miután hogy kész lett a vendégkönyv, már csak finomítások vannak szeretném megköszönni minden segítséget amit kaptam, Nagyon szépen köszönöm! Sokat tanultam a PHP-ből.

Köszönöm a segítséget mindenkinek! Különösen a legtöbbet segítő Kuka-nak ! :)

Köszönöm még egyszer!
45

Tökéletesen működik az egész

almasiweb · 2012. Ápr. 26. (Cs), 14.07
Tökéletesen működik az egész jó kis "rendszer" lett belőle. csak most olyan probléma kezd lenni hogy sok lesz az oldal szám. Elég jó látogatottságú oldalról van szó, így két hét alatt már 20 oldal körül vagyunk, így olyat szeretnéd hogy így írja 1 2 3 ... 17 18 19 tehát az első 3.-at és az utolsó 3-at listázza a többit csak akkor írja ha a ... ra kattintok. Ezt hogy lehetne megoldani? Előre is köszönöm!
46

Kiszámolod

Poetro · 2012. Ápr. 26. (Cs), 14.17
Hát kiszámolod, hogy mennyi oldal van, és kiírod az aktuális oldal környezetét, és az utolsó oldal környezetét.
47

olyat szeretnéd hogy így írja

kuka · 2012. Ápr. 26. (Cs), 15.12
olyat szeretnéd hogy így írja 1 2 3 ... 17 18 19 tehát az első 3.-at és az utolsó 3-at listázza a többit csak akkor írja ha a ... ra kattintok.
Hát azt meg minek? A weben a legtöbb lapozó nem így működik. Én inkább a webes keresők és más népszerű oldalakon megszokott viselkedést valósítanám meg:

$kornyezet = 3; // új

if ($lap) {
  echo '<a href="', $_SERVER['PHP_SELF'], '?lap=0">első</a>', "\n";
  echo '<a href="', $_SERVER['PHP_SELF'], '?lap=', $lap - 1, '">előző</a>', "\n";
}

if ($lap > 1 + $kornyezet) echo "...\n"; // új
for ($i = max(1, $lap - $kornyezet); $i <= min($lapszam, $lap + $kornyezet); $i++ ) { // változott
  if ($i == $lap) echo '<b>', $i,  '</b>', "\n";
  else echo '<a href="', $_SERVER['PHP_SELF'], '?lap=', $i, '">', $i, '</a>', "\n";
}
if ($lap < $lapszam - $kornyezet) echo "...\n"; // új
  
if ($lap < $lapszam) {
  echo '<a href="', $_SERVER['PHP_SELF'], '?lap=', $lap + 1, '">következő</a>', "\n";
  echo '<a href="', $_SERVER['PHP_SELF'], '?lap=', $lapszam, '">utolsó</a>', "\n";
}
48

Igazad van! Ígyis jó sőt még

almasiweb · 2012. Ápr. 26. (Cs), 20.59
Igazad van! Ígyis jó sőt még jobb! :)

Nagyon szépen köszönöm ismét a segítséget !
49

Még egy utolsó kérdés, Ugye

almasiweb · 2012. Ápr. 27. (P), 17.05
Még egy utolsó kérdés, Ugye van a név mező amit egy változóba beolvastatom, hogy kitudja írni a nevet is. de minden egyes alkalommal újra bekkel írni a nevet :( magyarul nem menti el a nevet. Úgy tudom hogy azt Cokies (süti)-vel lehet megoldani, de egyáltalán miben érdemes JavaScript vagy PHP nyelven, bár szerintem php-ban jobb. Sajnos ez a rész amiről a suliban még egy betűt se tanultunk. Köszönöm előre is!
50

Úgy tudom hogy azt Cokies

kuka · 2012. Ápr. 27. (P), 17.30
Úgy tudom hogy azt Cokies (süti)-vel lehet megoldani, de egyáltalán miben érdemes JavaScript vagy PHP nyelven, bár szerintem php-ban jobb.
Úgy van, sütivel szokták megoldani. Leginkább úgy, hogy a űrlappal beküldött nevet elmentik sütibe, majd a következő űrlap generáláskor kezdőértékként kitöltik vele az űrlap mezőt.

A JavaScript vs. PHP dilemmád általában alaptalan: a sütik mindkét oldalon elérhetőek, ugyanis minden – a beállított feltételeknek megfelelő (domain, path, secure egyezés) – kérés fejlécében el vannak küldve a szerverre.

De mivel a te vendégkönyved esetében az űrlapot nem PHP generálja, ezért az űrlapmezőt kizárólag JavaScripttel lehet kitölteni. Ebben az esetben nem is volna szükség a sütire, amely a fentebb említett mechanizmusa miatt picit növeli a hálózaton küldözgetett adatmennyiséget. Helyette a localStorage bőven megfelel:

<form action="write.php" method="POST" onsubmit="localStorage['nick']=this.nick.value">
Nicknév <input type="text" name="nick"><br>
Hozzászólás <input type="text" name="hsz"><br>
<input type="Submit" value="küld"><br>
</form>

<!-- a dokumentum legalján: -->
<script>
document.forms[0].nick.value=localStorage['nick']
</script>
Amiért esetleg mégis volna létjogosultsága a süti használatnak, az az, hogy csak a PHP ellenőrzésén és moderálásán átesett nevet jegyezd fel, de ennek inkább csak esztétikai haszna van.
51

Nagyon szépen köszönöm

almasiweb · 2012. Ápr. 27. (P), 20.01
Nagyon szépen köszönöm segítséget, és a leírást is! :)

Köszönöm szépen!