Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Dwa problemy. Jeden z funkcją require drugi z zapisem do pliku
Forum PHP.pl > Forum > Przedszkole
kubek3898
Witam,

znów napotkałem problem przy pisaniu amatorskiego modułu. Do rzeczy. Zgodnie z opisem funkcji require:

Cytat
Instrukcja ta pozwala wczytać plik, którego adres został podany w jej argumencie. Jak możemy przeczytać w manualu służy ona do wczytania i wykonania kodu z określonego pliku w trakcie wykonywania skryptu.


mój kod w pliku index.php w katalogu o dajmy na to nazwie 'WWW' FTP o treści:

  1. <?php
  2.  
  3. if(!defined('THIS_SCRIPT'))
  4. {
  5. die('Access denied');
  6. }
  7.  
  8.  
  9.  
  10. require 'config.php';
  11. require 'includes/class.php';
  12.  
  13. $mysql = new mysql();
  14.  
  15. $mysql->connect();
  16.  
  17. ?>


Powinien zostać automatycznie zamieniony przez parser PHP na:

  1. <?php
  2.  
  3. if(!defined('THIS_SCRIPT'))
  4. {
  5. die('Access denied');
  6. }
  7.  
  8.  
  9.  
  10. // I teraz zamiast require 'config.php';
  11. // Zamienia tutaj na to co jest w config.php czyli:
  12. /*<?php
  13.  
  14. $sql_host = 'localhost';
  15. $sql_user = 'root';
  16. $sql_pass = '';
  17. $sql_base = 'test';
  18.  
  19. ?>*/
  20. // A tutaj zamienia to co jest w includes/class.php
  21. // Czyli powinno być
  22. // Nie: require 'includes/class.php';
  23. // A:
  24. /*<?php
  25.  
  26. if(!defined('THIS_SCRIPT'))
  27. {
  28. die('Access denied');
  29. }
  30.  
  31. class mysql
  32. {
  33. var $sql_host;
  34.   var $sql_user;
  35.   var $sql_pass;
  36.   var $sql_db;
  37.   var $connection;
  38.   var $select;
  39.   var $query;
  40. var $result;
  41. var $ilosc_zapytan;
  42. var $data_godzina;
  43.  
  44. function connect()
  45. {
  46. @require 'config.php';
  47. $connection = @mysql_connect($sql_host, $sql_user, $sql_pass);
  48.  
  49. if(!$connection)
  50. {
  51. echo '<br>Nie można połączyć z bazą MySQL.';
  52. $dane = '$connection | $sql_host, $sql_user\n';
  53. error_log_file($dane);
  54. }
  55. }
  56. }
  57.  
  58. ?>*/
  59.  
  60. $mysql = new mysql();
  61.  
  62. $mysql->connect();
  63.  
  64. ?>


Problem jednak w tym, że config.php działa, a includes/class.php nie... Według mnie to bardzo dziwne, no bo przecież skoro włącza to przeszukuje katalog includes, wyszukuje w nim plik class.php i 'wkleja' go do pliku index.php. Co dziwniejsze, gdy zamienię to na:

  1. require 'class.php';


To działa! Możecie mi wytłumaczyć dlaczego tak się dzieje? Zależy mi na tym, by plik odczytywało z includes/class.php nie z class.php.

Teraz problem drugi:

Mam taką funkcję w celu zapisaniu błędu połączenia z MySQL:

  1. function error_log_file($dane)
  2. {
  3. $file = 'includes/tmp/error.txt';
  4. $fp = @fopen($file, 'a');
  5. @flock($fp, 2);
  6. @fwrite($fp, $dane);
  7. @flock($fp, 3);
  8. @fclose($fp);
  9. }


I znowu ten sam problem! Zamiast zapisywać do pliku includes/tmp/error.txt to tworzy sobie nowy plik w katalogu 0:/includes/tmp/error.txt zamiast WWW/includes/tmp/error.txt, gdzie '0:' to główny katalog FTP. A po raz drugi piszę, zależy mi na tym, by zapisywało do katalogu, na który wskazuję (czyli WWW/includes/tmp) smile.gif.

