Problem z odczytem pliku php


(Matriks87) #1

Witam zacząłem naukę z PHP korzystam z książki PHP i MySQL i mam pewien problem mianowicie nie działa mi funkcja lub źle ją wpisuje wygląda ona tak

<?php

$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];


$zamowienia = file("../../zamowienia.txt");

$ilosc_zamowien = count($zamowienia);

if ($ilosc_zamowien == 0)

{

  echo '
Brak zamówień. 

       Proszę spróbować później.';

}

for ($i=0; $i < $ilosc_zamowien; $i++)

{

  echo $zamowienia[$i].'
';

}

?>[/code]

jak powinna wyglądać ścieżka w file(), bo podejrzewam że ona zawiera błąd

w tej ścieżce zapisywane są wszystkie pliki :

C:\usr\krasnal\www\ja

taki błąd wyskakuje:

Warning: file(../zamowienia.txt): failed to open stream: No such file or directory in c:\usr\krasnal\www\ja\zobaczzamowienia.php on line 5


(adpawl) #2

jeżeli wszystkie pliki masz w katalogu C:\usr\krasnal\www\ ja , to ścieżka powinna wyglądać tak:

zamowienia.txt

a nie tak: ../../zamowienia.txt

Bo w tej chwili pliku zamowienia.txt szuka 2 katalogi wyżej w strukturze, czyli w C:\usr\ krasnal


(Matriks87) #3

(Grzegorz Wziatek) #4
$zamowienia = fopen("$DOCUMENT_ROOT zamowienia.txt","rb");

powinno pomóc, jeżeli dobrze zrozumiałem błąd


(Matriks87) #5

wciąż t samo :frowning:

Warning: fopen(c:/usr/apache/httpd/html/ zamowienia.txt): failed to open stream: No such file or directory in c:\usr\krasnal\www\ja\zobaczzamowienia.php on line 5


(adpawl) #6

przetworzzamowienie.php masz skopane.

Co to jest?

-powinno być $_SERVER

Właściwie to DOCUMENT_ROOT nie jest tutaj do niczego potrzebny, wystarczy samo fopen('zamowienia.txt',...

A jeżeli już, to nic dziwnego że komunikuje błędną ścieżkę skoro jest w niej spacja przed nazwą pliku.

Dalej, jeżeli coś wysyłasz, to potem przy odbieraniu sprawdź czy jakieś dane faktycznie zostały wysłane

np. przynajmniej coś w stylu

if(isset($_POST['submit'])){

//tutaj odbierasz zmienne itd.

}

else {

//tu coś robisz gdy nie ma oczekiwanych danych

}

Nie wygodniej było by tu wykorzystać file_get_contents i file_put_contents ?

Poza tym nie @ $wp, tylko @$wp

Ogólnie, kod bardzo nieprzemyślany.


(Matriks87) #7

Nadmieniłem na początku że dopiero pierwsze kroki stawiam więc prosze o wyrozumiałość :razz:

tak było w książce chodziło o to żeby nie pisać cały czas $_POST['DOCUMENT_ROOT']; tylko samo $DOCUMENT_ROOT

nie słyszałem jeszcze o takim czyms i nie wiem jak to stosować

spróbuje coś z tym pokombinować

zamieniałem:

$DOCUMENT_ROOT = $_POST['DOCUMENT_ROOT'];

na

$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];

oraz

@ $wp = fopen("$DOCUMENT_ROOT zamowienia.txt", 'ab');

na

$wp = fopen('zamowienia.txt', 'ab');

w przetworzzamowienie i w zobaczzamowienia:

$zamowienia = fopen("$DOCUMENT_ROOT zamowienia.txt","rb")

na

$zamowienia = fopen('zamowienia.txt',"rb");

i teraz nie ma żadnego błędu ale na stronie nic się nie wyświetla cała biała strona


(adpawl) #8

(Matriks87) #9

wywala mi błąd w przetworzzamowienia.php

Parse error: parse error in c:\usr\krasnal\www\ja\przetworzzamowienie.php on line 99

96 $fp=file_put_contents('zamowienia.txt', $ciagwyjsciowy, FILE_APPEND | LOCK_EX);

97 if($fp) echo '
Zamówienie zapisane.'; else echo '
Błąd zapisu.';

98 }

99 else echo '
Nie otrzymano danych z formularza';

i jeszcze pytanie czy ta klamra } na początku tej 99 musi być? co ona zamyka

próbowałem z tym i bez tego i nic


(adpawl) #10

Coś chyba zmieniałeś, bo linijka $fp... u mnie ma nr 91, u ciebie 96.

Co do klamerek, to ta pod if($fp) jest od sprawdzenia czy plik istnieje - file_exists

natomiast ta z linijki 99 u ciebie - jest domknięciem warunku sprawdzającego czy wormularz został wysłany

if(isset($_POST['submit']))

Więc jeżeli coś zmieniałeś, to podaj cały kod a nie tylko fragment.

A tak na marginesie, krasnal od dawna nie jest już rozwijany. Przejdź lepiej na coś aktualniejszego np xampp, vertrigo, wamp (albo nieoficjalny pamp)


(Matriks87) #11

a mógłbyś powiedzieć co dokładnie robi :

$fp=file_put_contents('zamowienia.txt', $ciagwyjsciowy, FILE_APPEND | LOCK_EX);

błąd miałem takie że nie miałem otwartej klamry przy

if(isset($_POST['submit']))

w tej chwili błędu nie wyrzuca ale wyświetla mi z 2 else że Nie otrzymano danych z formularza :?


(adpawl) #12

linia ta dopisuje stringa $ciagwyjsciowy do pliku zamowienia.txt

parametr FILE_APPEND powoduje, że dane są dopisywane a nie nadpisywane

zaś LOCK_EX blokuje plik podczas zapisu

A czy w pliku index masz tak jak w kodzie jaki wkleiłem?


(Matriks87) #13

no nie mailem już poprawiłem i z formularza wczytuje ale ciągle jest problem z zapisem teraz wychodzi

Fatal error: Call to undefined function: file_put_contents() in c:\usr\krasnal\www\ja\przetworzzamowienie.php on line 99


(Damgora) #14

jaka wersja PHP?


(adpawl) #15

krasnal, więc stara 4.3.9 i 5.0.2

file_put_contents jest od wersji 5, więc trzeba by w krasnalu przełączyć na piątke

Chociaż można kombinować wracając do fopen+fwrite albo zastosować obejście w postaci upgradephp http://developer.berlios.de/project/sho ... up_id=3997

Najlepiej jednak jak wcześniej wspominałem, zmienić starego krasnala na coś świeższego.


(Damgora) #16

i tak byłby problem z flagą LOCK_EX bo według manuala doszła w 5.1.0


(Matriks87) #17

(Damgora) #18

(adpawl) #19

cayman3_11, bardzo możliwe - jednak wystarczyło by tę flagę usunąć. (oczywiście przy większej liczbie wywołań blokować już by wypadało)

Tak czy inaczej lepiej przejść na v5 niż męczyć na starej wersji.

Bak już się uczyć, to na bieżąco, a nie historii.

matriks87, pozostając na php4, można to było ruszyć bez żadnych modyfikacji korzystając z ww. upgradephp, albo jego tylko części

/**

 * write-at-once file access (counterpart to file_get_contents)

 *

 * @param integer $filename

 * @param mixed $content  

 * @param integer $flags 

 * @param mixed $resource

 * @return integer

 */

if (!function_exists("file_put_contents")) {

   function file_put_contents($filename, $content, $flags=0, $resource=NULL) {


      #-- prepare

      $mode = ($flags & FILE_APPEND ? "a" : "w" ) ."b";

      $incl = $flags & FILE_USE_INCLUDE_PATH;

      $length = strlen($content);

// $resource && trigger_error("EMULATED file_put_contents does not support \$resource parameter.", E_USER_ERROR);


      #-- write non-scalar?

      if (is_array($content) || is_object($content)) {

         $content = implode("", (array)$content);

      }


      #-- open for writing

      $f = fopen($filename, $mode, $incl);

      if ($f) {


         // locking

         if (($flags & LOCK_EX) && !flock($f, LOCK_EX)) {

            return fclose($f) && false;

         }


         // write

         $written = fwrite($f, $content);

         fclose($f);


         #-- only report success, if completely saved

         return($length == $written);

      }

   }

}

...i już mamy obsługę file_put_contents z parametrami.

Co do źródła wiedzy, to chyba nic nie pobije manuala

http://www.php.net/manual/pl/funcref.php


(Damgora) #20

w kwestii mail'i to krasnal ma chyba SMTP

konfiguracja w php http://www.php.net/manual/pl/mail.configuration.php