• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dołączanie plików poprzez require_one w funkcji/instrukcji warunkowej a scope oraz session_start

Object Storage Arubacloud
0 głosów
222 wizyt
pytanie zadane 28 września 2017 w PHP przez kevin Mądrala (5,010 p.)
edycja 28 września 2017 przez kevin

Witam!

Na początku przedstawię sytuację a później efektu którego nie rozumiem.

Mam taką strukturę pliku wyświetlającego stronę oraz podstrony:

<?php
           session_start();
           $podstrona = '';
           $style_dla_podstrony = '';

           if ( (isset($_GET['c']) && ($_GET['c'] == 1) )
           {
                  $podstrona = 'podstrona_1.php';
                  require_once("tablica_z_jezykiem_dla_podstrona_1.php");
                  require_once("tablica_ze_stylami_dla_podstrona_1.php");             }
            else
            {
                 $podstrona = 'start.php';
                  require_once("tablica_z_jezykiem_dla_start.php");
                  require_once("tablica_ze_stylami_dla_start.php"); 
            }
?>

<html>
         <head>
            <?php foreach($style_dla_podstrony as $i) {
                echo '<link rel="Stylesheet" type="text/css" href="css/' .$i. '.css"/>'
                  } ?>

         </head>
<body>

     <main>
                 <article>
                               <?php require_once($podstrona); ?>
                 </article>
     </main>
</body>

Wyjaśnienie, każda podstrona różni się zawartością w środku, pasek nawigacyjny jest ten sam dla każdej podstrony więc to która podstrona jest wczytywana podaję w parametrze GET. Dla każdej podstrony mam osobną tablicę z językiem polskim i angielskim oraz ze stylami dla zawartości aby nie wczytywać ich dla podstrony która ich nie będzie używała. Jeżeli użytkownik wybrał język polski to wypełniam tą tablicę zdaniami, wyrazami w języku polskim jeżeli użytkownik wybrał język angielski to wypełniam tą tablicę językiem angielskim ta tablica to $lang ( identyczna nazwa dla każdej podstrony ). Wyświetlam tekst z tej tablicy w taki sposób: <?php echo '<p>' . $lang['tekst'] . '</p'>; ?>. Plik .php w który jest tablica z językiem wygląda tak:

<?php

 $lang = Array();

$lang['text'] = "To jest napis po polsku";

// ...
// ...

?>

Dla innego języka jest identyczny tylko różnica polega na tym że jest w innym języku.

Przedstawienie problemu:

Dlaczego sokoro tworzę tablicę $lang na początku pliku z językiem dla którego jest globalna i dołączam je za pomocą require_once w instrukcji warunkowej to ona w dalszej części kodu php istnieje ? Nie powinna zostać usunięta ? Jeżeli plik z językiem dołączę w funkcji w identyczny sposób to już tej zmiennej nie będzie. Rozwiązanie to dodać do głównego pliku $lang i później w pliku językiem podać prefiks global ale dlaczego tak jest ?

Identycznie z session_start(), tej instrukcji muszę użyć na początku każdego pliku php który korzysta z tablicy $_SESSION ale gdy na początku pliku dodam tą instrukcję a później dołączę plik za pomocą np. require_once to w tym dołączonym pliku korzystanie z tej tablicy nie sprawia problemu bez użycia session_start czy to jest normalne ? Co jeżeli mieszam HTML z php w sposób "brutalny" tzn.

<label><?php echo $lang['text_dla_label] ; ?></label>
<input type="text" name="napis">

<input type="submit" value= <?php echo '"' . $lang['napis_na_przycisku'] . '"'; ?> >

Plik z takimi instrukcjami jest dołączony do pliku za pomocą require_once na początku piku w którym jest session start i taki plik działa bez problemu ale czy nie jest to zakazane i w każdym bloku <?php ?> powinno być session_start() ?

Swoją drogą to zamiast mieszać tak php z HTML to chyba lepiej już zapakować to w jedną instrukcję php wyświetlającą cały napis/przycisk.

 

Z poważaniem.

komentarz 28 września 2017 przez xandros Nałogowiec (29,450 p.)
edycja 28 września 2017 przez xandros
$lang = Array();
 
$lang['text'] = "To jest napis po polsku";
$lang = [
    'text' => 'To jest napis po polsku',
];
$lang = [];
$lang['text'] = "To jest napis po polsku";

----

 

2 odpowiedzi

0 głosów
odpowiedź 28 września 2017 przez sc4rface Dyskutant (7,710 p.)
$podstrona = podstrona_1.php;

Nie wywala Ci to błędu?
komentarz 28 września 2017 przez kevin Mądrala (5,010 p.)
Takie coś to wywali ale to nie jest kod żywcem przepisany z projektu. Już to poprawiam w pytaniu.
0 głosów
odpowiedź 28 września 2017 przez xandros Nałogowiec (29,450 p.)
edycja 28 września 2017 przez xandros

Globalne, heh. Staraj się ich po prostu nie używać.

         if ($_GET['c'] ?? '' == 1) {
                  $podstrona = 'podstrona_1.php';
                  $lang = require_once("tablica_z_jezykiem_dla_podstrona_1.php");
                  $styles = require_once("tablica_ze_stylami_dla_podstrona_1.php");             
         } else  {
                  $podstrona = 'start.php';
                  $lang = require_once("tablica_z_jezykiem_dla_start.php");
                  $styles = require_once("tablica_ze_stylami_dla_start.php"); 
         }

Jak uzywasz na pliku require_once/require/include etc. to plik działa podobnie jak funkcja. Więc w pliku tablica_z_jezykiem_dla_podstrona_1.php wystarczy, że będziesz miał:

return [
    'name' => 'tlumacznie1',
    'name23' => 'tlumacznie5',
    'name543' => 'tlumacznie4',
    'name132' => 'tlumacznie3',
    'name75' => 'tlumacznie2',
];

Identycznie z session_start(), tej instrukcji muszę użyć na początku każdego pliku php

Session start to inicjalizacja sesji. Jeżeli chcesz mieć dostęp do $_SESSION, to musisz ją wywołać raz na zapytanie/request/żądanie. 

Swoją drogą to zamiast mieszać tak php z HTML to chyba lepiej już zapakować to w jedną instrukcję php wyświetlającą cały napis/przycisk.

I tak i nie. Niektóre frameworki maja wrappery do kompilowania buttonów/formularzy/tabel etc. ale tez nie jest złą praktyką używać <a href="<?= $var ?>"><?= $var2 ?></a>. (<?php echo $var ?> to to samo co <?= $var ?>)

komentarz 28 września 2017 przez kevin Mądrala (5,010 p.)
edycja 28 września 2017 przez kevin

To zaraz include/require etc. nie dołączają pliku w taki sposób że nie mogę swobodnie używać zmiennych które siedzą w tym pliku ? Puki co to działa ale czy tak to powinno być ?

Session na zapytanie/żądanie czyli przed każdym dostępem do $_SESSION mam używać session_start a nie na samym początku ? Puki co działa jeżeli umieszczę session_start na początku pliku i działa dla każdego pliku który jest dołączony za pomocą include/require etc. Ale czy to jest ok ?

A jak ma się scope zmiennych w stosunku do instrukcji warunkowych ?

<?php

    $var = 0;

   if(coś_tam) {
     $var = 1;   // to jest zmienna lokalna czy ta przed if'em ?
   }

?>

 

komentarz 28 września 2017 przez xandros Nałogowiec (29,450 p.)
komentarz 28 września 2017 przez xandros Nałogowiec (29,450 p.)
<?php

    $var = 0;

   if(coś_tam) {
     $var = 1;   // to jest zmienna lokalna czy ta przed if'em ?
   }

Nadpisujesz zmienną przed ifem.

To zaraz include/require etc. nie dołączają pliku w taki sposób że nie mogę swobodnie używać zmiennych które siedzą w tym pliku 

To że działa, nie znaczy, że tak powinno się robić.

Session na zapytanie/żądanie czyli przed każdym dostępem do $_SESSION mam używać session_start a nie na samym początku ?

Jak otwierasz stronę, to następuje żądanie od przeglądarki do twojego serwera. F12 zakladka network i wejdz w dowolna strone. Każdy rekord to jedno żądanie...

session_start powinieneś używać tylko raz np. przy starcie aplikacji. 

komentarz 28 września 2017 przez xandros Nałogowiec (29,450 p.)

Podobne pytania

–1 głos
1 odpowiedź 532 wizyt
pytanie zadane 19 sierpnia 2020 w C i C++ przez lujasjeden Użytkownik (860 p.)
0 głosów
2 odpowiedzi 522 wizyt
pytanie zadane 4 maja 2020 w C i C++ przez kwazi Nowicjusz (120 p.)
0 głosów
1 odpowiedź 670 wizyt
pytanie zadane 23 października 2019 w C i C++ przez darekdede1995 Nowicjusz (180 p.)

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...