Aloittelen tekemään ensimmäisiä PHP-skriptejäni, ja meinasin kokeilla jonkinmoista yksinkertaista vieraskirjaa / shoutboxia esimerkiksi Ohjelmointiputkan oppaan avulla.
Nyt haluaisin tietää, miten esimerkiksi vieraskirjaan kirjoittajan IP-osoitteen saisi tallennettua muiden vieraskirjatietojen mukana tiedostoon data.txt.
Ja kun nyt pääsin tässä alkuun, niin kysyttäköön vielä, että kuinka IP-bannaamisen voisi toteuttaa vieraskirjassa. Minulla ei ole hajuakaan :|
Eli IP löytyy superglobaalista muuttujasta $_SERVER['REMOTE_ADDR']
IP-ban ei ole kovinkaan kummoinen toimenpide, jos toteat että viestin lähettäjä kaipaa bannin, lisäät sen esim. ban.txt omalle riville ja loppuun vaikkapa | erottimeksi. Koodiin taas heität ennen kirjoitusta:
<?php // Bannatut IP:t $banlist = file("ban.txt"); // Asetetaan flag falseksi eli oletuksena ketään käyttäjää ei bannata $flag = false; // Jyrätään lista läpi foreach ($banlist as $banip) { // Järäytetään $ipban = explode("|", $banip); // Tarkastetaan if ($ipban[0] == $_SERVER['REMOTE_ADDR'] { // Bannataan $flag = true; } } // jos ei ole bannattu if ($flag == false) { // Tähän tulee kirjoituskoodi } ?>
Koodissa on virhe...
lainaus:
// Tarkastetaan if ($ipban[0] == $_SERVER['REMOTE_ADDR'] {
If-lausekkeesta puuttuu sulku, eli tuon kuuluisi olla näin:
// Tarkastetaan if ($ipban[0] == $_SERVER['REMOTE_ADDR']) {
ei noita kannata erotella millään "|" erottimilla ellei sinne ängetä muuta tietoo mukaan, parempi tapa olisi katsoa riveittäin se tieto ja käyttää trim() funktiota
trim on kieltämättä käytännöllinen, ei vaan tajua windows-rivinvaihdon päälle. Itelläni oli koodihässäkkä, ja vasta kun olin aluksi trimmannut ja tämän jälkeen str_replacella poistanut \r alkoi pelittämään. Siksi suosittelen lopetusmerkkiä (vrt. tehokkuutta: yksi merkki ja yksi funktio vs. kaksi funktiota).
lainaus:
(vrt. tehokkuutta: yksi merkki ja yksi funktio vs. kaksi funktiota).
mitäs nyt oikein selität? file() explode() oli ne sun funktiot? ja ne mun oli file() trim() eli 2 funktiota molemmissa hommissa, täh?
eli: trim poistaa merkkijonosta \n (linefeed). Kuitenkin esim. omat php-skriptini, kaikki windows-editorit sekä mac-editorit lisää rivinvaihtoon \r (return carriage) jota trim ei poista. Tämän vuoksi joutuu käyttämään str_replacea jotta \r poistuu. Tästä tulee vertailutilanne, jossa omassa esimerkissäni käytetään |-merkkiä ja explodea, sinun vaihtoehdossa taas trim- ja str_replace-funktiota. Molempien esimerkki tarvitsee luonnollisesti file-funktion toimiakseen.
hmm?
en oo kyl tommoseen ongelmaan törmänny, kyllä se trim() poistaa kaikki tyhjät tilat tietääkseni
itse käytän explodena joskus \r\n kun testailen jotai juttuu, niin kyllä se sen explodaa oikein ja poistaa myös tyhjät rivinvaihdot
Hmm, mielenkiintoista. Manuaalinkin mukaan pitäisi lähteä myös carriage return. Joko olen sössinyt jotain pahasti, tai käyttänyt huomaamattani ltrim-funktiota. Pitääkin alkaa testailemaan.
EDIT: Eli selvitin pikaisesti että oma virheeni on ollut käyttää pelkästään trimmiä. Alla oikea ja väärä esimerkki:
noin sitä pitää! *hurraa*
PS: aika noobimainen virhe ;)
lainaus:
PS: aika noobimainen virhe ;)
Erittäin. En kuitenkaan painu maan sisälle murehtimaan. Ainakaan ilman kunnon kasaa pakastepizzoja :-)
Olisko mahdollista selvittää käyttäjän ip proxyn läpi?
Olen jossain kuullut että olisi mutta miten tuon voisi toteuttaa?
Onhan tuo. Et tarvitse kuin oikeudet proxyn logiin, jolloin pystyt helposti löytämään oikean ip:n :-)
Näitä oikeuksia ei taida sitten saada ihan tavallinen pulliainen :) ?
Aihe on jo aika vanha, joten et voi enää vastata siihen.