lomaketiedon vertaaminen tekstitiedostoon

jumii

Ulkoisessa tiedostossa on rivejä muodossa:
k1|käyttäjä 1
k2|käyttäjä 2
k3|kolmas
.
.
jne. Tarkoitus on katsoa, onko lomakkeella lähetettyä merkkijonoa tuossa ulkoisessa tiedostossa jollain rivillä |-merkin jälkeen seuraavalla periaatteella:
if ($_POST["lahetys"]) {
$tarkistus = file("../lista.txt");
for ($i = 0; $i < count($tarkistus); $i ) {
$parts= explode('|', $tarkistus[$i], 2);
$nimi = $parts[1];
if ($nimi == $uuser) { // uuser tulee lomakkeelta
(tämän jälkeen sitten tarvittavat toimenpiteet)

Ongelma on se, että $nimi tulostaa esimerkissä seuraavaa: "käyttäjä 1 käyttäjä 2 kolmas" yhteen pötköön (ei taulukkona), jolloin vertaaminen ei onnistu oikein, vaan lomakkeella tullutta sanaa verrataan vain tiedoston viimeiseen riviin. Miten tämän saisi vertaamaan jokaisella rivillä olevaa tietoa? Tätä on tullut mietittyä jo muutama tunti, mutta taitaa olla aivot jumissa...

11

394

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • juhakorkeapudas

      Poista exploden kolmas parametri ja varmista, että rivien viimeinen merkki on rivinvaihto. Vielä parempi olisi jos esittäisit sen funktion jossa kirjoitetaan tiedostoon.

      • jumii

        Poistin kolmannen parametrin, ei vaikuttanut parantavasti.

        Tiedostoon kirjoittaminen tapahtuu näin:
        $kayttajalista = fopen("../lista.txt", "a");
        $tallennus = "$uudenkansio|$uuser\n";
        fwrite($kayttajalista, $tallennus);
        fclose($kayttajalista);

        Noin tehden tiedot ovat tallennettuna riveittäin:
        k1|käyttäjä 1
        k2|käyttäjä 2
        k3|kolmas

        Selaimen lähdekoodissa $nimi näkyy allekkain muodossa:
        käyttäjä 1
        käyttäjä 2

        Ei siis näy mitään html-rivinvaihtoa tai vastaavaa.


      • juhakorkeapudas
        jumii kirjoitti:

        Poistin kolmannen parametrin, ei vaikuttanut parantavasti.

        Tiedostoon kirjoittaminen tapahtuu näin:
        $kayttajalista = fopen("../lista.txt", "a");
        $tallennus = "$uudenkansio|$uuser\n";
        fwrite($kayttajalista, $tallennus);
        fclose($kayttajalista);

        Noin tehden tiedot ovat tallennettuna riveittäin:
        k1|käyttäjä 1
        k2|käyttäjä 2
        k3|kolmas

        Selaimen lähdekoodissa $nimi näkyy allekkain muodossa:
        käyttäjä 1
        käyttäjä 2

        Ei siis näy mitään html-rivinvaihtoa tai vastaavaa.

        Ja mistä päättelit, että kaikki nimet ovat muuttujassa? Toki, jos prittaat ne samassa kohdassa, ne tulevat näkyviin peräkkäin.
        Printtaa nimi $nimi = $parts[1]; rivin jälkeen echo $parts[1]."[br]"; komennolla ja jos nimet on vielä samalla rivillä, vika on jossain muualla kuin koodissasi. (korvaa [ merkit < merkeillä).


      • jumii
        juhakorkeapudas kirjoitti:

        Ja mistä päättelit, että kaikki nimet ovat muuttujassa? Toki, jos prittaat ne samassa kohdassa, ne tulevat näkyviin peräkkäin.
        Printtaa nimi $nimi = $parts[1]; rivin jälkeen echo $parts[1]."[br]"; komennolla ja jos nimet on vielä samalla rivillä, vika on jossain muualla kuin koodissasi. (korvaa [ merkit < merkeillä).

        Vika on epäilemättä koodissani, en vain saa päähäni, että miksi se toimii näin. Eräällä toisella sivulla käydään läpi samaa tiedostoa näin:
        $tarkistus = file("../lista.txt");
        for ($i = 0; $i < count($tarkistus); $i ) {
        $parts= explode('|', $tarkistus[$i]);
        $nimi = trim("$parts[1]");
        echo "
        $nimi";
        }

        Tuo toimii juuri kuten pitääkin, eli tulostaa listan:
        [li][a href="../k1/index.php"]käyttäjä1[/a][/li]
        [li][a href="../k2/index.php"]käyttäjä2[/a][/li]
        [li][a href="../k3/index.php"]kolmas[/a][/li]

        jne.

        Tästähän amatöörinä voisin kuvitella, että saan vertailun toimimaan laittamalla if-lausekkeen tuon echon tilalle näin:
        $tarkistus = file("../lista.txt");
        for ($i = 0; $i < count($tarkistus); $i ) {
        $parts= explode('|', $tarkistus[$i]);
        $nimi = trim("$parts[1]");
        if ($nimi == $uuser) { // uuser tulee lomakkeelta
        ... tässä sitten tehdään jotain
        }

        Tuo ei kuitenkaan toimi siten kuin luulin, vaan $nimi tulostaa seuraavaa:
        käyttäjä1
        käyttäjä2
        kolmas

        eli kaikki tunnukset ovat samassa jonossa omilla riveillään (ei tageja, kuten ei pitäisi ollakaan), Mikä menee väärin?


      • jumii
        jumii kirjoitti:

        Vika on epäilemättä koodissani, en vain saa päähäni, että miksi se toimii näin. Eräällä toisella sivulla käydään läpi samaa tiedostoa näin:
        $tarkistus = file("../lista.txt");
        for ($i = 0; $i < count($tarkistus); $i ) {
        $parts= explode('|', $tarkistus[$i]);
        $nimi = trim("$parts[1]");
        echo "
        $nimi";
        }

        Tuo toimii juuri kuten pitääkin, eli tulostaa listan:
        [li][a href="../k1/index.php"]käyttäjä1[/a][/li]
        [li][a href="../k2/index.php"]käyttäjä2[/a][/li]
        [li][a href="../k3/index.php"]kolmas[/a][/li]

        jne.

        Tästähän amatöörinä voisin kuvitella, että saan vertailun toimimaan laittamalla if-lausekkeen tuon echon tilalle näin:
        $tarkistus = file("../lista.txt");
        for ($i = 0; $i < count($tarkistus); $i ) {
        $parts= explode('|', $tarkistus[$i]);
        $nimi = trim("$parts[1]");
        if ($nimi == $uuser) { // uuser tulee lomakkeelta
        ... tässä sitten tehdään jotain
        }

        Tuo ei kuitenkaan toimi siten kuin luulin, vaan $nimi tulostaa seuraavaa:
        käyttäjä1
        käyttäjä2
        kolmas

        eli kaikki tunnukset ovat samassa jonossa omilla riveillään (ei tageja, kuten ei pitäisi ollakaan), Mikä menee väärin?

        Tietysti echo-rivillä lukee näin:
        [li][a href =\"../$parts[0]/index.php\"]$nimi[/a][/li]";
        En muistanut muokata tageja tälle foorumille kelpaavaan muotoon.


      • juhakorkeapudas
        jumii kirjoitti:

        Tietysti echo-rivillä lukee näin:
        [li][a href =\"../$parts[0]/index.php\"]$nimi[/a][/li]";
        En muistanut muokata tageja tälle foorumille kelpaavaan muotoon.

        No, suoritetaanko ehdossa oleva funktio silloin kun ehto on tosi?
        Mitä sen pitäisi tehdä?


      • jumii
        juhakorkeapudas kirjoitti:

        No, suoritetaanko ehdossa oleva funktio silloin kun ehto on tosi?
        Mitä sen pitäisi tehdä?

        En ole siis saanut vielä ehtoa todeksi. Jos saisin, niin suoritettaisiin seuraava:
        $lomakeotsikko = "[p class=\"error\"]Käyttäjätunnus [b]$uuser[/b] on jo varattu. Tunnuksia ei luotu. [/p]";

        Tarkoitus koko systeemillä on siis varmistaa, ettei samaa tunnusta voi tallentaa tiedostoon kuin kerran.


      • keksa1
        jumii kirjoitti:

        En ole siis saanut vielä ehtoa todeksi. Jos saisin, niin suoritettaisiin seuraava:
        $lomakeotsikko = "[p class=\"error\"]Käyttäjätunnus [b]$uuser[/b] on jo varattu. Tunnuksia ei luotu. [/p]";

        Tarkoitus koko systeemillä on siis varmistaa, ettei samaa tunnusta voi tallentaa tiedostoon kuin kerran.

        nämä siihen enen iffiä

        echo "|" . $nimi . "|";
        echo "|" . $uuser . "|";

        niin saat ulos mitä ne molemmat on ja ei sitten tartte arpoa miksi ei iffi toimi


      • jumii
        keksa1 kirjoitti:

        nämä siihen enen iffiä

        echo "|" . $nimi . "|";
        echo "|" . $uuser . "|";

        niin saat ulos mitä ne molemmat on ja ei sitten tartte arpoa miksi ei iffi toimi

        Laitoin nämä pätkät:
        trim($nimi);
        trim($uuser);
        echo "|".$nimi."|";
        echo "|".$uuser."|";

        Ulos tulee nyt seuraavaa:
        |käyttäjä1 ||käyttäjä1|
        |käyttäjä2 ||käyttäjä1|
        |kolmas ||käyttäjä1|

        Eli $nimi-muuttujan perässä ylimääräinen välilyönti, vaikka yritin poistaa sen trim-funktiolla.


      • pienestä se on kii
        jumii kirjoitti:

        Laitoin nämä pätkät:
        trim($nimi);
        trim($uuser);
        echo "|".$nimi."|";
        echo "|".$uuser."|";

        Ulos tulee nyt seuraavaa:
        |käyttäjä1 ||käyttäjä1|
        |käyttäjä2 ||käyttäjä1|
        |kolmas ||käyttäjä1|

        Eli $nimi-muuttujan perässä ylimääräinen välilyönti, vaikka yritin poistaa sen trim-funktiolla.

        Käytä funktion palautusarvoa tyyliin

        $nimi = trim ( $nimi );
        echo $nimi ;

        tai

        echo trim ( $nimi ) ;

        Jos teet vain erikseen trim($nimi) etkä käytä funktion palautusarvoa niin eihän se vaikuta mitään.


      • jumii
        pienestä se on kii kirjoitti:

        Käytä funktion palautusarvoa tyyliin

        $nimi = trim ( $nimi );
        echo $nimi ;

        tai

        echo trim ( $nimi ) ;

        Jos teet vain erikseen trim($nimi) etkä käytä funktion palautusarvoa niin eihän se vaikuta mitään.

        Aivan totta, tuostahan se olikin aika pitkälle kiinni. Olen käyttänyt samaa funktiota kyllä joskus aiemminkin ihan oikein, mutta eilen näköjään tuli ihmeellinen moka syntaksin kanssa. Nyt siis tuo ehto toimii kuten pitää, ja tämä ilta onkin mennyt yrittäessä (turhaan) saada kaikkia tuon jälkeisiä ehtoja toimimaan tarkoitetulla tavalla. Ehkä joudun palaamaan aiheeseen täällä :)

        Kiitos kaikille vastaamaan vaivautuneille vinkeistä.


    Ketjusta on poistettu 1 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Nuori lapualainen nainen tapettu Tampereella?

      Työ­matkalainen havahtui erikoiseen näkyyn hotellin käytävällä Tampereella – tämä kaikki epäillystä hotelli­surmasta tie
      Lapua
      84
      7333
    2. Orpo hiiri kadoksissa, Marin jo kommentoi

      Kuinka on valtiojohto hukassa, kun vihollinen Grönlantia valloittaa? Putinisti Purra myös hiljaa kuin kusi sukassa.
      Maailman menoa
      134
      6553
    3. Lopeta jo pelleily, tiedän kyllä mitä yrität mies

      Et tule siinä onnistumaan. Tiedät kyllä, että tämä on just sulle. Sä et tule multa samaan minkäänlaista responssia, kosk
      Ikävä
      381
      6343
    4. Tampereen "empatiatalu" - "Harvoin näkee mitään näin kajahtanutta"

      sanoo kokoomuslainen. Tampereen kaupunginvaltuuston maanantain kokouksessa käsiteltävä Tampereen uusi hyvinvointisuunni
      Maailman menoa
      364
      4152
    5. Lidl teki sen mistä puhuin jo vuosikymmen sitten

      Eli asiakkaat saavat nyt "skannata" ostoksensa keräilyvaiheessa omalla älypuhelimellaan, jolloin ei tarvitse mitään eril
      Maailman menoa
      153
      2522
    6. Ukraina, unohtui korona - Grönlanti, unohtu Ukraina

      Vinot silmät, unohtui Suomen valtiontalouden turmeleminen.
      Maailman menoa
      6
      2429
    7. Kumpi on sekaisempi - Koskenniemi vai Trump?

      Koskenniemi haukkui Trumppia A-studiossa, niin että räkä lensi suusta. Sen sijaan Trump puheessaan sanoi, että Grönlant
      Maailman menoa
      65
      2238
    8. Onko täällä helmessä tapahtunut vakava rikos?

      Onko kuullut kukaan mitään.
      Haapavesi
      14
      1542
    9. Orpo pihalla kuin lumiukko

      Onneksi pääministerimme ei ole ulkopolitiikassa päättäjiemme kärki. Hänellä on täysin lapsellisia luuloja Trumpin ja USA
      Kansallinen Kokoomus
      143
      1529
    10. Miten kauan sulla menisi

      Jos tulisit mun luo tänne nyt kahvinkeittoon?
      Ikävä
      198
      1250
    Aihe