Może to trochę zagmatwane, ale jeśli będziecie mieli problemy ze zrozumieniem, to piszcie, bo zależy mi na szybkiej pomocy biggrin.gif.

Pozdrawiam

MlodyJNTR
1. funkcja includes(); działa jako pokazanie innego pliku a require nie.
2. nie zrozumiałem ale chyba chodzi ci o ustawienie chmodów 777 albo usuń @ .
kubek3898
1. Jednak muszę użyć require, bo te pliki są wymagane.

2. Tutaj nie chodzi o żadne CHMOD'y, a raczej znów złą ścieżkę... Nie wiem jaką podawać, bo z jednej strony skrypt wykonuje się z poziomu index.php, więc powinno być includes/tmp/error.txt, a z drugiej plik class.php z tą funkcją jest w includes, więc prawidłowe jest też tmp/error.txt
Gość
Stosuj adresy bezwzględne. Jeżeli nie masz zdefiniowanych ścieżek, to możesz zastosować np. dirname(__FILE__) - zwraca nazwę katalogu aktualnego pliku, dirname(dirname(__FILE__)) - katalog nadrzędny itd.
kubek3898
Teraz odkryłem inną dziwną rzecz. Plik class.php znajdujący się w katalogu includes/:

  1. <?php
  2.  
  3. if(!defined('THIS_SCRIPT'))
  4. {
  5. die('Access denied');
  6. }
  7.  
  8. /*function error_log_file($dane)
  9. {
  10. $file = 'includes/tmp/error.txt';
  11. $fp = @fopen($file, 'a');
  12. @flock($fp, 2);
  13. @fwrite($fp, $dane);
  14. @flock($fp, 3);
  15. @fclose($fp);
  16. }*/
  17.  
  18. class mysql
  19. {
  20. var $sql_host;
  21. var $sql_user;
  22. var $sql_pass;
  23. var $sql_db;
  24. var $connection;
  25. var $select;
  26. var $query;
  27. var $result;
  28. var $ilosc_zapytan;
  29. var $data_godzina;
  30.  
  31. function connect()
  32. {
  33. @require 'config.php';
  34. $sql_host = 'sffsdfsd';
  35. $sql_user = 'kllhjl';
  36. $sql_pass = 'jkhkjkjhkhjj';
  37. $connection = @mysql_connect($sql_host, $sql_user, $sql_pass);
  38.  
  39. if(!$connection)
  40. {
  41. echo '<br>Nie można połączyć z bazą MySQL.';
  42. $dane = '$connection | $sql_host, $sql_user\n';
  43. //error_log_file($dane);
  44. }
  45. }
  46. }
  47.  
  48. ?>
  49.  


Zgodnie z problemem jaki miałem wcześniej tego skryptu nie powinno przepuścić, ponieważ załącza on config.php, który w rzeczywistości nie znajduje się w includes, a w ../config.php

No to w takim razie, dlaczego nie przepuszcza tego?:

  1. require 'includes/class.php';


Skoro plik może być config.php, którego w rzeczywistości nie ma w katalogu, to dlaczego nie może być includes/class.php? Przecież tak na logikę, to jest dobrze napisane, włącza z poziomu index.php plik includes/class.php...
nospor
Cytat
Teraz odkryłem inną dziwną rzecz. Plik class.php znajdujący się w katalogu includes/:

Tu chodzi o to gdzie leży plik startowy (index.php) a nie plik inlcudowany, w którym coś tam incudujesz...
To plik index.php jest początkiem wszelkich ścieżek względnych.
kubek3898
@up

No właśnie, całkowicie się z Tobą zgadzam, dlatego taki kod powinien działać:

  1. <?php
  2.  
  3. if(!defined('THIS_SCRIPT'))
  4. {
  5. die('Access denied');
  6. }
  7.  
  8.  
  9.  
  10. require 'config.php';
  11. require 'includes/class.php';
  12.  
  13. $mysql = new mysql();
  14.  
  15. $mysql->connect();
  16.  
  17. ?>


