Проверка свободности домена средствами PHP

Даниил

Mc. Shinoda
Проверка свободности домена средствами PHP

Добрый день, значит мне необходимо сделать проверку домена, занят или свободен он.

Вот форма запроса:
PHP:
<form action='index.php?act=whois' method='POST'>
<input type='text' class='domainval' name='domain'>
<input type='submit' value=' Go! ' class='go'>
</form>
Так вот первая проблема уже здесь, что после нажатия на кнопку submit, он переходит не по адресу: "index.php?act=whois&domain=domen.ru",
а по адресу: "index.php?domain=domen.ru";

А вот код скрипта whois.php
PHP:
<?
function callback($buffer)
{$notfound = array("No entries found","No match for","NOT FOUND");
$cut = array(
"[Querying whois.ripn.net]
[whois.ripn.net]
% By submitting a query to RIPN's Whois Service
% you agree to abide by the following terms of use:
% [url]http://www.ripn.net/about/servpol.html#3.2[/url] (in Russian)
% [url]http://www.ripn.net/about/en/servpol.html#3.2[/url] (in English).
",
"[Querying whois.internic.net]
[Redirected to whois.enom.com]
[Querying whois.enom.com]
[whois.enom.com]
");
$free = false;
for ($i=0;$i<count($notfound);$i++)
{if (substr_count($buffer, $notfound[$i]) > 0)
{$free = true;
}
}
if ($free == true)
{return("Домен ".$_GET['domain']." свободен!");
}
else
{for ($i=0;$i<count($cut);$i++)
{$clean_result = @str_replace($cut[$i],"",$buffer);
}
return($clean_result);
}
}

ob_start("callback");

system("whois ".htmlspecialchars($_GET['domain']));

ob_end_flush();

?>
Так вот, этот код не работает если даже вызываю через whois.php?domain=domen.ru, а когда залил на хостинг, он заматерился и сказал, что примерно, что system() отключён из за безопастности...

Подскажите пожалуйста как решить проблемы? :(
 

3D

Новичок
...Так вот первая проблема уже здесь, что после нажатия на кнопку submit, он переходит не по адресу: "index.php?act=whois&domain=domen.ru",
а по адресу: "index.php?domain=domen.ru";

Как-то странно работает у Вас броузер.
URL на который Вас должно перекинуть: index.php?act=whois
 

zarus

Хитрожопый макак
1. <form action='index.php?act=whois' method='POST'>
2. $_GET['domain']

-~{}~ 19.01.06 12:46:

Автор оригинала: Даниил
а когда залил на хостинг, он заматерился и сказал, что примерно, что system() отключён из за безопастности...

Подскажите пожалуйста как решить проблемы? :(
Позвонить хостеру и спросить...
 

Даниил

Mc. Shinoda
Позвонить хостеру и спросить...
Они сказали, что не включат т.к. это представляет для них опастность.

1. <form action='index.php?act=whois' method='POST'>
2. $_GET['domain']
На самом деле в форме тоже стояла GET, я ошибся при печате сюда кода формы, там и там GET, простите за опечатку.

P.S. А есть ли другие варианты проверить домен не используя всяких system()?
 

kruglov

Новичок
[m]fsockopen[/m] или [m]curl[/m]

только смотрите, как бы вас там не забанили, предусмотрите ограничение частоты запросов.
 

Даниил

Mc. Shinoda
Хм. насколько помню превышение не должно быть более чем 5 сек.
А случайно нету скрипта который работает на fsockopen и curl, а то я не умею с ними работать.

У меня есть такой код:
PHP:
<?
If (!empty($_POST)) {
$host=$_POST['domain'];

if (@$sock = fsockopen ( $host, 80, $errno, $errstr, 0.2)) {
echo "<font color='red'>Домен уже занят!</font><br>
<a href='javascript:history.back();' style='color:black; text-decoration: underline'>Назад</a>"; 
fclose ($sock);
} 
else echo "<font color='green'>Поздравляем, домен свободен!</font><br>
<a href='index.php?act=order' style='color:black; text-decoration: underline'>Зарегистрировать домен!</a>";
}
?>
Но работает не корректно, или вообще не работает.

-~{}~ 19.01.06 13:55:

Всё разобрался. :)

PHP:
<?

$host = htmlspecialchars($_POST['domain']);

if (@$fp = fsockopen($host, 80, $errno, $errstr, 30)) { 
echo "<font color='red'><b>К сожалению домен $host уже занят.</b></font><br> 
<a href='javascript:history.back();' style='color:black; text-decoration: 

underline'>Назад</a>";  
fclose ($fp); 
}  
else { echo "<font color='green'><b>Поздравляем, домен $host свободен!</b></font><br />
Вы можете зарегистрировать его прямо сейчас.<br />
<a href='index.php?act=domainreg' style='color:black'>Регистрация</a>.";
} 

?>
Так всё работает!
 

bkonst

.. хочется странного?...
То, что ты написал выше работать не будет - часто на свободных доменах висят объявления хостеров / торговцев доменными именами, так что в результате они будут казаться занятыми. И наоборот - никто не гарантирует, что даже на занятом домене кто-то будет отвечать на 80м порту.

Единственный способ, дающий более-менее точные результаты - обращение к whois-серверам.
 

Даниил

Mc. Shinoda
Так а как мне через nic.ru получить определённый результат и вывести себе на страницу, что если занят то показать информацию о владельце, а если свободен то так и отобразить?
 

kruglov

Новичок
Даниил
ман по fsockopen читайте

-~{}~ 19.01.06 14:28:

p.s. А вообще - что за сайт такой? Обычно кнопку "вы можете зарегистрировать домен" вешают у себя хостеры, а вы явно не хостер, раз system не можете использовать... Киберсквоттинг какой-то...
 

Даниил

Mc. Shinoda
ман по fsockopen читайте
Читали, вот по нему и написан выше код.

p.s. А вообще - что за сайт такой? Обычно кнопку "вы можете зарегистрировать домен" вешают у себя хостеры, а вы явно не хостер, раз system не можете использовать... Киберсквоттинг какой-то...
Вот такой вот сайт, а я не хостер, это ты верно подметил, но это не решает проблему. =(
 

kruglov

Новичок
ну йолки, первый же пример по fsockopen описывает, как слать http-запрос на сервер и получать ответ.
 

Даниил

Mc. Shinoda
Пример:

PHP:
<?php
$fp = fsockopen("www.yandex.ru", 80, $errno, $errstr, 30);
if (!$fp) {
   echo "$errstr ($errno)<br />\n";
} else {
   $out = "GET / HTTP/1.1\r\n";
   $out .= "Host: www.example.com\r\n";
   $out .= "Connection: Close\r\n\r\n";

   fwrite($fp, $out);
   while (!feof($fp)) {
       echo fgets($fp, 128);
   }
   fclose($fp);
}
?>
Узнаёт данные о документе и выводит его содержимое, а мне спасибо целый сайт инклудить не охото.
 

bkonst

.. хочется странного?...
Вырежи нужную часть. См. регулярные выражения
 

Аntоn

Новичок
Re: Проверка свободности домена средствами PHP

PHP:
function check($domainname, $ext)
{
	if(($ns = fsockopen("whois.ripn.net",43)) == false)
	{
		return -1;
	}
	else
	{
		fputs($ns,"$domainname.$ext\n");
		while(!feof($ns))
		{
			$rawoutput = $rawoutput.fgets($ns,128);
		}
		fclose($ns);
		if(ereg("no entries found",$rawoutput))
		{
			return 1;
		}
		else
		{
			return 0;
		}
	}
}
Насчет того, что надо искать именно "no entries found" не уверен, но это всегда можно посмотреть.
 
Сверху