Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Wangarad 18. 10. 2019, 10:00:45

Název: PHP nechce nastavit Globals
Přispěvatel: Wangarad 18. 10. 2019, 10:00:45
Zdravim.
Snazim sa na local hoste nahodit jeden php script. Pouzivam Vertrigo ako wamp. Bohuzial som sa trosku zasekol.
Takto vyzera index

Kód: [Vybrat]
<?php 
require_once(__DIR__ '/connection/init.php');

if(!isset(
$_SESSION['login']['id'])) {
if($pageFromUrl != 'login') {
header('Location: /login');
exit();
}
}

$_SESSION['login'] = (!isset($_SESSION['login']) ? array() : $_SESSION['login']);

if(
$pageFromUrl == 'logoff') { 
session_destroy();  
@session_start(); 
header("Location: /login"); 
exit(); 
}

if(
$pageFromUrl == 'login') { 
include(__DIR__ '/includes/pages/login.php'); 
exit(); 
}
Viem ze connection init zbehne.
hodi ma to sem
http://127.0.0.1/login aj ked som sa nikdy neprihlasil ale ok.
A ked dam http://127.0.0.1/includes/pages/login.php
Notice: Undefined variable: global in C:\Program Files\VertrigoServ\www\includes\pages\login.php on line 10
Na riadku 10 je <?= $global['siteName'] ?>
Vedel by niekto poradit co som teoreticky zabudol nastavit v php?
Název: Re:PHP nechce nastavit Globals
Přispěvatel: Kit 18. 10. 2019, 11:52:06
Proměnná $global neexistuje. Když ten chybující řádek vyhodíš, tak by měl problém pominout.
Název: Re:PHP nechce nastavit Globals
Přispěvatel: Wangarad 18. 10. 2019, 13:22:30
No ale ona existuje.
v config.php mam
Kód: [Vybrat]
$global['siteName'] = 'XXX';
$global['siteURL'] = 'http://127.0.0.1/';


Na tej stranke dalej je to pouzite. Viem ze to na produkcnom servery funguje takze je to nieake to nastavenie len netusim ktore. Pristup k tomu budem mat az v Pondelok ale chcel som si to na localhoste riesit cez vikend.
Název: Re:PHP nechce nastavit Globals
Přispěvatel: Kit 18. 10. 2019, 13:26:42
No ale ona existuje.
v config.php mam
Kód: [Vybrat]
$global['siteName'] = 'XXX';
$global['siteURL'] = 'http://127.0.0.1/';

Ten config.php načítáš kde?
Název: Re:PHP nechce nastavit Globals
Přispěvatel: hugg.g 18. 10. 2019, 13:37:49
tak si vypni vypisování notice, jako to máš na produkci :-)))
Název: Re:PHP nechce nastavit Globals
Přispěvatel: Kit 18. 10. 2019, 14:01:06
tak si vypni vypisování notice, jako to máš na produkci :-)))

Jen to ne!
Název: Re:PHP nechce nastavit Globals
Přispěvatel: hugg.g 18. 10. 2019, 14:25:38
humor, proto ten smajlík..
Pro mrzouty: Na produkci to nefunguje úplně stejně, jen se notice nevypisují
Název: Re:PHP nechce nastavit Globals
Přispěvatel: Ondřej Kolín 18. 10. 2019, 14:54:28
Duvod je IMHO jednoduchy. Cely ten system funguje tak, ze se snazi vkladat stranky do sebe. Cili nacte konfiguraci a pak vlozi PHP skript. Nicmene, pokud se ty na ten PHP skript odkazes rovnou, neprobehne to vkladani.

Takze teoreticky by ti melo stacit si v te strance vlozeni kodu z toho config.php souboru. Nicmene se mi to zda nekoncepcni.

Pro lepsi ladeni by pomohlo, pokud by jsi postnul treba alespon adresarovou strukturu, index.php a ten vkladany login.php, ci jak se to jmenuje
Název: Re:PHP nechce nastavit Globals
Přispěvatel: fortran1986 18. 10. 2019, 16:41:21
Takýchto problémov by si sa zbavil, keby si začal používať objekty (napr objekt Config ktorý by si pýtal objekt Store atď) a potom všetky nahádzať do IoC kontainera.

Objekty by si svoje závislosti pýtali cez konštruktor. A na závislosti, ktoré môžu byť spoločné pre vačšinu objektov by som použil nejakú mágiu napr. AOP.

Inak treba používať názvy identifikátorov z ktorých vieš o čo ide takže namiesto $globals by bolo lepšie použiť trebárs $appConfig okrem toho PHP má na inicializáciu polí literál od verzie 7 sa to zapisuje takto:

Kód: [Vybrat]
<?php

$appConfig 
= [
    
'siteName' => 'Nazov stránky',
    
'siteURL' => 'http://127.0.0.1/'
];

a v starších verziách takto:

Kód: [Vybrat]
<?php

$appConfig 
= array(
    
'siteName' => 'Nazov stránky',
    
'siteURL' => 'http://127.0.0.1/'
);

