Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: IP-osoitteita tietokantaan (PHP)

Triton [27.07.2008 15:34:40]

#

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...

Tumettaja [27.07.2008 17:48:22]

#

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

Wizard [27.07.2008 18:12:35]

#

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-

Triton [28.07.2008 12:06:27]

#

Selvennykseksi tuo koodi on palanen kirjautumisskriptiä, ja sen tarkoituksena on estää tietystä ip:stä kirjautuminen, jos antaa liian monta kertaa väärän salasanan...

Triton [29.07.2008 16:47:08]

#

Ratkaisin ongelman! Kiitos avusta!

Vastaus

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

Tietoa sivustosta