Jump to content
Sign in to follow this  
Gilbert

Rett bruk av "fnutter" i $array[$bar]

Recommended Posts

$array[$bar];
$array["$bar"];
$array[''.$bar.''];

 

Notice: Undefined index: on line 1

Notice: Undefined index: on line 2

Notice: Undefined index: on line 3

 

Altså, det er en fnuttfeil, regelen sier $array['foo']. Men hvis jeg skal ha en variabel i stedet for foo, altså $bar, så må det bli noe surr med fnutter, for jeg får en notice. Den er det forsåvidt ikke noe problem å bli kvitt via error_reporting(), men jeg vil gjerne programmere så nøyaktig som mulig. Er det noen som vet hvordan jeg kan bli kvitt Noticen? Sitter og studerer gjennom eksempler i manualen, men ikke funnet noe så langt.

 

edit: ser at det er flere problemer inne i bildet her, så korrekt spørsmål skal være hvordan bruke fnutter riktig ved $array[$bar]?

Edited by fjartan

Share this post


Link to post

Nei, det skal ikke være fnutter på variabler.

 

Noticen får du fordi variabelen ikke har noen verdi, og noticen kan fjernes med å endre på error reportinga ;)

Share this post


Link to post
Noticen får du fordi variabelen ikke har noen verdi, og noticen kan fjernes med å endre på error reportinga ;)

5342921[/snapback]

 

Argh.. irriterer meg når folk ikke gidder å skrive koden skikkelig, men heller tar snarveier. Fy skamme seg! :mad:

 

For de som har tilgang til PHP installasjonen, så oppfordrer jeg til bruk av php.ini-recommended som standard php.ini fil og at du slår på følgende innstillinger i filen når du utvikler:

 

error_reporting  =  E_ALL
display_errors = On

 

Dette vil tvinge til å lære deg til å kode renere og sikrere og har vi alle noe igjen for.

 

El Nino

Share this post


Link to post

Så du mener at jeg skal skrive if($_GET['page']) { $page = $_GET['page']; } else { $page = ""; } for hver gang, istedenfor $page = $_GET['page']; ? I don't think so ;)

Share this post


Link to post
Så du mener at jeg skal skrive if($_GET['page']) { $page = $_GET['page']; } else { $page = ""; } for hver gang, istedenfor $page = $_GET['page']; ? I don't think so ;)

5348647[/snapback]

 

Ja. Hvor mange ganger skriver du det likssom? 10-20 ganger?.. da ville jeg lagd en funksjon som gjorde det..

 

El Nino

Share this post


Link to post

El Nino:

Var inne på tanken å gjøre slik som ex0n sier, akkurat for å slippe notice'er, men etter å ha sjekket litt fant jeg ut at slike notice'er har ike noe å si og man kan enkelt skjule dem...

 

Så hvorfor ta seg bryet da? Hvordan blir koden "renere" hvis man gjør det slik?

Share this post


Link to post
El Nino:

Var inne på tanken å gjøre slik som ex0n sier, akkurat for å slippe notice'er, men etter å ha sjekket litt fant jeg ut at slike notice'er har ike noe å si og man kan enkelt skjule dem...

 

Så hvorfor ta seg bryet da? Hvordan blir koden "renere" hvis man gjør det slik?

5351780[/snapback]

 

Er nettopp det jeg mener, om du har en udefinert variabel er det mye lettere å slå av noticer (som kommer opp for hver udefinerte variabel), enn å skrive om scriptet ;)

Share this post


Link to post

Hvorfor kan dere ikke heller høre litt på El Nino isteden for å si i mot?

El Nino er en proffesjonell PHP utvikler, og har dette som jobb - så det kan være lurt å lytte litt til råd og erfaringer.

 

Grunnen til at El Nino har rett er ganske enkel. Når du får opp en notice så er dette fordi PHP forteller deg at det er noe feil i scriptet ditt! Ellers ville det ikke dukke opp noen feilmelding.

 

Over til det ex0n mener var et argument for å skippe det.

1. if($_GET['page']) er feil kode. Der gjør du en boolean validering av variabelen, det du ser etter er enten isset() eller empty(), avhengig av resten av koden din.

2. Selvfølgelig skal du alltid validere data som kommer fra en bruker!

Hvis den ikke er satt:

- skyldes dette i så fall en glipp fra en bruker?

Da skal det vises en feilmelding.

- eller skyldes det at den ikke er nødvendig? Hvis den ikke er nødvendig så skal den heller ikk brukes senere i scriptet og derfor skal ingen ny variabel ($page) få en tom verdi. Dette vil i så fall kvalifisere til PHP 21 vanligste feil - artikkelen kan leses på zend.com.

 

Selv i et så enkelt script som:

<?php echo "Velkommen, ditt navn er: " . $_GET['navn']; ?>

Må variabelen valideres! Hvis den ikke er satt så står det "Velkommen, ditt navn er: ". Det ville være forventet en feilmelding!

 

Jeg bruker ikke dette selv på ferdige scripts, for der burde det alltid finnes en egen error handler, som sender deg alle feilmeldinger - og da er det ikke dumt å ta med notice også.

 

Nesten alltid må en variabel valideres, så hvis det er eneste unnskyldningen dere har for å ikke skrive renere kode så burde dere vurdere å bytte programmeringsstil. Argumentet om ressursbruk er litt sterkere, men totalt sett så er dette for lite for å bruke som unnskyldning. Glem ikke sikkerheten - validering av variabler er viktig!

Share this post


Link to post

Da jeg byttet webhotell for ikke så lenge siden, oppdaget jeg at det jeg trodde var grei php-kode ikke hadde sjans på det nye hotellet. Kort fortalt måtte alt skrives på nytt, tilpasset både safemode off og slikt.

Share this post


Link to post
Absolutt, lytt til fjartan og El Nino!

PHP er et kraftig språk, som er veldig plattform uavhengig - så skriv det også deretter!

5352015[/snapback]

 

Joda, men når jeg sitter med en webserver kun til privat bruk til min egen database over DVDer osv gidder jeg ikke kode frem masse feilmeldinger osv, siden jeg vet hva skriptet gjør uansett. Da er det enklere å slå av noticer. Men såklart, skulle dette vært et offisielt script med flere brukere hadde jeg selvsagt lagt litt mer tid i det for å kode 100% riktig.

Share this post


Link to post

Hvorfor legge til seg uvaner?

Dette høres ut som warnings i C++. Mange som bare skrur dem av, men det straffer seg senere. (Les kræsj!/memory leak)

 

PHP er et utrolig snilt språk. Du kan gjøre nesten hva du vil med typer og array. Når PHP sier ifra, så er det så definitivt noe du burde sjekke, for da er du virkelig ute å kjøre.

Edited by Nazgul

Share this post


Link to post
Hvorfor legge til seg uvaner?

Dette høres ut som warnings i C++. Mange som bare skrur dem av, men det straffer seg senere. (Les kræsj!/memory leak)

 

PHP er et utrolig snilt språk. Du kan gjøre nesten hva du vil med typer og array. Når PHP sier ifra, så er det så definitivt noe du burde sjekke, for da er du virkelig ute å kjøre.

5352481[/snapback]

 

Det er ikke særlig stor fare med en udefinert variabel i et privat script, hadde det vært en fare hadde jeg retta det ;)

 

EDIT: Men her kommer vi veldig off-topic gutter...

Edited by ex0n

Share this post


Link to post
Hvorfor legge til seg uvaner?

Dette høres ut som warnings i C++. Mange som bare skrur dem av, men det straffer seg senere. (Les kræsj!/memory leak)

 

PHP er et utrolig snilt språk. Du kan gjøre nesten hva du vil med typer og array. Når PHP sier ifra, så er det så definitivt noe du burde sjekke, for da er du virkelig ute å kjøre.

5352481[/snapback]

 

Det er ikke særlig stor fare med en udefinert variabel i et privat script, hadde det vært en fare hadde jeg retta det ;)

 

EDIT: Men her kommer vi veldig off-topic gutter...

5352498[/snapback]

 

Problemet er vel at du anbefaler og viser andre hvordan de skal ta snarveier. For alt du vet så kan det hende at de skriver koder som skal publiseres på en public webserver og det utgjør en sikkerhetsrisko.

 

Og som Nazgul sier: Hvorfor legge til seg uvaner?

 

Skriver du koden riktig fra første stund, så slipper du feilmeldinger.

 

"Hastverk er lastverk, det sa min mor".

 

El Nino

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...