lomaketiedon vertaaminen tekstitiedostoon

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...
11421
Äänestä

Muut lukivat myös

Vastaukset 11

Vanhimmat

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

Äänestä
  • 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.

    Äänestä

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

    Äänestä

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

    Äänestä

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

    Äänestä

  • 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ä?

    Äänestä

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

    Äänestä

  • 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

    Äänestä

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

    Äänestä

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

    Äänestä

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

    Äänestä

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

Kommentoi aloitusta


jumii kirjoitti:

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

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