Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Notice: Undefined index

Sivun loppuun

latenleffahylly [04.09.2012 13:48:55]

#

Hei,

Onko tämä oikea tapa määritellä indeksi? $_SESSION['id']

1.) Tarkastetaan ollaanko sisällä
2.) Suoritetaan seuraava vaihe

session_start();
// Istunnon käyttäminen vaatii, että koodin alussa kutsutaan funktiota session_start.
// Tämän jälkeen istuntomuuttujia voi käsitellä taulukon $_SESSION kautta.


$_SESSION = array();

if(isset($_SESSION["id"]) && $_SESSION["id"]== "") {



  if($_SESSION['id'] && !isset($_COOKIE['tzRemember']) && !$_SESSION['rememberMe']) {
  // If you are logged in, but you don't have the tzRemember cookie (browser restart)
  // and you have not checked the rememberMe checkbox:

  $_SESSION = array();
  session_destroy();
  // Destroy the session

  }

}

Lebe80 [04.09.2012 13:58:59]

#

Eikös $_SESSION = array()-määritys tyhjennä koko session-taulukon aika lahjakkaasti?

latenleffahylly [04.09.2012 14:04:52]

#

$_SESSION['key'] = 'value'

isset — Determine if a variable is set and is not NULL

isset tarkistaa onko $_SESSION muuttuja tyhjä -> palauttaa arvon TRUE jos session on olemassa ja arvo muukuin 0 tai FALSE