takže nemusíš programovať štýlom [ctrl]+[c] a [ctrl]+[v]
Název: Re:PHP nechce nastavit Globals
Přispěvatel: to_je_jedno 18. 10. 2019, 17:18:46
to je zvěrstvo.
Název: Re:PHP nechce nastavit Globals
Přispěvatel: ETNyx 18. 10. 2019, 17:45:47
....
okrem toho PHP má na inicializáciu polí literál od verzie 7 sa to zapisuje takto:

Kód: [Vybrat]
<?php

$appConfig 
= [
    
'siteName' => 'Nazov stránky',
    
'siteURL' => 'http://127.0.0.1/'
];

a v starších verziách takto:

Kód: [Vybrat]
<?php

$appConfig 
= array(
    
'siteName' => 'Nazov stránky',
    
'siteURL' => 'http://127.0.0.1/'
);


Tohle rozhodně není důvod jít všechna pole přepisovat do "short syntax", "starší" zápis není deprecated a spíše záleží na preferenci člověka, případě pokud pracuje v týmu tak na případném dohodnutém standardu, kde třeba může být vyžadována "starší" syntaxe + short syntaxe se dala používat už někde od verze 5.x,...

K tomu identifikátoru bych ještě dodal že, toto jméno také nění vhodné díky jisté podobnosti s rezervovaným jménem GLOBALS
Název: Re:PHP nechce nastavit Globals
Přispěvatel: Wangarad 18. 10. 2019, 19:56:08
Takze historia je asi taka ze som to zdedil po niekom. Moja uloha je pomenit niektore flowy a chcel som si to spravit doma.
Celkovo je to pisane akoby to pisalo 5 ludi a kazdy inu cast a inak ale to je o inom.
Zacina to na indexe.

Kód: [Vybrat]
?php
require_once(__DIR__ . '/connection/init.php');

if(!isset($_SESSION['login']['id'])) {

if($pageFromUrl != 'login') {
header('Location: /login');
exit();
}
}

$_SESSION['login'] = (!isset($_SESSION['login']) ? array() : $_SESSION['login']);

if($pageFromUrl == 'logoff') {
session_destroy(); 
@session_start();
header("Location: /login");
exit();
}

if($pageFromUrl == 'login') {
include(__DIR__ . '/includes/pages/login.php');
exit();
}

require_once(__DIR__ . '/includes/partials/head.php');



if(file_exists($_SERVER['DOCUMENT_ROOT'] . '/controllers/' . $pageFromUrl . '.php')) {
include('controllers/' . $pageFromUrl . '.php');
}

?>
A tu to aj presmeruje a potom skape. Resp. presmetuje na 127.0.0.1/login co neexistuje a ked dam natvrdo tu adresu includes/pages/login.php dostanem
Kód: [Vybrat]
Notice: Undefined variable: global ininit.php
Kód: [Vybrat]
<?php
if(!isset($_SESSION)) @session_start();
setlocale(LC_ALL'en_EN');
header('Content-Type: text/html; charset=UTF-8');

require(
__DIR__ '/config.php');
require(
__DIR__ '/Database.php');
require(
__DIR__ '/CustomException.php');

try {
$dbh = new PDO('mysql:host=' $global['db_host'] . ';dbname=' $global['db_db'], $global['db_user'], $global['db_pass'], array(PDO::ATTR_PERSISTENT => false));
$db = new Database($dbh);
} catch (
PDOException $e) {
die('Unable to connect to the database at the given moment. Please try again later or contact a system administrator.');
//die('Connection failed: ' . $e->getMessage());
}

function 
d($var$exit true) {
echo '<pre>';
var_dump($var);
echo '</pre>';
if ($exit === true) {
exit();
}
}
to zbehne tiez lebo DB pripoji.
Strukturalne to vyzera takto
Kód: [Vybrat]
folder connection
folder controllers
folder includes
folder public
file favicon
file index.php

Stale mam pocit ze som zabudol zapnut nieaky modul.
Název: Re:PHP nechce nastavit Globals
Přispěvatel: Wangarad 18. 10. 2019, 20:12:16
Teraz som zbadal ze uz index nabieha zle.
Kód: [Vybrat]
require_once(__DIR__ . '/includes/partials/head.php');
Kde
Kód: [Vybrat]
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title><?= $global['siteName'] ?></title>
 
  <link rel="shortcut icon" href="/favicon.ico" />

takze to bude definitivne nieco co som zabudol zapnut.
Název: Re:PHP nechce nastavit Globals
Přispěvatel: eqeq 19. 10. 2019, 08:41:12
To by moh způsobit vypnutý mod_rewrite nebo chybějící .htaccess. Viděl jsi i skryté soubory, když jsi to stahoval?
Název: Re:PHP nechce nastavit Globals
Přispěvatel: nepohodlný 19. 10. 2019, 10:48:15
@Wangarad

Zkus načíst /connection/config.php v index.php ... Funguje?