Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Vertailu ei toimi

Sivun loppuun

novari [31.05.2010 10:32:20]

#

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?

tsuriga [31.05.2010 10:49:36]

#

"PekkaUUSIRIVI" eio sama ko "Pekka".

novari [31.05.2010 11:16:08]

#

Miten tuo oikeaoppisesti annetaan? Rivinvaihdon tarvisin tuohon välttämättä.

tsuriga [31.05.2010 11:19:38]

#

Voit vaikkapa antaa file-funkkarille toisena parametrinä FILE_IGNORE_NEW_LINES.

novari [31.05.2010 11:39:32]

#

Ei toimi. Nyt nimestä talletaan vain kaksi ensimmäistä kirjainta.

<?php
fwrite($tiedosto1, $nimi, FILE_IGNORE_NEW_LINES);
?>

tsuriga [31.05.2010 11:40:52]

#

https://www.php.net/file. Fopen+fwrite/fread+fclosen voit hyvillä mielin korvata file_put_contents- ja file_get_contents-funkkareilla.

novari [31.05.2010 12:15:08]

#

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

vehkis91 [31.05.2010 13:48:05]

#

EDIT: vähän muutettu koodia.

mikset vain vertaa silleen, että lisäät tuohon toiseen sen rivinvaihdon, tyyliin:

if ($nimet[$i] === ($nimi + "\n")){

Lebe80 [31.05.2010 14:01:16]

#

vehkis91: öh, ei noin... mieluummin sitten vaikka trimmaa ylimääräiset merkit _molemmista_.

novari [31.05.2010 14:24:43]

#

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.

Teuro [31.05.2010 16:24:08]

#

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.

Metabolix [31.05.2010 16:42:29]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta