ugrás a tartalomhoz

localhost-on nem tudok (a php script nem tud) .txt file-ba írni

HTibi · 2007. Már. 27. (K), 08.28
Egy vendégkönyv müködését bogarászom, ami txt-be menti a bejegyzéseket. A php rész nem hajlandó beírni semmit a txt-be. Ha feltöltöm egy serverre, és a txt-nek irásjogot adok (777), akkor müködik.

DE ITTHON nem tudom mit csináljak. Widows (98) megy a gépen, itt nincs olyan, hogy 777.

Az nem buli, hogy minden egyes kódbeli változtatás után -kapcsolódás a szerverhez -feltöltés/felülírás -böngészöben megnézni/kipróbálni -megint változtatni -folytköv... Közben a kapcsolat is megszakad.

Itthon a htdocs-ban levö file-t nyugodtan szerkeszthetem, és egy mentés/böngészö-frissítés után látom, hogy mit rontottam el már megint(ami addig jó volt)!
Mit kell csinálni?
 
1

nem azzal lesz gond...

TeeCee · 2007. Már. 27. (K), 09.37
...hogy a Win-en nincs 777, hanem hogy talán nem jól van megvizsgálva, hogy a fájlba tudsz-e írni...
VAGY: az fájl elérhetősége nem jól van megadva.
HA mutatnál részletet, hogy hogyan próbál írni a fájlba, akor többet tudnánk mondani.

Ha abszolút elérési utakat használ a script Win alatt akkor 'C:/valahol/itt/lista.txt' formában ad meg. Meg lehet adni így is: 'c:\\valahol\\itt\\lista.txt', de ilyenkor egyrészt figyelni kell arra, hogy a visszaperekből kettőt is rakni kell (tipikus hibaforrás), illetve nem ajánlot, mert igy a linux/win-es 'vegyeshasználatkor' figyelni kell a perek milyenségére, ha feldolgozod a változó tartalmát valahol...

Amúgy kapcsolat fenntartására lehet időnként parancsot kiadatni még a total commanderrel is, íy nem szakad meg, mert aktivitást mutatsz... ;)
2

A serveren müködik ugyanaz a script

HTibi · 2007. Már. 27. (K), 10.55
egymás melett vannak a file-ok, és a serveren müködik.
(Amúgy az eredetit a netröl töltöttem le, most hirtelen nem tudom a címet)
http://localhost/vendegkonyv3/kiserlet.php -itt nem megy,
http://.../vendegkonyv3/kiserlet.php -itt megy.

Itt van egy részlet a kódból:

$f = "uzeno.txt";

...>egyéb<...

if ($_POST['uzenet'] !== "" && $_POST['nev']!== "" && $_POST['email'] !== "")
{//adatok ellenőrzése
$handle = fopen($f,"a+"); //ha igaz, ez nyitja meg írásra
$tomb = fread($handle,filesize($f));
$uzenetek = explode ("n",$tomb);
$aktualis = count($uzenetek);
$uzenet = $_POST['uzenet'];
$uzenet = htmlspecialchars($uzenet);
$uzenet = str_replace("n","<br />",$uzenet);
$row = $_POST['nev']."|";
$row .= $_POST['email']."|";
$row .= $uzenet."|";
$row .= date("Y-m-d H:i:s", time())."|";
$row .= $aktualis."n";
fwrite($handle,$row); //ha nem tévedek ez kellene beírjon
header ("location: kiserlet.php");
}...
3

igazából...

TeeCee · 2007. Már. 27. (K), 17.00
... mennie kellene, bár vannak homályos részek számomra...

Mindenesetre ahol nem megy, ott ugye a php.ini-ben a következő beállítások vannak?
display_errors = On
error_reporting = E_ALL
register_globals = Off

Az első az, hogy mutassa-e a weboldalon a hibákat.
A második, hogy milyen típusú hibákat mutasson?
A harmadik meg bitzonsági beállítás, de mivel $_POST-tal dolgozol, a vendégkönyv tudja ezt.

Ha ezek így vannak, akkor próbáld meg:

$handle = fopen('tesztfajl.txt',"a+");
fclose($handle);
Ha ez létrehoz egy tesztfajl.txt-t, akkor tud írni, más probléma van ott...


=======================
Innentől kezdve csöppet más téma, én kötözködésben vagyok nagy ;)


$f = "uzeno.txt";

  ...

