Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: fopen()

Sivun loppuun

spexi [03.05.2006 14:50:46]

#

Kyseessä on projekti, jonka sivuilla voidaan kävijöille näyttää eri tapahtumia mitä on. Tapahtumat tallennetaan jokainen omaan tiedostoonsa, tiedostonimenä on sama päivämäärä kuin mikä lisätyllä tapahtumallakin, tiedostopäätteenä ei ole mitään. Windows-koneella, jossa on sama PHP 5, homma on toiminut moitteettomasti. Sitten kun homma oli tehty, valmis tapahtumat.php vietiin unix-alustaiselle serverille. Kaikkien ehtojen läpi mentiin, mutta tapahtuman teko tökkäsi nimenomaan sen kirjoitukseen.

Kansiossa johon yritettiin kirjoittaa, oli ownerille read, write ja execute, muille vain read. Tosin tästä ongelma ei voi johtua, tallennuskansiota vaihdettiin myös sellaiseen jossa kaikille on myös write-oikeus.

Koodinpätkä tässä:

$file = fopen("../tapahtumat/" . $filename, "w");
fwrite($file, $sisalto);
fclose($file);

$sisalto-muuttujassa on siis sisalto, $filename-muuttujassa taas tiedoston nimi, mikä siis on tapahtuman pvm. fopenin sisällä olevaa polkuakin on vaihdettu suoraan osoittamaan oikeaan kansioon, eli "/home/username/public_html/tapahtumat/" , mutta sekään ei auttanut, eli kyse ei voi olla siitä etteikö se ymmärtäisi "../tapahtumat" -polkua.

