1.- Lo que usas esta bastante bien, pero entra en problemas cuando se usa un proxy.
Te hago un copy&paste de:
http://www.eslomas.com/index.php/archives/2005/04/26/obtencion-ip-real-php/ * REMOTE_ADDR: dirección ip del cliente
* HTTP_X_FORWARDED_FOR: si no está vacío indica que se ha utilizado un proxy. Al pasar por el proxy lo que hace éste es poner su dirección IP como REMOTE_ADDR y añadir la que estaba como REMOTE_ADDR al final de esta cabecera. En el caso de que la petición pase por varios proxys cada uno repite la operación, por lo que tendremos una lista de direcciones IP que partiendo del REMOTE_ADDR original irá indicando los proxys por los que ha pasado.
Y un trozo de código acorde al texto
<?php
$ip = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
echo 'La IP es: '.$ip; ?>
2.- Si, la función gethostbyaddr es la más indicada.
3.- La función que necesitas es strpos() o, si lo quieres case-sensitive, stripos().
Otro copy de php.net. Te lo pongo porque
has de fijarte en los comentarios, por la posición 0 y el valor false!
<?php
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);
// Note our use of ===. Simply == would not work as expected
// because the position of 'a' was the 0th (first) character.
if ($pos === false) {
echo "The string '$findme' was not found in the string '$mystring'";
} else {
echo "The string '$findme' was found in the string '$mystring'";
echo " and exists at position $pos";
}
// We can search for the character, ignoring anything before the offset
$newstring = 'abcdef abcdef';
$pos = strpos($newstring, 'a', 1); // $pos = 7, not 0
?>
Saludos!