Autor Zpráva
leorond
Profil
Ahoj, potřeboval bych menší radu ohledně připojení přes sqlsrv. Můj problém je následující

Pro přihlášení na webu používám session a u mysqli jsem s tím problém neměl a fungovalo to pěkně ale při použití sqlsrv připojení k MSSQL mi to začne psát chybu v případě že je $_SESSION prázdná.

Zkusil jsem naplnit session ( viz. kód níže ) jen tak pro sebe a funguje to ale stejně bych chtěl vědět kde je chyba.

Takto nedostanu chybovou hlášku

$_SESSION['user'] = NULL;

echo $_SESSION['user'];

a takto dostanu chybu Undefined index: user in

echo $_SESSION['user'];

Znamená to že musím session naplnit hodnotou NULL pro každého kdo přijde na web?

Děkuji za pomoc


Napadlo mne to vyřešit podmínkou

<?php
session_start();
//session_unset();

$user    =    'Admin';

if(empty($_SESSION['user']))    {
    $_SESSION['user']    =    NULL;
}

$_SESSION['user']    =    $user;

echo "<p>You are now logged in, ".$_SESSION['user']."!</p>";
?>

Vypadá to že by to mohlo fungovat, co vy na to?
CZechBoY
Profil
No pokud tam ta hodnota není tak asi uživatel není přihlášený a neprošel autentizací.
Keeehi
Profil
leorond:
Změna databáze na práci se session by mít vliv neměla.
No a lépe by to bylo takto:
$user = isset($_SESSION['user']) ? $_SESSION['user'] : NULL;

if($user === NULL) {
    // neprihlášen
} else {
    // přihlášen jako $user
}
leorond
Profil
Vlastně je to pro funkci která ověřuje zda je uživatel přihlášen, takže potom ověřím podmínkou

 if(prihlaseny())  {
  // Přihlášen
}  else  {
  // Není přihlášen
}
muhehe
Profil
Nestačí ji definovat ještě před tím, než se někde bude volat nebo s ní pracovat?
To mi většinou při podobných případech funguje.

$_SESSION['user'] = "";
Keeehi
Profil
muhehe:
Tím si smažeš to něco co v ní už bylo, pokud to tam tedy bylo.
muhehe
Profil
Keeehi:
Psal jsem ještě před použitím. Samozřejmě, že pak se tahle konstrukce už nepoužívá.
Fisir
Profil
Reaguji na muhehe:
Přiřazením prázdného řetězce do session přepíšeš její původní obsah, tudíž by se po aplikování tvé rady uživatel vždy tvářil jako nepřihlášený.
muhehe
Profil
Fisir:
Myslím definovat to takhle před tím, než se do ni vloží data. To by mu pak tahle hláška nevyskakovala. Pokud se mu to děje na stránce, kde se zrovna plní.

Já to takhle používám běžně a nemám s tím problémy.
if(empty()) {vložím prázdný řetězec} else {nic nedělám}

Funguje mi všechno. Dělám něco špatně?
Fisir
Profil
Reaguji na muhehe:
Na stránce pro přihlášení nastavím session user na hodnotu pepa. Uživatel přejde na stránku úpravy profilu, kde se logicky musí kontrolovat přihlášenost uživatele. Dle tvého postupu hned na začátku skriptu (ještě před kontrolou přihlášenosti) nastavím session user na prázdný řetězec. Následně zkontroluji, zda je uživatel přihlášen: obsah session user je prázdný, tudíž přihlášen není. Uživatel je přesměrován na stránku pro přihlášení.

Jestli to myslíš tak, že by se session user měla nastavit na prázdný řetězec při přihlášení, tak to opět nedává smysl. Nejprve nastavím session user na prázdný řetězec, přičemž ihned poté do ní vložím identifikátor uživatele. To tam ten identifikátor můžu vložit rovnou, ne?

if(empty()) {vložím prázdný řetězec}
Tenhle kód nedává smysl. Funkce empty() ověří, zda daná proměnná obsahuje prázdný řetězec. Pokud ano, přepíšu jí prázdným řetězcem.
muhehe
Profil
Fisir:
Myslel jsem, že se mu to právě děje na stránce přihlášení, proto to není nastavené.

Jinak já se s touhle hláškou setkávám docela často a tím vložením prázdného řetězce se mi to odstraní. Představuji si to tak, že se mi jako ta session nebo proměnná definuje, že existuje. Nejsem teoretik, takže se dohadovat s teoretikem nemůžu. Ale můžu říct, že přesně touhle konstrukcí se mi ta hláška odstraní i když by to podle tebe nemělo vůbec nic dělat.
Dusann
Profil
Fisir:

Funkce empty() ověří, zda daná proměnná obsahuje prázdný řetězec.

Neoveruje len či ide o prázdny reťazec, ale aj či ide o reťazec s hodnotou '0'.
Keeehi
Profil
muhehe:
když by to podle tebe nemělo vůbec nic dělat.
Nikdo neříká, že to nic nedělá, ale že ta tvoje řešení postrádají smysl. Přiřazení prázdné hodnoty by smysl mělo, ale ne způsobem, jaký jsi popsal. Muselo by to vypadat takto:
$_SESSION['user'] = "";

...

if ( /* úspěšné ověření uživatele */ ) {
    $_SESSION['user'] = $uzivatel;
}

Nebo hezčeji
if ( /* úspěšné ověření uživatele */ ) {
    $_SESSION['user'] = $uzivatel;
} else {
    $_SESSION['user'] = "";
}

Ale přednastavování nějakých defaultních hodnot a spoléhání se na to, že tam někdy později na nějaké další stránce budou mi nepřijde jako dobrá praxe. Je mnohem lepší si na té další stránce ověřit, zda tam ty hodnoty jsou a tím pádem ani nejsou potřeba předtím nastavovat defaultní.
muhehe
Profil
Keeehi:

V podstatě jsem psal to stejné, jen jsem se do hloubky nezabýval ověřením a tuhle část zjednodušil. Fisar mi napsal, že je to úplný nesmysl, ty tu vlastně používáš to stejné přiřazení v poslední části tvého kodu s názvem "Nebo hezčeji" jako jsem napsal. Tak se dohodněte, každý z vás tvrdí něco jiného (ty v podstatě to co já), ale všichni argumentujete proti mě.. :D
Keeehi
Profil
muhehe:
Příklady co jsi poslal nebo popsal jsou opravdu nesmyslné. Tak jsem z věštecké koule uhodl, co jsi si myslel ale nezvládl napsat a vytvořil jsem to v [#13]. Takovýto příklad by smysl dával. Stále mi to však jako dobrá praxe nepřijde.
Fisir
Profil
Reaguji na Dusanna:
Neoveruje len či ide o prázdny reťazec, ale aj či ide o reťazec s hodnotou '0'.
Nebo taky 0, 0.0, null, false, prázdné pole, proměnnou bez hodnoty nebo nedefinovanou proměnnou. Děkuji za doplnění.
muhehe
Profil
Keeehi:
Trochu to bagatelizuješ, nemyslím si, že jsi tak dobrý věštec. Prostě bylo jasné jako to bylo myšleno. Když nenapíšeš na začátek <?php tak si to taky většina lidí domyslí.
leorond
Profil
muhehe:
Bohužel tvá teorie s domyšlením <?php se mi moc nezdá :D

Nakonec jsem použil tento kód

<?php
session_start();
//session_unset();
 
$user    =    'Admin';
 
if(empty($_SESSION['user']))    {
    $_SESSION['user']    =    NULL;
}
 
$_SESSION['user']    =    $user;
 
echo "<p>You are now logged in, ".$_SESSION['user']."!</p>";
?>

Jen mne napadlo co kdyby bylo proměnných $_SESSION více a chtěl bych to nacpat do jedné podmínky?

Mohlo by to vypadat třeba takto?

<?php
session_start();
//session_unset();
 
$user    =    'Admin';
 
if(empty($_SESSION['user'])    &&    empty($_SESSION['pass']))    {
    $_SESSION['user']    =    NULL;
    $_SESSION['pass']    =    NULL;
}
 
$_SESSION['user']    =    $user;
$_SESSION['pass']    =    $pass;

echo "<p>You are now logged in, ".$_SESSION['user']."!</p>";
?>
Keeehi
Profil
leorond:
Tvá podmínka v kódu je úplně zbatečně. Úplně stejně funguje:
<?php
session_start();
//session_unset();
 
$user    =    'Admin';
 
$_SESSION['user']    =    $user;
 
echo "<p>You are now logged in, ".$_SESSION['user']."!</p>";
?>

Jinak řečeno, uživatel je vždy Admin.

Další, co je nevhodně použité je funkce empty. Ano, funguje to s ní (ve většině případů) ale mnohem lepší je funkce isset.

Jen mne napadlo co kdyby bylo proměnných $_SESSION více a chtěl bych to nacpat do jedné podmínky?
>
Mohlo by to vypadat třeba takto?
Nemohlo. Do jedné podmínky to nacpat nejde.


Závěrem: Na začátku kódu použij
$user = isset($_SESSION['user']) ? $_SESSION['user'] : NULL;
$pass = isset($_SESSION['pass']) ? $_SESSION['pass'] : NULL;

A dále v kódu používej už jen $user a $pass pro čtení (když potřebuješ uživatele nebo heslo zjistit).
Pokud chceš uživatele nastavit použiješ $_SESSION['user'] = "nový uživatel"; a na další stránce budeš mít pak v $user hodnotu nový uživatel.
leorond
Profil
Keeehi:
To zní logicky, mohu tě ještě poprosit?

Popiš mi jak ten kód funguje, tedy hlavně jakou funkci plní ( ? ) a ( : ).

Děkuji


Keeehi [#19]: Tento příklad mi právě nefunguje a hodí mi hlášku Undefined index: user in


Přitom pro připojení k mysqli mi to takto fungovalo normálně.
Keeehi
Profil
leorond:
Popiš mi jak ten kód funguje, tedy hlavně jakou funkci plní ( ? ) a ( : ).
Říká se tomu ternární operátor. Je to takový zkrácený if.
podmínka ? když podmínka platí : když podmínka neplatí
Tudíž celý ten řádek i s tím přiřazením do proměnné říká: Když $_SESSION['user'] existuje (isset($_SESSION['user'])) do proměnné $user přiřaď $_SESSION['user'] jinak tam přiřaď NULL.
muhehe
Profil
Keeehi: leorond:

Ternární operátor je alternativa, ale spousta lidí se obejde i bez něj.
Navíc jsou i názory, že je pomalejší, pravděpodobně protože má nižší prioritu.
leorond
Profil
muhehe:
Náhodou mne to docela zajímá, je to lepší zápis než vypisovat celou podmínku.

Keeehi:
Jasný takže je to vlastně klasická podmínka jen jinak zapsaná, vypadá to zajímavě.
Fisir
Profil
Reaguji na muhehe:
jsou i názory, že je pomalejší, pravděpodobně protože má nižší prioritu
Pravděpodobně proto, že pracuje jinak s referencemi, než standardní if.
Davex
Profil
muhehe:
Navíc jsou i názory, že je pomalejší, pravděpodobně protože má nižší prioritu.

Fisir:
Pravděpodobně proto, že pracuje jinak s referencemi, než standardní if.

Od PHP 5.4 už to neplatí a rychlost je téměř srovnatelná. Nicméně pro začátečníka je vhodnější a čitelnější varianta se strukturou if - then - else.
leorond
Profil
No použil jsem klasickou podmínku a vše funguje dobře, tím nechci říct že by druhá varianta byla horší ale nejdříve si o tom něco zjistím abych věděl jak a kdy ji využívat.


Jinak pracuji s PHP7 a opravdu je tam minimální rozdíl.
pcmanik
Profil
leorond:
Kde? V rýchlosti ternanej podmienky a klasického if-u? Nesranduj tam nemôžeš videť rozdiel :)
Davex
Profil
leorond:
Jinak pracuji s PHP7
Tam můžeš použít Null Coalescing Operator, který ale nefunguje ve starších verzích PHP.
$user = $_SESSION['user'] ?? NULL;

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: