• 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

VPS Starter Arubacloud
0 głosów
291 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ź 552 wizyt
pytanie zadane 19 sierpnia 2020 w C i C++ przez lujasjeden Użytkownik (860 p.)
0 głosów
2 odpowiedzi 567 wizyt
pytanie zadane 4 maja 2020 w C i C++ przez kwazi Nowicjusz (120 p.)
0 głosów
1 odpowiedź 701 wizyt
pytanie zadane 23 października 2019 w C i C++ przez darekdede1995 Nowicjusz (180 p.)

92,840 zapytań

141,781 odpowiedzi

320,856 komentarzy

62,172 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

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!

...