Vielä varmistaakseni tein if-lauseen tuon fopenin ympärille, että if(!fopen("../tapahtumat/" jne. eli jos fopen ei toteudu niin tulostaa "virhe", ja niin tulostikin. Tämä on siis se kohta mihin tökkää, mutta miksi, kenelläkään ideoita?

EDIT: Myös on kokeiltu, että tiedostolle antaisi tiedostopäätteen, ei tehnyt eroa, joten ei silläkään ole merkitystä.

Lebe80 [03.05.2006 16:54:43]

#

kokeile vielä polun alkuun /-merkkiä (kautta).

$file = fopen("/../tapahtumat/" . $filename, "w");

Virhe voi myös johtua siitä, ettei avattavaa tiedostoa ole olemassa.!!edit: eipä oikeastaan voikaan, sillä tuohan yrittää luoda tietysti uuden tiedoston tilalle!!

edit:
register_globals?

jideko [03.05.2006 17:00:20]

#

Eikös kuitenkin tuon pitäisi luoda tiedosto jos sitä ei ole olemassa?

Tuoko ei sitten anna mitään erroria? Jos errorit on pois päältä niin lisää koodin alkuun error_reporting(E_ALL);

Typerä kysymys, mutta oletkos varma ettei $filename tai $sisalto ole tyhjiä.

spexi [04.05.2006 07:50:00]

#

Muuttujat $sisalto ja $filename eivät kyllä ole tyhjiä, niille annetaan arvot vasta jos jotain on postattu, ja muutenkin ennen tota fopenia tarkistetaan onko niissä mitään. Mutta saattaa todellakin olla että errorit ovat siellä pois päältä, koitan tuota error_reportingia.

Lebe80 [04.05.2006 10:09:53]

#

Tarkista ettei ne todellakaan ole tyhjiä unix palvelimella.

Sinulla voi Windows koneella olla esim. register_globalsit päällä, jolloin GET ja POST muuttujat asetetaan suoraan saman nimisiksi muuttujiksi.

Koska emme tiedä koodiasi, niin laita php-skriptin alkuun

$sisalto = $_POST["sisalto"];
$filename = $_POST["filename"];

coaster [04.05.2006 11:31:06]

#

Siis jäi vähän epäselväksi, että mihin kohtaan tökkäsi. (voi olla etten vain osannut lukea...) Siis pystyikö ko. juttu luomaan uuden tiedoston muttei kirjoittamaan siihen?

Joskus voi olla että tiedoston pystyy luomaan, jolloin sille pitäisi vielä antaa riittävät kirjoitusoikeudet.

spexi [05.05.2006 08:21:01]

#

Okei, tähän vähän pitempää koodinpätkää:

if(isset($_POST['pvm'],$_POST['msge']))
{
  $pvm = explode(".",$_POST['pvm']);
  if(isset($pvm[0],$pvm[1],$pvm[2]))
  {
      if(checkdate($pvm[1],$pvm[0],$pvm[2]))
      {
        //Jos päivämäärissä & kuukausissa 1-9 ei ole nollaa
        //edessä, laitetaan niihin ne
        if(strlen($pvm[0])==1)
        {
          $ekapvm = 0 . $pvm[0];
        }
        else
        {
          $ekapvm = $pvm[0];
        }
        if(strlen($pvm[1])==1)
        {
          $tokapvm = 0 . $pvm[1];
        }
        else
        {
          $tokapvm = $pvm[1];
        }
        //tiedostonimeksi siis tapahtuman luontipvm,
        //eli vuosi, kuukausi ja päivä
        $filename = $pvm[2] . $tokapvm . $ekapvm;
        //$date-muuttujaan pvm oikein päin, joka sitten
        //kirjoitetaan tapahtuma-tiedostoon, että pvm
        //voidaan näyttää tapahtumaa tulostettaessa
        $date = $ekapvm . "." . $tokapvm . "." . $pvm[2];
        if($_POST['msge']!="")
        {
          //otetaan tapahtuman loppumispvm talteen,
          //joka ei ole pakollinen täyttää lomakkeessa
          $pvml = $_POST['pvml'];
          $pvml = stripslashes($pvml);
	  $pvml = ereg_replace("<", "&lt;", $pvml);
          $pvml = ereg_replace(">", "&gt;", $pvml);

	  $msge = $_POST['msge'];
	  $msge = stripslashes($msge);
	  $msge = str_replace("\r\n", "|" , $msge);

          $sisalto = $date . "|" . $pvml . "|" . $msge;
        }
        else echo "Tapahtuma-kenttä tyhjä!";
      }
      else echo "Tarkista päivämäärä!";
  }
  else echo "Päivämäärä ei käy!";
}
if (isset($msge))
{
  if ($msge != "")
  {
    $file = fopen("../tapahtumat/" . $filename."", "w");
    fwrite($file, $sisalto);
    fclose($file);
    chmod("../tapahtumat/".$filename."", 0666);
    print ("<p><meta http-equiv=\"refresh\" content=\"0;url=index.php?link=3\"");
    print("\">Odota hetki...</p>");
  }
}

Tällänen koodi, ja se siis nimenomaan EI tee riviä:
$file = fopen("../tapahtumat/" . $filename."", "w");

Tuon ympärille ku pisti if-lauseen, että

if(!$file = fopen("../tapahtumat/" . $filename."", "w"))
{
  echo "virhe";
}

niin tulosti "virhe". Tuo on se ongelma, eli se ei edes pääse tekemään tapahtuma-tiedostoa, jonka jälkeen voitas chmodata se.

coaster [05.05.2006 12:31:54]

#

vielä kysyn, onko tuossa "tapahtumat"-kansiossa myös execute oikeudet?

Ainakin, kun itse kokeilin niin sain luotua tiedoston kun laitoin 777-oikeudet kansiolle, mutta muuten en.

spexi [06.05.2006 11:27:41]

#

Oke, siinä kansiossa oli kyl read ja write oikeudet, mut executea ei..Se siis ilmeisesti on tässä se mikä mättää. Pitäs varmaan chmodata se kansio, chmod("../tapahtumat/", 0777); ? eli chomodataanko kansio ihan tuolla tavalla vain myös?

Pitääpi kyl tuo kokeilla..

Blaze [06.05.2006 13:01:29]

#

Kantsii huomata, että hakemistoilla tuo execute-bitti tarkoittaa oikeutta siirtyä (cd) ko. hakemistoon.


Sivun alkuun

Vastaus

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

Tietoa sivustosta