Haluaisin tehdä pienen esimerkkisivuston eri menetelmien käytöstä
ja soveltaa sitä käytännössä, jos saan siihen hyvät ohjeet.
Kielinä olisivat PHP ja HTML (+ CSS jos tarvitaan),
mutta en tiedä kumpi olisi helpompi tapa muuttujien käsittelyyn,
osoiterivi vai evästeet (en osaa vielä käyttää evästeitä).
Selaimelle lähetettävä sivu html-muodossa:
<html> <head> <title>Sivusto</title> </head> <body> <img src="logo1.jpg" width="100" height="100" alt=""><br> Eka logo<br> <br> <img src="nimi1.jpg" width="100" height="100" alt=""><br> Eka nimi<br> <br> <img src="merkki1.jpg" width="100" height="100" alt=""><br> Eka merkki<br> <br> </body> </html>
Logon, nimen ja merkin alla olisi linkit eri vaihtoehdoille:
- logo1.jpg, logo2.jpg, logo3.jpg
- nimi1.jpg, nimi2.jpg, nimi3.jpg
- merkki1.jpg, merkki2.jpg, merkki3.jpg
Linkkiä klikkaamalla vaihtuisivat vain kyseinen kuva ja kuvateksti,
muut kuvat ja kuvatekstit säilyisivät ennallaan (kunnes niiden alla
olevia linkkejä klikataan).
Koodia (mielummin väännettynä rautalangasta) please...
Keksit: Tee setcookie.php, joka ottaa osoiteriviltä parametrikseen keksin avaimen (logo/nimi/merkki) ja arvon (1,2,3). Tulostelet sitten tuolla sivulla logot, merkit ja nimet keksitaulukon arvoista. Putkan PHP-oppaassa käsitellään keksien asettaminen ja poistaminen, sekä myös osoiteriviltä lukeminen.
Osoiterivi: Muodostat linkit lukemalla osoiterivin muuttujat sisältävästä taulukosta ($_GET
) nykyiset arvot muuttujiin ja asettamalla niille myös oletusarvot mikäli joku sattuu puuttumaan. Sitten tulostat linkit kolmessa silmukassa niin, että vain yhden avaimen arvo muuttuu per silmukka, kahden muun avaimen arvoiksi käytät osoiteriviltä saatuja arvoja.
Kiitos vinkistä!
Tässä on lyhyesti tekniikka, jolla saan tallennettua muuttujat osoiteriviltä ja tulostettua ne,
<?php $muuttuja = $_GET['muuttuja']; echo 'Muuttujan arvo: '. $muuttuja; ?>
mutta miten tehdään tarkistus, onko muuttujalle asetettu arvo (en löytänyt ohjelmointiputkasta)?
if(isset($muuttuja))
{koodia....;
}
Tarkoitin osoiterivillä olevaa muuttujaa.
Toimiiko seuraava?:
if(isset($_GET['muuttuja'])) {koodia....; }
EDIT: Sain toimimaan tarkistuksen:
if($_GET['muuttuja'] =="") { echo 'Ei arvoa!'; };
Tollasta oon ite käyttäny, mutta en nyt oo mikään ammattilainen
En oikein näe pointtia empty
n käytölle. Oikeastaan ihan aina on vaan parempi pakottaa muuttuja käyttämään haluttua tyyppiä, ihan jo tietoturvankin takia:
<?php // tekstin lainausmerkit \" ja \' muotoon " ja ' // sitten tietokantaan laittaessa pitää suojata talletus esim. mysql_real_escape_string:llä $teksti = stripslashes($_GET['teksti']); // tässä on "suosi POSTia GETin sijaan" -tilanne: molemmat kuitenkin pakotetaan kokonaislukumuuttujiksi $luku = ( isset($_POST['luku']) ? intval($_POST['luku']) : intval($_GET['luku']) ); // checkbox-arvoja ei lähetetä jos ruksia ei ole, joten isset on erinomainen tarkistus $checkbox = isset($_GET['checkbox']); // jos arvo voi tulla myös POSTina, niin voi toki tehdä myös näin: $checkbox = isset($_POST['checkbox']) || isset($_GET['checkbox']); // tästä selviää, että $teksti on tekstimuuttuja if( $teksti != '') { echo 'Teksti on.'; } // tässä näkyy, että $luku on kokonaismuuttuja (tai voihan se toki liukulukukin olla) if( $luku != 0) { echo 'Luku on.'; } // tämän nähdessä tällaisenaan on selvää, että $checkbox on boolean-arvo if( $checkbox ) { echo 'Checkbox on.'; } ?>
Kun ensin pakottaa muuttujassa olevan arvon tiettyihin rajoihin, niin ensinnäkin tietoturva on paremmin kunnossa ja kaupanpäällisinä hoituu virheensietävyyskin, kun vääriä arvoja ei yksinkertaisesti voi tulla.
empty
on siinä mielessä roskafunktio, että se ei ainakaan rohkaise toimimaan tällä tavoin. Suurin ongelma lienee se, että koodia pitää lukea useammasta kohtaa tai jopa testata sen toimintaa ja puskea ulos muuttujien sisältöjä, jotta selviää minkä tyyppistä dataa ollaan käsittelemässä (tämä siis silloin, kun lukee toisen koodia). Muuttujatyypillä kun on suuresti väliä esimerkiksi "outoja bugitilanteita" setviessä, ja kun pakotat tietyt rajat, niin koodin lukeminen on myös toisille selkeämpää.
Merri kirjoitti:
<?php // sitten tietokantaan laittaessa pitää suojata talletus esim. mysql_real_escape_string:llä ?>
MySQLi ja Prepared Statements.
Merri kirjoitti:
Heittää herjaa, kun ei tarkasteta luku
-indeksin löytymistä $_GET
-taulukosta. Integeriksi voi myös castata.
Merri kirjoitti:
Tällaisessa tilanteessa voi jo miettiä $_REQUEST
-taulukon käyttämistä (vaikka se sisältääkin myös $_COOKIE
-taulukon arvot).
Merri kirjoitti:
$teksti
voi olla myös totuusarvo true
, epätyhjä taulukko, mikä tahansa nollasta eroava luku, resurssi tai vaikkapa objekti. Mikäli tahdotaan tarkastella muuttujan tietotyyppiä, käytetään kolmen merkin vertailuoperaattoreita. Sama homma $luku
-tarkastelussa.
PHP:n tyyppivertailutaulukot
Merri kirjoitti:
Checkbox ei ole lomakkeelta tullessaan boolean
-tyyppinen. Mikäli sille ei ole annettu value
-attribuuttia, sen arvo on string(2) "on"
. Mikäli value
on määritelty, muuttujan tyyppi on merkkijono ja arvo attribuutin sisältämä arvo.
Lomakkeelta tullessaan ei, mutta usein (vaikka ei tietenkään aina) checkboxista tarkistetaan vain onko se ruksattu vaiko ei: tässä tapauksessa sen voi yksinkertaisesti pakottaa booleaniksi PHP:n puolella. Checkboxiinhan ei edes tarvitse asettaa sitä value
-attribuuttia. Tuon if-lausekkeen pointtina tuollaisenaan on osoittaa, miten koodin merkkaustyylillä voi kertoa muuttujan tyypin. Noin esitetystä lausekkeesta kun voi päätellä että $checkbox
on jo boolean. Ylipäätään tarkoituksena oli tuoda esille sitä, että rajoittaa PHP:n puolella mahdollisia arvoja.
$_REQUESTin sisältämä $_COOKIE aika tehokkaasti tekee turhaksi käyttää sitä, ellei tarkoituksena nimenomaan ole käyttää hyväksi myös keksejä yhdessä $_GETin ja $_POSTin kanssa. Tämäkin liittyy oikeastaan tähän ajatukseeni rajoittaa arvoja, monipuolisimmat vaihtoehdot eivät välttämättä ole parhaita ja niitä käytettäessä on erikseen punnittava niiden järkevyys.
Kiitos Merri selvennyksistä :-). Näitä lisää.
Itse olen laiskana käyttänyt emptyä tarkistaakseni
muuttujia, jotta ei tarvitse miettiä useita vaihtoehtoja :-D.
Enpä aiemmin ajatellut siitä olevan mitään haittaa...
Merri kirjoitti:
-- voi päätellä että
$checkbox
on jo boolean.
Tuollaisenaan tuosta ehtolausekkeesta voi päätellä sen, että $checkbox
-muuttujan oletetaan saavan sellaisia arvoja, joiden seurauksena on oikeaan lopputulokseen päätyvä totuusarvovertailu - ei se ole boolean
ei ennen ei jälkeen, PHP vain castaa arvon automaagisesti vertailun ajaksi :).
Jos siinä muuttujassa tai metodin nimessä on esim. "is" (esim. isValid()
), silloin kehtaan odottaa totuusarvoa, mutta kyllä tuommoiset muuttujat ja vertailut ovat yleensä melko ärsyttäviä tapauksia, varsinkin dokumentoimattomana (ja muuttujia harvemmin dokumentoidaan samoin kuten metodeita). En nyt muista, mikä blogisofta se oli, mutta joskus yritin tuommoista debuggailla ja yhtä helvettiähän se oli ehtiä sitä muuttujaa ja kaikkia sen mahdollisia arvoja satojen tiedostojen joukosta.
Kiitos hyvistä vinkeistä kaikille.
Yksi kysymys vielä:
Mikä olisi yksinkertaisin tapa piilottaa osoiterivin muuttujat käyttäjältä?
Piilottaminen onnistuu kehyksillä(eli tyhjä sivu jonneki), mutta se ei tarkoita salausta
OK.
Onko muita keinoja kehyksien lisäksi?
Käytä POSTia GETin sijaan.
Vaatiiko POSTin lähetys aina formin
Luin putkan php-opasta, mutta en ymmärrä, miten tehdään sivulle linkki, jota klikkaamalla istuntomuuttujan arvo muuttuu ja sivu latautuu uudestaan.
Auttakaa, please!
EDIT: Tarkennus: istuntomuuttujalle asetettava arvo olisi muuttujassa $arvo, ei siis missään tekstikentässä...
Tee erillinen sivu, joka tekee arvonmuutoksen ja heittää tämän jälkeen takaste sinne vanhalle sivulle.
Tarkoitatko näin?
<?php $arvo = "tekstiä.."; if(isset($_GET['muoks'])){ session_start(); $_SESSION['sessio'] = $arvo; header("location: ".$_SERVER['PHP_SELF'].""); } ?> <a href="?muoks">Päivitä istuntoa..!</a>
-Location-headerille pitäisi antaa täydellinen osoite. Puuttuvat tiedot voidaan kaivaa sieltä $_SERVER
-taulukosta.
-PHP_SELF -> SCRIPT_NAME
-.""
on turha. PHP on dynaamisesti tyypitetty kieli, ja $_SERVER-taulukon kaikki arvot ovat muutenkin merkkijonoja.
-Mieluummin erillinen sivu muokkauksille, toimintojen ja tulosteen erotus -periaatteen mukaisesti
Aihe on jo aika vanha, joten et voi enää vastata siihen.