Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: Yksinkertainen nettisivusto + monta muuttujaa

Sivun loppuun

timodemus [14.04.2008 18:10:59]

#

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...

tsuriga [14.04.2008 18:54:48]

#

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.

timodemus [16.04.2008 18:49:17]

#

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)?

hauki [16.04.2008 18:53:26]

#

if(isset($muuttuja))
{koodia....;
}

timodemus [16.04.2008 18:57:14]

#

Tarkoitin osoiterivillä olevaa muuttujaa.
Toimiiko seuraava?:

if(isset($_GET['muuttuja']))
{koodia....;
}

EDIT: Sain toimimaan tarkistuksen:

if($_GET['muuttuja'] =="") {
echo 'Ei arvoa!';
};

hauki [16.04.2008 21:35:53]

#

Tollasta oon ite käyttäny, mutta en nyt oo mikään ammattilainen

reca [16.04.2008 21:51:14]

#

timodemus kirjoitti:

<?php
if($_GET['muuttuja'] =="")
{
echo 'Ei arvoa!';
};
?>

Kannattaa tutustua komentoon empty().
https://www.php.net/empty

Merri [17.04.2008 06:15:14]

#

En oikein näe pointtia emptyn 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ää.

tsuriga [17.04.2008 08:22:52]

#

Merri kirjoitti:

<?php
// sitten tietokantaan laittaessa pitää suojata talletus esim. mysql_real_escape_string:llä
?>

MySQLi ja Prepared Statements.

Merri kirjoitti:

<?php
// tässä on "suosi POSTia GETin sijaan" -tilanne: molemmat kuitenkin pakotetaan kokonaislukumuuttujiksi
$luku = ( isset($_POST['luku']) ? intval($_POST['luku']) : intval($_GET['luku']) );
?>

Heittää herjaa, kun ei tarkasteta luku-indeksin löytymistä $_GET-taulukosta. Integeriksi voi myös castata.

Merri kirjoitti:

<?php
// jos arvo voi tulla myös POSTina, niin voi toki tehdä myös näin:
$checkbox = isset($_POST['checkbox']) || isset($_GET['checkbox']);
?>

Tällaisessa tilanteessa voi jo miettiä $_REQUEST-taulukon käyttämistä (vaikka se sisältääkin myös $_COOKIE-taulukon arvot).

Merri kirjoitti:

<?php
// tästä selviää, että $teksti on tekstimuuttuja
if( $teksti != '')
{
    echo 'Teksti on.';
}
?>

$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:

<?php
// tämän nähdessä tällaisenaan on selvää, että $checkbox on boolean-arvo
if( $checkbox )
{
    echo 'Checkbox on.';
}
?>

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.

Merri [17.04.2008 09:25:12]

#

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.

reca [17.04.2008 09:42:12]

#

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...

tsuriga [17.04.2008 13:07:38]

#

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.

timodemus [17.04.2008 22:52:56]

#

Kiitos hyvistä vinkeistä kaikille.
Yksi kysymys vielä:
Mikä olisi yksinkertaisin tapa piilottaa osoiterivin muuttujat käyttäjältä?

hauki [17.04.2008 22:58:23]

#

Piilottaminen onnistuu kehyksillä(eli tyhjä sivu jonneki), mutta se ei tarkoita salausta

timodemus [17.04.2008 23:03:15]

#

OK.

Onko muita keinoja kehyksien lisäksi?

Blaze [17.04.2008 23:18:57]

#

Käytä POSTia GETin sijaan.

hauki [17.04.2008 23:23:22]

#

Vaatiiko POSTin lähetys aina formin

Short Php [18.04.2008 09:19:33]

#

Ei. https://www.ohjelmointiputka.net/koodivinkit/24188-php-sivun-hakeminen-postin-ja-keksien-kanssa

timodemus [13.05.2008 19:02:57]

#

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ä...

tsuriga [13.05.2008 20:21:20]

#

Tee erillinen sivu, joka tekee arvonmuutoksen ja heittää tämän jälkeen takaste sinne vanhalle sivulle.

Pallo [13.05.2008 20:24:56]

#

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>

tsuriga [13.05.2008 21:31:57]

#

-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


Sivun alkuun

Vastaus

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

Tietoa sivustosta