if ($_POST['uzenet'] !== "" && $_POST['nev']!== "" && $_POST['email'] !== "")
{//adatok ellenőrzése
  $handle = fopen($f,"a+"); //ha igaz, ez nyitja meg írásra
  // Így van. "a+", vagyis hozzáírásra nyitja meg a fájlt, vagy létrehozza, ha nincs.
  $tomb = fread($handle,filesize($f));
  // Ez gondolom "\n" akar lenni, mint újsor karakter...
  $uzenetek = explode ("n",$tomb);
  $aktualis = count($uzenetek);
  $uzenet = $_POST['uzenet'];
  $uzenet = htmlspecialchars($uzenet);
  // szintén "\n"
  $uzenet = str_replace("n","<br />",$uzenet);
  // Ezekszerint "|" a mezőelválasztó. Ugye figyelsz arra, hogy ilyen nem lehet a beküldött mezőben?
  $row = $_POST['nev']."|";
  $row .= $_POST['email']."|";
  $row .= $uzenet."|";
  $row .= date("Y-m-d H:i:s", time())."|";
  // Szintén "\n"
  $row .= $aktualis."n";
  fwrite($handle,$row); //ha nem tévedek ez kellene beírjon
  header ("location: kiserlet.php");
}
  ...
Szerintem elég hatékonytalan ;)

A legegyszerűbb, (már ha maradni akarsz a síma szöveges fájloknál):

1.) Biztonság: A bejövő adatokra htmlentities(), vagy strip_tags() alkalmazása, hogy ne legyenek benne HTML-TAG-ok
2.) Adatok helyessége: ez csak azt nézi, hoyg nem üres-e a mező. Ha szóközt ütök be, már nem üres string, igaz a "&nbsp;" sem sokkal értékelhetőbb adat, pláne nem e-mailcímnél... ;)
2.) Egyszerűség: tárolásra tök fölösleges ilyen struktúrát alkalmazni. A var_export( $var, true); egy olyan stringet ad vissza, amelyik egy *.php fájlba mentve include()-olható.

Tehát egy gyors másik megoldás, nem ellenőrizve, csak begépelve:

//ezzel mented el fájlba a tömbödet...
function storeToFile( $var ) {
  $f = fopen('guestbook_data.php', 'w');
  if ($f === false) {
    die('Egy szükséges fájl nem írható/olvasható');
  }
  else {
    fwrite( '$guestbook='.var_export($var, true).';' );
    fclose($f);
  }
}
//Kiolvasni nem nehéz:
require( 'guestbook_data.php' );
// és használni, már ha ilyen struktúrában mented el, akkor:
$totalNumOfPosts = count($guestbook);

// illetve a 20. bejegyzés feladója, értelem szerűen szintén struktúrafüggő:
echo $guestbook[20]['from'];
Persze számos hátránya van a fájlba tárolásnak. Ilyen pl, hogy ha sok bejegyzés érkezik, akkor nem célszerű fájlban tárolni. Talán néhány száz rekordnál már nem jó. Ha nem ilyesmi módon tárolod, akkor adminisztrálás nehezebb (mindig felparseolni az adatfájlodat, és azzal kell dolgozni). Minél nagyobb adatmennyiséged van, annál több memória kell (azért normális körülmények között - 100 bejegyzés átlag emberkénél) ez nem gond.
Illetve: ha lapozós megjelenítést szeretnél, akkor is az összes bejegyzést be kell ovlasnod, akár tetszik, akár nem. (Persze lehet fájlba cache-elni, de ilyen szintű akalmazásnál ez kevésbé szempont)

Szintén probléma, ha egyidőben vársz több látogatót! Az adatbázisnak nem gond, de itt előfordulhat, hogy pl. két egyszerre írt bejegyzés elveszik. Igaz, normális szolgáltatóknál, normális körülmények között nem nagy az esély erre.
4

Velem lehet kötözködni!

HTibi · 2007. Már. 27. (K), 19.01
1. Kösz a segítséget/magyarázatot! Lehet folytatni.

2. Kb. két hónappal ezelött még azt se tudtam hogy néz ki egy php file!
Sokkal többet még most se tudok. Hogy öszinte legyek, nem a látogatóknak akarom kirakni (majd egyszer, ha már értek is hozzá), hanem meg szeretném érteni a php scriptek müködését, és megtanulni írni.

3. A kódot letöltöttem, az n-ek így voltak benne. Mivel már találkoztam máshol velük ebben a formában (\n), kicsit csodálkoztam, de nem bántottam. Arról nem beszélve, hogy feltöltve müködik, csak itthon nem.
Amit Te irtál azt is megpróbálom "elrontani", vagy alkalmazni.
A tesztfajt létrehozza. Kipróbáltam. Söt, ha nincs uzeno.txt, akkor azt is létrehozza, és az elsö üzenetet beleírja. Másodjára már nem ír bele semmit! Az "n" kontra "\n" lehet a hiba?

Zavarlak e-mailben is.