Olen tekemässä kotisivuilleni jalkapallon veikkausohjelmaa jossa käyttäjät voivat tehdä oman arvauksensa mitalinsaajista.
Sain tehtyä ohjelmaa aika pitkälle kun yht'äkkiä tuli ongelmia. Kotisivuille on kirjauduttava omilla tunnuksilla joten otan käyttäjän nimen $nimi = $_SERVER["REMOTE_USER"];
ja talletan nimen nimet.txt tiedostoon jos sitä ei siellä aikaisemmin ole. Ongelma on kun vertailen loggautunutta nimeä talletettuun nimeen ja vaikka ne ovat samoja niin ohjelma väittää ettei
ne ole. Olen tutkinut muistiolla nimiä ja minusta ne on aivan samanlaisia. Olen ohjelmassa vertaillut merkkijonoja strnatcmp() kanssa mutta sekin väittää että ne on erilaisia.
Muistelin että ennen ongelmia tämä kirjoitusohjelma Crimson Editor 3.72 päivitti itsensä kun kirjoittelin tätä ohjelmaa, olisiko se tehnyt jotain joka aiheuttaa edellä mainitun ongelman.
Aikaisemmin tuo vertailu toimi ihan hienosti. En tiedä vaikuttavatko nämä asiaan mutta laitan ne mukaan. Encoding Type = ASCII. File Format = Dos Format.
Tässä ohjelmapätkä joka tuottaa ongelmia:
<?php $nimi = $_SERVER["REMOTE_USER"];// haetaan käyttäjän nimi if ($_POST["talletus"] != "") {// formeista poistuminen $nimet = file("nimet.txt");//haetaan nimet taulukkoon $maara = count($nimet);// katsotaan montako nimeä siellä on $polku = $nimi."/veikkaus.txt";// jokaisella käyttäjällä on oman niminen kansio johon talletetaan veikkaus $tiedosto = fopen($polku, "w");// avataan tiedosto $tiedosto1 = fopen("nimet.txt", "a";// avataan nimitiedosto $kulta = $_POST["kulta"];// form:sta saatu kultaveikkaus $hopea = $_POST["hopea"];//form:sta saatu hopeaveikkaus $pronssi = $_POST["pronssi"];//form:sta saatu pronssiveikkaus $rivi="$kulta\n$hopea\n$pronssi";// tehdään veikkausrivi fwrite($tiedosto, $rivi);// talletetaan veikkaus for ($i=0; $i<$maara; $i++){ if ($nimet[$i] == $nimi){ // tämä on se joka tuottaa ongelmia vaikka nimet on samoja ohjelma tulkitsee ne erilaisiksi ja $onko ei saa arvoa yksi $onko=1; } } if ($onko == 0){ fwrite($tiedosto1, "$nimi\n");// koska $onko on aina nolla niin joka kerta nimi talletetaan tähän tiedostoon } fclose($tiedosto);//suljetaan tiedosto fclose($tiedosto1);//suljetaan toinenkin tiedosto header("Location:" . "MM-kisat.php");// palataan takaisin exit(); } ?>
Tallennettaessa $nimi\n olen koettanut erilailla kuten $nimi."\n"; mutta siitä ei ole apua. Nimet tallentuu samoin veikkaus menee oikeaan tiedostoon mutta tulostaessa ei löydä tiedostoa
koska $veikkaus=file($nimi."/veikkaus.txt"); ei löydä tuon nimistä kansiota. Toistettakoon vielä että aikaisemmin tuo vertailu toimi.
Missä minulla menee homma pieleen?
"PekkaUUSIRIVI
" eio sama ko "Pekka".
Miten tuo oikeaoppisesti annetaan? Rivinvaihdon tarvisin tuohon välttämättä.
Voit vaikkapa antaa file
-funkkarille toisena parametrinä FILE_IGNORE_NEW_LINES
.
Ei toimi. Nyt nimestä talletaan vain kaksi ensimmäistä kirjainta.
<?php fwrite($tiedosto1, $nimi, FILE_IGNORE_NEW_LINES); ?>
https://www.php.net/file. Fopen+fwrite/fread+fclosen
voit hyvillä mielin korvata file_put_contents
- ja file_get_contents
-funkkareilla.
Jep nyt alkoi toimimaan, KIITOS! Iloitsin ennenaikaisesti.
Testaillessani huomasin että se tallentaa uuden nimen edellisen nimen päälle. Joten tiedostossa on vain viimeisin nimi. No täytyy etsiä siihen joku ratkaisu.
Vielä olisi yksi ongelma joka ei liity ohjelmointiin mutta kuitenkin kotisivuihin.
Firefox:lla kun testailen kokeilusivuja enkä anna tallentaa tunnuksia. Aikani testailessa firefox ei kysy enää tunnuksia vaan menee aikaisemmilla tunnuksilla sivuille enkä pääse testailemaan kaikilla tunnuksilla. Miten tuon voi estää?
EDIT: vähän muutettu koodia.
mikset vain vertaa silleen, että lisäät tuohon toiseen sen rivinvaihdon, tyyliin:
if ($nimet[$i] === ($nimi + "\n")){
vehkis91: öh, ei noin... mieluummin sitten vaikka trimmaa ylimääräiset merkit _molemmista_.
Sain toimimaan tälleen:
<?php for ($i=0; $i<$maara; $i++){ $kuka=$nimet[$i]; $kuka=str_replace("\n", "", $kuka); if ($kuka == $nimi){ $onko=1; } } if ($onko == 0){ fwrite($tiedosto1, $nimi."\n"); } ?>
Ei varmasti ihan validia mutta nyt oli tärkeintä saada toimimaan. Alkoi jo aivot savuamaan.
Tuota parempi olisi varmaankin trimmata kaikki muutkin merkit tuolta pois. PHP:ä on (yllättäen) valmis funktio tähän trim($muuttuja). Tällä kun käsittelet molemmat muuttujat, niin vertailussa on paremmissa kantimissa.
Teuro kirjoitti:
Tuota parempi olisi varmaankin trimmata kaikki muutkin merkit tuolta pois.
Tuollaiset ylimääräiset trimmaukset vain kertovat, että koodin kirjoittaja ei ole perillä oman skriptinsä toiminnasta. Jos tiedostoon on tarkoitus kirjoittaa joka riville yksi nimi ilman ylimääräisiä välejä, pitää myös voida muualla ohjelmassa luottaa siihen, että rivi todella sisältää yhden nimen ilman ylimääräisiä välejä, jolloin tsurigan ehdottama FILE_IGNORE_NEW_LINES on täsmälleen oikea ratkaisu.
Pelkän "\n"-merkinnän korvaamisen (tai lisäämisen, kuten vehkis ehdotti) huono puoli on, että Windowsin tekstieditorit tallentavat rivinvaihdoksi merkit "\r\n", jolloin sellaisella muokatun tiedoston kanssa koodi ei taaskaan toimi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.