Przecież, niby initdata.php znajduje się już w includes/, więc powinno być samo class.php, ale przecież skoro plikiem startowym jest index.php to, w/w pokazany kod powinien działać. A nie działa, wywala białą stronę, dopiero gdy zmienię na samo class.php, funkcjonuje poprawnie.
nospor
Pokaż strukturę katalogów i plików w tych katalogach, powiedz co ci się nie includuje i gdzie, a wyjaśnie ci, co masz źle.
kubek3898
Więc od początku. Plik index.php położony dokładnie w html/modules/WWW/:

  1. <?php
  2.  
  3. define('THIS_SCRIPT', 'index');
  4.  
  5. require_once 'includes/initdata.php';
  6.  
  7. exit();
  8.  
  9. ?>


Jak na razie wszystko załącza poprawnie. Teraz plik initdata.php w katalogu html/modules/WWW/includes/:

  1. <?php
  2.  
  3. if(!defined('THIS_SCRIPT'))
  4. {
  5. die('Access denied');
  6. }
  7.  
  8.  
  9.  
  10. require 'config.php';
  11. require 'includes/class.php';
  12.  
  13. $mysql = new mysql();
  14.  
  15. $mysql->connect();
  16.  
  17. ?>


Tutaj zaczynają się problemy. Skoro plikiem startowym jest index.php, więc ścieżka include/class.php jest jak najbardziej poprawna... Jednak parser PHP tak nie uważa smile.gif. Wyrzuca białą stronę. Dopiero gdy zmienię na samo class.php jest wszystko dobrze.

No i na samym końcu plik class.php również w katalogu html/modules/WWW/includes/:

  1. <?php
  2.  
  3. if(!defined('THIS_SCRIPT'))
  4. {
  5. die('Access denied');
  6. }
  7.  
  8. function errorlogfile($dane)
  9. {
  10. $file = 'includes/tmp/error.txt';
  11. $fp = @fopen($file, 'a');
  12. @flock($fp, 2);
  13. @fwrite($fp, $dane);
  14. @flock($fp, 3);
  15. @fclose($fp);
  16. }
  17.  
  18. class mysql
  19. {
  20. var $sql_host;
  21. var $sql_user;
  22. var $sql_pass;
  23. var $sql_db;
  24. var $connection;
  25. var $select;
  26. var $query;
  27. var $result;
  28. var $ilosc_zapytan;
  29. var $data_godzina;
  30.  
  31. function connect()
  32. {
  33. @require 'config.php';
  34. $connection = @mysql_connect($sql_host, $sql_user, $sql_pass);
  35.  
  36. if(!$connection)
  37. {
  38. echo 'Nie można połączyć z bazą MySQL.';
  39. $dane = "$connection | $sql_host, $sql_user\n";
  40. errorlogfile($dane);
  41. }
  42. }
  43. }
  44.  
  45. ?>


Tutaj mamy niespodziankę. Plik class.php tak jakby zaczyna funkcjonować normalnie i nie wypluwa już białej strony na widok require 'config.php' (a przecież powinien, zgodnie z initdata.php, bo plik nie jest w includes/)

Do tego sama ścieżka zapisu do pliku includes/tmp/error.txt, powinna być poprawna, ale z jakiegoś powodu nie zapisuje nigdzie, dopiero gdy zmienię na ./tmp/error.txt, wtedy zapisuje, ALE w katalogu html/
nospor
Chyba mi się jednak pomyliło. Ścięzka względna liczy się od aktualnego pliku a nie od głównego smile.gif
I dlatego ja zawsze działam na bezwględnych i nic się nigdy nie myli smile.gif
kubek3898
No dobrze, to w takim razie dlaczego przepuszcza config.php w pliku class.php? Przecież jest w innym katalogu niż ten plik.
!*!
Włącz obsługę błędów, wywal @ z kodu (var przy okazji też, to nie czasy php4) a zobaczysz więcej.
nospor
Cytat
No dobrze, to w takim razie dlaczego przepuszcza config.php w pliku class.php? Przecież jest w innym katalogu niż ten plik.
Bo zapewne masz ustawioną ścieżkę z includami smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.