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 |
#2 · Zasláno: 26. 8. 2016, 10:48:14
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 |
#4 · Zasláno: 26. 8. 2016, 11:29:00
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 |
#5 · Zasláno: 26. 8. 2016, 11:32:44
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 |
#9 · Zasláno: 26. 8. 2016, 21:48:56
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 |
#12 · Zasláno: 26. 8. 2016, 22:54:11
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 |
#13 · Zasláno: 27. 8. 2016, 00:43:51
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 |
#14 · Zasláno: 27. 8. 2016, 09:50:42
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 |
#15 · Zasláno: 27. 8. 2016, 10:27:38
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 |
#16 · Zasláno: 27. 8. 2016, 10:51:58
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 |
#17 · Zasláno: 27. 8. 2016, 10:58:22
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 |
#18 · Zasláno: 27. 8. 2016, 12:41:59
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 |
#19 · Zasláno: 27. 8. 2016, 12:54:27
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í $_SESSION['user'] existuje (isset($_SESSION['user']) ) do proměnné $user přiřaď $_SESSION['user'] jinak tam přiřaď NULL .
|
||
muhehe Profil |
#22 · Zasláno: 27. 8. 2016, 16:15:25
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 |
#23 · Zasláno: 27. 8. 2016, 16:31:54
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 |
#24 · Zasláno: 27. 8. 2016, 17:43:54
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 |
#25 · Zasláno: 28. 8. 2016, 21:10:44
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 |
#27 · Zasláno: 28. 8. 2016, 23:09:17
leorond:
Kde? V rýchlosti ternanej podmienky a klasického if-u? Nesranduj tam nemôžeš videť rozdiel :) |
||
Davex Profil |
#28 · Zasláno: 28. 8. 2016, 23:31:54
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; |
||
Časová prodleva: 7 let
|
0