Hei!
Minulla on tarkoitus karsia ylimääräisiä merkkejä filenamesta.
$filename=preg_replace('/[^0-9a-zA-ZäöåÄÖÅ_]/', '_', $filename);
En tunne PHP kieltä kovinkaan syvästi, tämän kaltaisen esimerkin kuitenkin osasin rakentaa, onko se riittävä ja oikein rakennettu, vai onko vielä parempia vaihtoehtoja.
Kuinka tuo esim. selviää, jos ulkomaalaisesta keyboard layoutista kirjoittaa, esim. saksalaisella U ja S kirjaimilla ? Entä ovatko ääkköset muissa näppäimistöissä samalla koodilla mitä tässä minun palvelimessani nuo replacen ?
Mitä erikois kirjaimia !#¤%&/()=[] voi lisänä laittaa filenameen, käytössä Ubuntu 804 ja Ext3.
------
kpzpt kirjoitti:
En tunne PHP kieltä kovinkaan syvästi, tämän kaltaisen esimerkin kuitenkin osasin rakentaa, onko se riittävä ja oikein rakennettu, vai onko vielä parempia vaihtoehtoja.
Jos haluat vain poistaa merkkejä, et tarvitse välttämättä preg_replace:a, vaan str_replace tai strtr riittää.
kpzpt kirjoitti:
Mitä erikois kirjaimia !#¤%&/()=[] voi lisänä laittaa filenameen, käytössä Ubuntu 804 ja Ext3.
Wikipedian mukaan ext3 sallii kaikki muut kirjaimet tiedostonimissä paitsi NULL ja \ -merkin.
PHP String !
$output = preg_replace('/[^(\x20-\x5b\x5d-\xff)]*/','', $output);
Tälläisen laitoin, tuohan sitten poistaa 0 merkin ja myös x5c joka on ainakin minun koneessani tuo "\".
Kuinka tämä toimii jos eri näppäin layoutista syöttää kirjaimia, ja mitä kirjaimia tuossa x5d - xff joukossa on, jos nämä ovat hieman huonosti ajatellut arvot, niin, mitkä olisi oikeat arvot filename merkki karsintaan ?
Tuo str_replace, niin liekö sitten parempi poistaa kahdella koodi rivillä 0x0 ja 0x5c ?
------
kpzpt kirjoitti:
Tuo str_replace, niin liekö sitten parempi poistaa kahdella koodi rivillä 0x0 ja 0x5c ?
Str_replace:lla voi korvata useamman merkkijonon samamalla kerralla antamalla parametriksi taulukon.
Tiedostonimi saa ext3:ssa sisältää mitä tahansa merkkejä paitsi NUL-merkin ja /-merkin.
$nimi = str_replace(array("/", chr(0)), "_", $nimi);
Mitään muuta ei tarvitse poistaa.
Hmmh!
En ihan tarkkaan tunne chr tauluja, mutta eikös tab taikka enter ole aika outo tiedostonimessä ?
Olikos tab chr(20) ja enter chr(13) ?
Liekös näitä vielä lisääkin, on parempi poistaa kaikki ennen chr(32) eli välilyöntiä olevat !
Täytyy lisänä vielä vaan varmistaa nämä !"#¤% merkit, en tunne niitten sijaintia, mutta ymmärtääkseni ovat vasta kirjainten a-z jälkeen ?
------
Mutta miksi pitää ylipäätään poistella merkkejä? Eikö olisi järkevämpää niiden
käyttäjien luomisen yhteydessä kiinnittää juokseva id-numero käyttäjään ja sitten
sitä käyttää hakemistotiedostovirityksen tekoon?
id numero!
Kuinka rakennan ilman kahden samanaikaisen käyttäjän ongelmaa, tämän id numeron palveluun, minulla on siis juuri nyt php koodi valmistumassa, ja jos minulla on jokin kiinteä numero jossain php tiedostossa, niin, teoriittiset kaksi taikka useampi samanaikainen käyttäjä sotkee pakan ikävä kyllä ?
Minä koen että on parempi suoraan tallentaa tiedot käyttäjä tunnuksen mukaan, ellen sitten vielä hyppää siihen kovin kehuttuun databaseen.
Minulla on nyt se parjattu file tallennus, näille rekisteriin pyrkiville käyttäjätunnuksille.
------
kpzpt kirjoitti:
ja jos minulla on jokin kiinteä numero jossain php tiedostossa, niin, teoriittiset kaksi taikka useampi samanaikainen käyttäjä sotkee pakan ikävä kyllä ?
No sulla on oma kiinteä numero jokaiselle käyttäjätunnukselle, kahdella käyttäjällä ei pitäisi olla samaa numeroa. Mikä ongelma siinä siis muodostuu?
id numero !
Voisiko joku selittää hieman tarkemmin ?
Missä vaiheessa luon tämän kiinteän numeron asiakkaalle, ja tarkoitatteko te nyt esim. jotain 32 digit pitkää random lukua ? Sellainen olisi minusta helpommin ymmärrettävä !
Kuinka myös tiedon haku sitten tapahtuisi tälläisten id lukujen mukaan, minulla on siis php koodi, sehän alustetaan jokaiselle käyttäjälle sivuston latautuessa, minulla täytyisi olla jokin iso lataus jossa on kaikkien käyttäjien id luvut ?
Ei ihan vielä loksahtanut minulle ;)
-----
Sanoisin, että kun et kerran käytä tietokantaa, niin ihan hyvin voit unohtaa id-numeron, ja yksilöidä käyttäjät esim. käyttäjätunnuksella. Tosin ihan sama ongelmahan siinäkin on - kahdella käyttäjällä ei saa olla samaa käyttäjätunnusta.
Mietit tuossa aiemmin, että mitä tapahtuu jos kaksi käyttäjää luo tunnuksen samaan aikaan, niin niille tulee sama ID. Ongelmahan on ihan sama käyttäjätunnuksilla. Jos kaksi käyttäjää haluaa samaan aikaan saman käyttäjätunnuksen, niin mitä tapahtuu. Toki todennäköisyys tällaiselle on aika pieni.
Tiedon tallennusta!
Joo, olen itsekkin päätynä tuohon mitä sinä kuvailit, eli käyttäjätunnuksen mukaan tallennan pelaaja tiedot, ja siinä on siis tuo hetki jos kaksi luo samaan aikaan saman tunnuksen, niin, tietojen tallennuksen yhteydessä toinen asiakas menettää tunnuksensa, mutta, on siis teoreettinen ongelma ;)
Jos minulla olisi jokin juokseva luku josta otettaisiin asiakkaalle id numero, niin, päällekkyisyyksien mahdollisuus olisi huomattavan suuri !
------
Viestisi tuntuvat alkavan aina parilla sanalla joiden perässä on huutomerkki. Onko tälle jokin muukin syy kuin yleisen hämmennyksen aiheuttaminen? Jotenkin minua huvittaa ajatus, että joku tulisi minulle juttelemaan ja aloittaisi huudahtamalla "Tiedon tallennusta".
Otsikko !
Minä otsikoin näitä viestejä, meille foorum noobeilla on joillakin vähän outoja tapoja ;)
Luultavasti kai päädyn sitten myöhemmin samaan tapaan käyttää foorumeita mitä muutkin, kunhan tässä totun kirjoittamaan.
Minä aloitan myös kaveri keskustelut aika usein otsikolla, minä muistan paremmin mitä olen kirjoittanut taikka puhunut, kun käytän "otsikkoa", kertyy muistia keskittäviä lauseita, myöskin otsikon rakentaminen kehittää älykkyyttä, vaikka eivät nämä kaikki minun otsikot ihan onnistuneita taida olla.
------
kpzpt kirjoitti:
Jos minulla olisi jokin juokseva luku josta otettaisiin asiakkaalle id numero, niin, päällekkyisyyksien mahdollisuus olisi huomattavan suuri !
Ootkohan ymmärtänyt ID-numeron tarkoitusta. Kun rekisteröidään uusi asiakas, niin asiakkaalle luodaan ID-numero, jonka avulla asiakas tunnistetaan. Ensimmäisen asiakkaan ID voisi olla 1, toisen 2, kolmannen 3 jne. Missä vaiheessa tässä systeemissä syntyisi päällekkäisyyksiä? (Paitsi jos kaksi asiakasta luodaan täsmälleen samaan aikaan, mutta siihen Grez ottikin jo kantaa)
kpzpt kirjoitti:
Minä otsikoin näitä viestejä, meille foorum noobeilla on joillakin vähän outoja tapoja ;)
No, enemmän oikeastaan hämäsikin se huutomerkki. Otsikkoonkaan se ei kuulu, ellei kyseessä ole huuto / huudahdus.
Deffi kirjoitti:
Ootkohan ymmärtänyt ID-numeron tarkoitusta.
Täytyy sanoa, että minäkään en ymmärrä ID-numeron tarkoitusta. Eli mihin sitä tarvitaan? Miksi ID-numero olisi parempi tapa yksilöidä käyttäjä kuin käyttäjätunnus? Varsinkin kun se numerokin kuitenkin tallentuu tekstinä joka paikkaan (kun ei käytetä tietokantaa). Nähdäkseni järjestelmän ei ole yhtään sen helpompaa varmistaa että ID on uniikki kuin varmistaa että käyttäjän antama käyttäjätunnus on uniikki.
Sitten vielä jostain tiedostosta pitäisi lukea, että käyttäjän "a" id on 1 ja käyttäjän "b" on 2. Tietysti voisi käyttäjille antaa kirjautumisnimeksi sen id:n, mutta siinähän ei olisi mitään järkeä :)
Grez kirjoitti:
Täytyy sanoa, että minäkään en ymmärrä ID-numeron tarkoitusta. Eli mihin sitä tarvitaan? Miksi ID-numero olisi parempi tapa yksilöidä käyttäjä kuin käyttäjätunnus? Varsinkin kun se numerokin kuitenkin tallentuu tekstinä joka paikkaan (kun ei käytetä tietokantaa). Nähdäkseni järjestelmän ei ole yhtään sen helpompaa varmistaa että ID on uniikki kuin varmistaa että käyttäjän antama käyttäjätunnus on uniikki.
Hmm olet oikeassa että yleisesti ottaen ID vs tunnus käsittelyssä ei ole mitään
eroa. Mutta tässä nimenomaisessa phphakemistotiedostoviritelmässä voisi olla helpompaa pitää huoli että ID nimenomaan on uniikki.
Ehkäpä juoksevaa numeroa pidettäisiin yhdessä tiedostossa jota käytettäisiin niin ettei voi tulla kuin uniikkeja numeroita.
Tämä vs jonkin hakemistopuun skannaus sen tutkimiseksi löytyykö tunnus jo on paljon monimutkaisempaa. Mutta se lienee tämän koko projektin tarkoituskin :)
Id numero on myös siitä parempi, että missä ikinä käsitteletkään tätä käyttäjän identifoivaa tietoa, voit olla aina varma että se on luku, tai ajaa sen yksinkertaisesti esim. PHP:n tapauksessa intval()-funktion läpi. Se on turvallista tuon yksinkertasen operaation jälkeen laittaa about minne vaan.
Ja siis käyttäjää luodessa. Yleensä käyttäjät varmaan tallennetaan tiedostoon kerta tietokantaa ei käytetä. Tällön kun käyttäjää tallennetaan, tottakai tiedostoon tehdään lukitus, jolloin vaan yks käyttäjä voidaan tallentaa kerralla, ja veikkaisin, jos toisen vierailija aloittama PHP skripti yrittää tallentaa käyttäjää samaan aikaan, se varmaankin automaattisesti odottaa kunnes tiedoston lukitus on avautunut.
Pelaaja tietojen tallennusta !
Minulla on siis suoraan DB_PELAAJATIEDOT niminen kansio, jossa on sitten pelaajain tiedot.
Esim.
"DB_PELAAJATIEDOT/XXXX/MATTIMEIKALAINEN/
En joudu koskaan etsimään tietoa minkään toisen tiedon mukaan, kuten juokseva id numero olisi, en myöskään koskaan joudu lukitsemaan tiedostoja, koska jokaiselle käyttäjälle laitetaan oma uniikki kansio jossa omat tiedostot.
Lisäksi minulla on 500 kansiota joinnekka kaikki pelaaja tiedot jakautuvat, otan PHP ORD käskyllä käyttäjätunnuksen neljästä ensimmäisestä merkistä ASCII arvot jotka lasken yhteen jotka vielä sitten % 500.
Jotenka minulla on kansiot ->
"DB_PELAAJATIEDOT/0000-0500" tuo 0000-5000 on siis kaikki nuo 501 kansiota, ja näihin sitten pelaajan nimen mukaan suoraan ilman mitään etsimistä tallennan pelaaja infot.
Täytyy vaan nuo neljän ekan merkin ASCII arvot annetusta käyttäjätunnuksesta ensin laskea yhteen jotta PHP luovuttaa oikean kansion käyttöön.
En käytä mitään lukituksia koska sellainen on turhaa, enkä käytä mitään id lukua koska sellainen on turhaa, enkä joudu koskaan skannaamaan tietoa kun etsin käyttäjätietoja.
------
Muutathan nimen aina pieniksi kirjaimiksi ennen tallennusta/hakua? Useimmisssa palveluissa nimi ei ole case-sensitive. Ilman pieniä kirjaimia AAAA (=260) ja aaaa (=388) menisivät eri kansioihin ja tätähän ei haluta.
Oikeasti tarvitset vain 500 kansiota, koska:
0 % 500 = 0 1 % 500 = 1 ... 499 % 500 = 499 500 % 500 = 0
Pelaaja tiedoista!
Kyllä vain, minulla on itse asiassa uppercase, muunnus filenameissa, jotta sitten ei esim JaRi ja JAri taikka tuollaiset käyttäjänimet olisi kaikki erillaisissa kansioissa, myös jos koette että lowercase kirjaimet on parempia kuin upper niin laitan sitten niin.
Ja tuo 500 kansiota on vielä vähän arviolla, taitaa olla yksinkertaisempaa ja oikeampaa käyttää vaikka & 511 kuin % 500.
------
kpzpt kirjoitti:
Pelaaja tietojen tallennusta !
"DB_PELAAJATIEDOT/0000-0500" tuo 0000-5000 on siis kaikki nuo 501 kansiota, ja näihin sitten pelaajan nimen mukaan suoraan ilman mitään etsimistä tallennan pelaaja infot.
Täytyy vaan nuo neljän ekan merkin ASCII arvot annetusta käyttäjätunnuksesta ensin laskea yhteen jotta PHP luovuttaa oikean kansion käyttöön.
Nerokasta! Eli siis kun on pelaajia, joiden nimessä neljä ensimmäistä kirjainta
on samat niin ne tallentuvat miten?
Heh!
Ne esimerkki kansiot oli siinä vähän ylempänä ;)
------
Aihe on jo aika vanha, joten et voi enää vastata siihen.