Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]funkcja Die
Forum PHP.pl > Forum > Przedszkole
djtomaszq
Mam taki fragment kodu/funkcje:

  1. function czy_zalogowany() {
  2. if(!$_SESSION['zalogowany']) {
  3. die('<p>Ta strona jest tylko dla zalogowanych.</p>');
  4. }
  5. }


umieszczam ją w różnych częściach strony jeśli nie jest przeznaczona dla użytkowników ma wyświetlać taki tekst jak wyżej.

Tylko, że wtedy ucina mi dalszą część strony i ten tekst wyświetla się poniżej szablonu strony. Jak temu zaradzić?
Forti
Zamiast die wyświetlić po prostu jakiś komunikat? Twoim błędem jest połączenie warstwy widoku i logiki. Odziel je do różnych plików - najpierw wykonuje się logika, która dopiero wyświetla na końcu wygenerowany html.

DIE możesz zastąpić exception z tym że efekt będzie dokładnei taki sam. Wszystko do momentu DIE / exception zostanie wyświetlone.
djtomaszq
Jeśli usunę Die i zostawię sam komentarz to wyświetla mi się wtedy ta strona którą chce ukryć.. a tą funkcje mam w pliku config.php a wyswietlam ją w innych plikach

jakiś mały przykład, bo nie wiem jak to rozmieścić..
Forti
może po prostu if / else?
  1. if (user_ma_dostęp) {
  2. // strona dla usera
  3. } else {
  4. // brak dostępu
  5. }


trudne?
djtomaszq
To nie jest trudne ale nie wiem gdzie mam to wstawić i jak dalej ehh :/

wywoluje tą funkcję w kilku plikach czyli muszę to zmieniać w każdym tak? Czy w config.php tą funkcję zmienić?

Napiszę więcej jak to wygląda bo może za mało danych podałem.
Strona index.php tam laduje szablon ogolny itp i tam includuje do diva podstrony na ktorych wlasnie jest ta funkcja i jesli się sprawdza to wyswietla napis z strona niedostepna wyswietla logo i wyswietla tlo i menu ale nie wyswietla części tego diva w ktorym jest biale tlo i ramka w ktorym pokazuje sie cos dla zarejestrowanych i w tej samej ramce chce zeby pokazalo to po DIE ale niestety ramka znika i jest tylko kolor tła...

Nie wiem czy to zrozumiale w miarę napisałem czy nic nowego..(?)
Daimos
najprościej zrobić przekierowanie, na stronę, gdzie masz błąd. Czyli:
  1. function czy_zalogowany() {
  2. if(!$_SESSION['zalogowany']) {
  3. header("Location: mojplikzbledem.php");
  4. }
  5. }

a plik przygotuj tak, aby wyświetlał się cały szablon.
Nie wiem jak masz zbudowaną całą aplikację, ale chyba troszkę ją zakręciłeś, skoro nie masz możliwości zablokowania treści i pozostawienia reszty elementów, może czas przemyśleć strukturę aplikacji
djtomaszq
plik index.php

  1. <html>
  2. <head>
  3. <title>W</title>
  4. <link rel="Shortcut icon" href="http://cdns2.freepik.com/darmowe-zdjecie/wariant-pi%C5%82ka_318-49974.jpg" />
  5. <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  6. <link href="css/style.css" type="text/css" rel="stylesheet" />
  7. <link href="css/style_forum.css" type="text/css" rel="stylesheet" />
  8. <link href="css/style2.css" type="text/css" rel="stylesheet" />
  9. </head>
  10. <body>
  11. <?php
  12. include_once 'config.php';
  13. ?>
  14. <div id="top">
  15. <div id="NAGLOWEK"><span>Logo</span></div>
  16. <div id="LOGOWANIE"><?php include 'logowanie.php'; ?></div>
  17. <div id="menu_glowne"><center>
  18. <ul>
  19. <li><a href="index.php?parent=glowna">STRONA GŁÓWNA</a></li>
  20. <li><a href="index.php?parent=forum">FORUM</a></li>
  21. <li><a href="#">CZAT</a></li>
  22. <li><a href="#">MECZ</a></li>
  23. <li><a href="#">KONTAKT</a></li>
  24. <li><a href="#">POMOC</a></li>
  25. </ul></center>
  26. </div>
  27.  
  28. <div id="TRESC">
  29. <?
  30. SWITCH ($_GET['parent']){
  31.  
  32. CASE "forum":
  33. INCLUDE 'forum/forum.php';
  34. BREAK;
  35.  
  36. CASE "rejestr":
  37. INCLUDE 'register.php';
  38. BREAK;
  39.  
  40. CASE "logi":
  41. INCLUDE 'login.php';
  42. BREAK;
  43.  
  44. CASE "profi":
  45. include 'profile.php';
  46. BREAK;
  47.  
  48. CASE "lista":
  49. INCLUDE 'userlist.php';
  50. BREAK;
  51.  
  52. CASE "edycja":
  53. INCLUDE 'editprofile.php';
  54. BREAK;
  55.  
  56. DEFAULT:
  57. include 'pliki/glowna.php';
  58. BREAK;
  59. }
  60. ?>
  61. </div>
  62.  
  63. <div id="STOPKA"> Copyright &copy 2015 Theo</div>
  64. </div>
  65. </body>
  66. </html>


  1. function czy_zalogowany() {
  2. if(!$_SESSION['zalogowany']) {
  3. die('<p>Tylko dla zalogowanych !</p>');
  4. }
  5. }


plik profile.php

  1. <?php
  2. include_once 'config.php';
  3. db_connect();
  4.  
  5. czy_zalogowany();
  6. $_GET['id'] = (int)clear($_GET['id']);
  7. $user_data = get_user_data($_GET['id']);
  8. if($user_data === false) {
  9. echo '<p>Niestety, taki użytkownik nie istnieje.</p>
  10. <p><a href="index.php"><< Powrót</a></p>';
  11. } else {
  12. echo '<h2>Profil użytkownika</h2>
  13. <p>Nick: <b>'.$user_data['user_name'].'</b></p>
  14. <p>Imię: '.(empty($user_data['user_imie']) ? 'brak' : $user_data['user_imie']).'</p>
  15. <p>Wiek: '.(empty($user_data['user_wiek']) ? 'brak' : $user_data['user_wiek']).'</p>
  16. <p>Płeć: '.$user_data['user_plec'].'</p>
  17. <p>Email: '.$user_data['user_email'].'</p>
  18. <p>Data rejestracji: '.date("d.m.Y, H:i", $user_data['user_regdate']).'</p>
  19. <p>Strona WWW: '.(empty($user_data['user_website']) ? 'brak' : $user_data['user_website']).'</p>
  20. <p>Skąd: '.(empty($user_data['user_from']) ? 'brak' : $user_data['user_from']).'</p>';
  21. }
  22.  
  23. db_close();
Forti
Niech funckja czy_zalogowany() zwraca true lub false.
  1. if (czy_zalogowany()) {
  2. // zalogowany
  3. } else {
  4. // nie zalogowany
  5. }



a najlepiej to wywal ją i daj po prostu if isset($_SESSION['zalogowany'])) lub array_key_exist. Jak nie będzie zalogowany to wywali ci pewnie błąd notice o nie istniejącym index "zalogowany".
djtomaszq
jak zrobie if to dalej nie ma reszty tła a jak isset to przy zalogowanym pokazuje mi ze brak dostepu a jak zrobie negacje to blad skladni..

tak jak mam wyzej kod jest wszystko dobrze tylko, że napisa "Ta strona tylko dla zalogowanych nie pokazuje sie w divie tylko poza szablonem strony..

EDIT:
  1. if(!$_SESSION['logged'])
  2. { echo' Brak dostępu';
  3. }else
  4. { dalsza czesc jak jest dostep... }

Tak działa. Nie jest to błędem? i jeśli wpisuje w pasek odrazu profile.php to pokazuje mi sie "brak dostępu" na białej stronie czyli zawartosc tego pliku. Czy to nie jest błędęm w programowaniu? Bo każdy kto by tak wpisał otrzyma wragment tylko tego pliku ? Jeśli tak to jak taki błąd naprawić?
Daimos
1. podałem Ci rozwiązanie w pierwszym moim poście,
2. skoro za pomocą switch załączasz pliki php, to na tym poziomie możesz już sprawdzać prawa dostępu i w razie problemu załączyć plik osobny, z komunikatem o braku uprawnień
markuz
  1. <?
  2.  
  3. $pages = array(
  4.  
  5. 'forum' => array(
  6. 'src' => 'forum/forum.php',
  7. 'logged' => false
  8. ),
  9.  
  10. 'rejestr' => array(
  11. 'src' => 'register.php',
  12. 'logged' => false
  13. ),
  14.  
  15. 'profi' => array(
  16. 'src' => 'profile.php',
  17. 'logged' => true
  18. )
  19.  
  20. );
  21.  
  22. ?><html>
  23. <head>
  24. <title>W</title>
  25. <link rel="Shortcut icon" href="http://cdns2.freepik.com/darmowe-zdjecie/wariant-pi%C5%82ka_318-49974.jpg" />
  26. <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  27. <link href="css/style.css" type="text/css" rel="stylesheet" />
  28. <link href="css/style_forum.css" type="text/css" rel="stylesheet" />
  29. <link href="css/style2.css" type="text/css" rel="stylesheet" />
  30. </head>
  31. <body>
  32. <?php
  33. include_once 'config.php';
  34. ?>
  35. <div id="top">
  36. <div id="NAGLOWEK"><span>Logo</span></div>
  37. <div id="LOGOWANIE"><?php include 'logowanie.php'; ?></div>
  38. <div id="menu_glowne"><center>
  39. <ul>
  40. <li><a href="index.php?parent=glowna">STRONA GŁÓWNA</a></li>
  41. <li><a href="index.php?parent=forum">FORUM</a></li>
  42. <li><a href="#">CZAT</a></li>
  43. <li><a href="#">MECZ</a></li>
  44. <li><a href="#">KONTAKT</a></li>
  45. <li><a href="#">POMOC</a></li>
  46. </ul></center>
  47. </div>
  48.  
  49. <div id="TRESC">
  50. <?
  51.  
  52. // sprawdzamy czy użytkownik chce wejść na jakaś podstrone
  53. if(isset($_GET['parent'])) {
  54.  
  55. // sprawdzamy czy istnieje taka podstrona
  56. $name = $_GET['parent'];
  57. if(isset($pages[$name])) {
  58.  
  59. // sprawdzamy czy podstrona wymaga zalogowania oraz czy uzytkownik jest zalogowany
  60. if($pages[$name]['logged'] == true && !isset($_SESSION['logged'])) {
  61. echo "Błąd - brak autoryzacji";
  62. } else {
  63. // sprawdzamy czy istnieje plik dla danej podstrony
  64. $src = $pages[$name]['src'];
  65. if(file_exists($src)) {
  66. // wyswietlamy zawartosc podstrony
  67. include $src;
  68. } else {
  69. echo "Błąd 500";
  70. }
  71. }
  72.  
  73. } else {
  74. echo "Błąd 404";
  75. }
  76.  
  77. } else {
  78. include 'pliki/glowna.php';
  79. }
  80.  
  81. ?>
  82. </div>
  83.  
  84. <div id="STOPKA"> Copyright &copy 2015 Theo</div>
  85. </div>
  86. </body>
  87. </html>


Pisane z palca, ale powinieneś wiedzieć ocb.
Daimos
Jeżeli ma plików niedużo, to może zostać przy swoim switch, bo file_exists jest niebezpieczne, przynajmniej w tej formie, którą zaproponowałeś wyżej. Trzeba wtedy robić porządną walidację.
Krótki przykład mini acl`a, Twoja funkcja czy_zalogowany:
  1. function czy_zalogowany() {
  2. if(isset($_SESSION['zalogowany']) && $_SESSION['zalogowany']) {
  3. return true;
  4. }
  5. return false;
  6. }

  1. <?
  2. $switch = isset($_GET['parent']) ? $_GET['parent'] : null;
  3. $loggedOnly = array('forum'); // tutaj wymieniasz elementy tylko dla zalogowanych
  4. if($switch && in_array($switch, $loggedOnly) && !czy_zalogowany())
  5. {
  6. $switch = 'brak_uprawnien';
  7. }
  8.  
  9. SWITCH ($switch){
  10.  
  11. CASE "forum":
  12. INCLUDE 'forum/forum.php';
  13. BREAK;
  14. CASE "brak_uprawnien":
  15. include "tresc_bledu.php"
  16. break;
  17. DEFAULT:
  18. include 'pliki/glowna.php';
  19. BREAK;
  20. }
  21. ?>
djtomaszq
Nie rozumiem w drugim kodzie tych trzech linijek pierwszych ale... jesli zabezpieczam to w takim kodzie:
  1. if(!$_SESSION['logged'])
  2. echo ' Brak dostępu';
  3. else{ czesc strony dla zalogowanych


To mi dziala i musze sie zalogowac zeby tam wejsc. JEst ok ale moje pytanie teraz na ile to bezpieczne? Czy przy tym kodzie ktoś łatwo może wejść bez zalogowania na te forum ?
viking
Zależy w jaki sposób użytkownik był sprawdzony wcześniej. To tylko sprawdza już pewien status.
Może jeśli nie za trudne zainteresuj się mikroframeworkami (slim, silex, phlyty itd). By Ci to uporządkowało kod a zarazem poprawiło trochę warstwę logiki.
djtomaszq
Hmm wczesniej tzn? Podczas logowania?
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.