if(isset($_SESSION["id"]) && $_SESSION["id"]== "") {

Lebe80 [04.09.2012 14:14:38]

#

Eikun ihan siitä asti kun kortin sain, vaikka aurinko vähän paistelikin.


Mutta ei siitä sen enempää, eli yritäs nyt kuitenkin katsoa ensin mitä kirjoitin, ja vastaa sitten vaikka siihen ennen kuin pasteat enemmän jotain php-skriptejäsi.

Eli eikös session-taulukko tyhjene kun teet näin:

$_SESSION = array();"

Ennen kuin teet näin:

if(isset($_SESSION["id"]) && $_SESSION["id"]== "") {

vrt.

$hedelma = "omena";



$hedelma = "";
if ( $hedelma == "omena"){
  echo "Omena!";
}else{
  echo "Mystisesti ei koskaan olekaan omena... missähän olisi vika??? hmmmmm hmmmm hmmm";
}

latenleffahylly [04.09.2012 14:15:49]

#

Lebe80 kirjoitti:

Eikös $_SESSION = array()-määritys tyhjennä koko session-taulukon aika lahjakkaasti?

Kyllä otin sen pois.

The Alchemist [04.09.2012 16:24:15]

#

latenleffahylly kirjoitti:

$_SESSION['key'] = 'value'

isset — Determine if a variable is set and is not NULL

isset tarkistaa onko $_SESSION muuttuja tyhjä -> palauttaa arvon TRUE jos session on olemassa ja arvo muukuin 0 tai FALSE

Oi voi... Luitko ollenkaan tuota pasteamaasi riviä? Isset() kertoo, onko muuttujalla / indeksillä jokin muu arvo kuin NULL. Mistä revit nollan? Mistä revit FALSE:n? Kumpikaan niistä ei ole sama asia kuin NULL.

foreach ([null, 0, false, ''] as $x) {
    var_dump(isset($x));
}

// Tulos jotain tällaista: false, true, true, true

latenleffahylly [04.09.2012 17:45:21]

#

En ymmärrä logiikkaa.. aluksi koodissa riittää kun tekee näin (ei virheilmoitusta)

$_SESSION['id'] = 1;

Samaa tapaa kun soveltaa sitten alla olevaan, $_GET['sivu'] = 1;

$sites = array(
  'etusivu' => 'etusivu.php',
  'tapahtumat' => 'tapahtumat.php',
  'varaa' => 'varaa.php',

);
include($sites[$_GET['sivu'] ?: 'etusivu']);

..niin ja tuosta tulkinnastani, false, 0 jne. olen kaiketi mennyt sekaisin eri ojeissa. Oma versioni:
-------------------------------------------------

session_start();

- Luo istunnon

$_SESSION

- Istunto tallentuu session muuttujaan
- Sessio-muuttujassa on tallennettuna 1 käyttäjän tiedot
- Tämä tieto pysyy sivulta toiselle navigoidessa

ISSET

- Issetillä voidaan tutkia on sessio-muuttuja olemassa, tai onko se tyhjä (TRUE/FALSE)

- Session muuttujan voi alustaa antamalle sille arvon, esim. 0
$_SESSION['uusiIstunto'] = 1;

qeijo [04.09.2012 18:13:49]

#

latenleffahylly kirjoitti:

- Issetillä voidaan tutkia on sessio-muuttuja olemassa, tai onko se tyhjä

<?php

$var = "";

var_dump(isset($var)); //true

$var = NULL;

var_dump(isset($var)); //false

?>

latenleffahylly [04.09.2012 18:36:36]

#

Kiitos geijo.

Tuota, ongelmani on seuraava. Käytän web-sivuja tehdessä tällaista virheilmoitus-koodia, eli yritän löytää virheet:

ini_set('display_errors', 'on');
error_reporting(-1);

Jos otan virheilmoituksen pois koodista, kaikki toimii täydellisesti, mutta onko tämä ok...??? Kun laitan virheilmoitukset päälle saan valtavan määrän tällaisia ilmoituksia:

Notice: Undefined index: submit in /var/www/projekti_05/index.php on line 46
Notice: Undefined index: id in /var/www/projekti_05/index.php on line 92
Notice: Undefined index: submit in /var/www/projekti_05/index.php on line 100
jne.
----------------------------------------------------------------

Käsittääkseni minun pitäisi alustaa nämä sessiot sun muut. Voisin toki antaa muitakin arvoja kuin 1. (Esim. array(), 0, "", jne.) Kun toimin näin virheilmoitukset häviävät, mutta tietenkin systeemi ei enää toimi. Eli kirjaudu sisään paneeli. Milloin annetaan arvoksi esim. array? ja milloin 1. Entä missä kohtaa koodissa nämä asiat kerrotaan. Voidaanko tieto syöttää jo header.php tiedostossa kaikki peräkkäin. Kiitos jos jaksoitte lukea.

$SESSION['id'] = 1;
$_COOKIE['tzRemember'] = 1;
$_SESSION['rememberMe'] =1;


if($_SESSION['id'] && !isset($_COOKIE['tzRemember']) && !$_SESSION['rememberMe'])

The Alchemist [04.09.2012 19:04:35]

#

Virheilmoituksia ei pidä ottaa päältä siksi, että haluaa peittää omat ohjelmointivirheensä. Virheet täytyy nähdä jotta ne voisi myös korjata. Tiukemmissa kielissä melkein mikä tahansa noista virheistä johtaisi sovelluksen välittömään kaatumiseen tai muihin vakaviin virheisiin, mutta php on onneksi ja valitettavasti sallivampi. Virheitä ei pidä katsoa ylimalkaisesti, että tuohan on "vain" notice, ei sillä niin väliä.

lainaus:

Milloin annetaan arvoksi esim. array? ja milloin 1. Entä missä kohtaa koodissa nämä asiat kerrotaan.

Funktiolle syötetään sentyyppisiä parametreja kuin funktio tarvitsee. Php:n omille funktioille löytyy kattava dokumentaatio sivustolta php.net. Laajennusten dokumentaatiot löytyvät yleensä niiden omilta kotisivuilta. Useimmat laajennukset on kommentoitu käyttäen phpdoc-kommentointimallia, jolloin niille voi myös itse generoida dokumentaation pelkän lähdekoodin pohjalta esimerkiksi Doxygen-ohjelmalla.

Muuttujille on tietysti loogisinta antaa sellainen oletusarvo, joka kuvastaa sitä, millaista tietoa siihen myöhemmin tallennetaan. Taulukon sisältävälle muuttujalle taulukko, olion sisältävälle muuttujalle null, merkkijonomuuttujalle tyhjä merkkijono ja sitä rataa. (Toki esimerkiksi merkkijonomuuttujan voi alustaa vaikka arvoon 'kissa', jos siitä kokee saavansa jotain hyötyä.)

latenleffahylly [04.09.2012 20:29:42]

#

Kiitos jälleen alkemisti, selkeästi ymmärrät kokonaisuuksia hyvin. Tämä kyseinen kirjautumislomake on tutoriaali. Siksi on hassua että se toimii 100% selaimessa, mutta sitten kun laittaa tuon mainktsemani virheilmoituksen päälle, niin systeemi ei enää toimikkaan.

Toki haluaisin tehdä juuri tiukimman seulan mukaan. Mutta miksi tutoriaali ei alusta noita sessioita tai cookieita jne.? Onkohan siihen joku syy..

Tarkoitan vain että siitä tulee paljon lisäkoodia eri väleihin kun aina kerrotaan että tämän asiam oletusarvo on tämä ja tämän tämä jne. Jokatapauksessa, tuo oli täysin uusi tieto että eri funktioilla on oma oletusarvo, esim. Olio aloittaisi arvolla NULL.

The Alchemist [04.09.2012 20:44:04]

#

Kylmiltään veikkaisin ratkaisun löytyvän juuri niistä virheilmoituksista. Jos esimerkiksi output buffering ei ole päällä, niin noticeiden takia evästeiden asentaminen ei onnistu, koska otsikkotiedot (headers) täytyy lähettää ennen tulostuksen (käyttäjälle näkyvän sisällön) alkamista, ja keksit ovat juuri otsikkotiedoissa välitettävää dataa.

Superglobaaleita ei tietenkään voi koodari itse alustaa, koska se tarkoittaisi niiden valmiiksi sisältämän datan tuhoamista. Lisäksi ne luodaan ja täytetään valmiiksi php:n toimesta.

Superglobaaleihin kirjoittaminen on muutenkin väärin, koska yleensäkin globaaleihin muuttujiin turvautuminen on purkkaa ja huonoa koodaamista ja huonoa suunnittelua.

En ymmärrä tuosta "funktioiden oletusarvosta", mitähän mahdoit tarkoittaa? En sanonut, että tiettyä tyyppiä edustavalla muuttujalla olisi jokin tietty oletusarvo tai että sille pitäisi antaa jokin tietty oletusarvo. Php:ssä muuttujia ei ole sidottu mihinkään tiettyyn tyyppiin missään vaiheessa, mutta on järkevintä käyttää sellaista oletusarvoa, joka kuvastaa muuttujan tulevaakin sisältöä.

Toki asiat voi tehdä vaikka miten epäintuitiivisestikin, jos on jokin pakonomainen tarve siihen.

$a = 'kissa';
$a += 2; // täysin validi

$b = 123.5;
$b .= 'abc'; // täysin validi

$c = null;
$c['foo']['bar'] = 'foobar'; // täysin validi

$d['foo']['bar'] = 'foobar'; // täysin validi vaikkei muuttujaa ole edes olemassa ennen tätä riviä

...tuollainen saa kanssakoodarit lähinnä harkitsemaan työkaverin vaihtoa.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta