Tälläsen koodin olen värkänny, mutta ei meinaa toimia:
<?php $ip = $_SERVER['REMOTE_ADDR']; $search_ip = mysql_query("SELECT * FROM server_sign_security WHERE ip = ('$ip')"); //Suoritetaan ip-tarkistukset if (mysql_fetch_array($search_ip, MYSQL_ASSOC) == true) { if ($failed_sign < 3) { $failed_sign = $failed_sign + 1; mysql_query("UPDATE server_sign_security SET failed_sign = '{$failed_sign}' WHERE ip = '{$ip}' LIMIT 1"); } elseif ($failed_sign >= 3) { $block_time = mktime() + 120; mysql_query("UPDATE server_sign_security SET failed_sign = '0',time = '{$block_time}'"); } } elseif (mysql_fetch_array($search_ip, MYSQL_ASSOC) == false) { //Lisätään ip-tauluun ja annetaan $failed_signin arvoksi 1 mysql_query("INSERT INTO server_sign_security (ip,time,failed_sign) VALUES ('{$ip}','','1')"); }
Skriptin tarkoituksena on se, että jos ip-osoite on tallennettu jo kantaan suoritetaan ensimmäisen ehdon koodirivit ja jos ip:tä ei ole tallennettu suoritetaan alemman ehdon koodi rivit. Ongelma on kuitenkin se, että ylemmän ehdon koodirivejä ei suoriteta, vaikka ehto pitää paikkaansa, vaan se suorittaa alempaa ehtoa koko ajan eli se lisää samaa ip:tä koko ajan kantaan uudelleen ja uudelleen...
En ole täysin varma, mutta ainakin omasta mielestäni havaitsin muutaman virheen.
$search_ip = mysql_query("SELECT * FROM server_sign_security WHERE ip = ('$ip')");
=>
$search_ip = mysql_query("SELECT * FROM server_sign_security WHERE ip = '$ip'");
Tästä en ole niinkään varma, mutta eikö boolean arvoja vertaillessa pitäisi käyttää == sijasta === ? Eli:
mysql_fetch_array($search_ip, MYSQL_ASSOC) === true
insert into server_sign_security (ip,time,failed_sign) values VALUES ('{$ip}','','1') on duplicate key update failed_sign = if(failed_sign < 3,failed_sign + 1,0), time = if(failed_sign < 3,unix_timestamp + 120,'{$block_time}')
Edellyttää, että failed_sign on joko primary tai unique key.
Tuo on hieman hämärä toteutus kyllä muutenkin enkä päässyt siitä jyvällä. Joka tapauksessa koodi esimerkin mukaisesti jos tuota avaina (failed_sign) ei ole taulussa, se lisätään uutena. Muussa tapauksessa olemassa olevalle avainriville päivitetään uudet tiedot. Tuo SQL ei ole varmaan nyt ihan 100% oikein, mutta sinne päin kuitenkin ulkomuistista. Kuitenkin tuon pystyy hoitamaan yhdellä kyselyllä suoraan ja antaa tietokannan hoitaa arvuuttelut puolestasi.
-W-
Selvennykseksi tuo koodi on palanen kirjautumisskriptiä, ja sen tarkoituksena on estää tietystä ip:stä kirjautuminen, jos antaa liian monta kertaa väärän salasanan...
Ratkaisin ongelman! Kiitos avusta!
Aihe on jo aika vanha, joten et voi enää vastata siihen.