Tomsk Sysadmins Forum
Unix => Программирование => Topic started by: lsk on May 16, 2006, 11:19:24
-
Час добрый всем!
сразу скажу, что php почти не знаю, поэтому и прошу помочь, очень срочно нужно
Задача:
есть HTML код в котором 2 checkbox'а, 2 формы под логин и пароль и кнопка!
так вот, необходимо, чтобы при нажатии на кнопку выполнить,чтобы он определил IP с которого заходит пользователь, положил в определенный файл логин и пароль и ip(причем положил, посмотрев, есть ли такой уже) и по выбранному checkbox'у (например, с именем 1) перезагружал скрипт определенный -система Linux Slackware.
Цель, ограничения внешки пользователям (сам человек, если сам себе не доверяет отключался)
Заранее благодарю!
P.S. может готовые решения есть, чтобы никого не напрягать...
-
Ну тут наверное надо сделать чтобы логин/пароль/ИП-адрес лежали не в файле каком-нибудь, а в базе данных (таблица из трех исходных пунктов, причем ИП-адрес сделать как примари кей).
-
Ну тут наверное надо сделать чтобы логин/пароль/ИП-адрес лежали не в файле каком-нибудь, а в базе данных (таблица из трех исходных пунктов, причем ИП-адрес сделать как примари кей).
если бы я знал такие тонкости, я к вам и обращаюсь за помощью поэтому!
как это примерно сделать, как создать таблицу, поля(пользователей.. соответствие IP адреса)?
я и прошу, мож готовые решения есть.. мож кто делал подобное? я самостоятельно навряд ли напишу..
-
если бы я знал такие тонкости, я к вам и обращаюсь за помощью поэтому!
как это примерно сделать, как создать таблицу, поля(пользователей.. соответствие IP адреса)?
я и прошу, мож готовые решения есть.. мож кто делал подобное? я самостоятельно навряд ли напишу..
lamaka правильно говорит. С файлами плохо то, что придётся думать как разделить попытки одновременного доступа к файлу из разных процессов. Поэтому БД в твоём варианте - самое лучшее.
А по поводу PHP либо сам пиши, либо проси кого-нибудь за тебя написать.
У меня есть подобная система, но навряд ли это в точности то, что тебе нужно.
-
Вот. Примерный код php скрипта, которому передаются твои данные:
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$name = $_POST["name"];
$pass = $_POST["pass"];
$checkbox = $_POST["box"];
$host = "localhost"; // MySQL server
$user_db = "root"; // MySQL пользователь
$pass_db = ""; // MySQL пароль
$dbase = "users"; // MySQL база данных
$dtable = "user"; // Таблица в базе данных
/* Соединение с сервером базы данных */
@ $db = mysql_pconnect ($host, $user_db, $pass_db);
if (!$db) {
echo "<b>Извините!</b>";
exit;
}
/* Выбор базы данных */
mysql_select_db($dbase);
mysql_query("SET NAMES koi8r");
$sql = "SELECT name, pass FROM users WHERE ip=$ip";
/* Исполнение SQL запроса */
$result = mysql_query($sql);
/* Проверка количества вернувшихся строчек в результате*/
$rows = mysql_num_rows($result);
/* Если нет результата или результат меньше 1, то предупредить нас об этом или вывести результат*/
if ((!$rows) || ($rows < 1))
{
echo "Извини.";
create($name, $pass);
}
else
{
while(list($ip, $name, $pass) = mysql_fetch_row($result))
{
if ($checkbox == 1) system('/usr/bin/script1.sh'); //
else system('/usr/bin/script2.sh');
}
}
?>
Скрипт выполняет следующее.
Получает методом Post данные от формы (не знаю, как checkbox правильно поставить, но думаю сам сможешь).
Коннектится к mysql базе $dbase.
Выполняет sql-запрос , в котором просит выдать базу только те записи, которые совпадают с ip-пользователя. Если такого нет, то передает управление функции, которая может либо создать новую запись в базе либо выйти.
Если записи есть, и выжат 1й чекбокс то выполняется script1.sh, другой - script2.sh.
Вот так. Скрипт очень простой, но если надо можем вместе его подогнать. Спрашивай.
Теперь надо создать базу и таблицу с тремя полями:
CREATE DATABASE `test` DEFAULT CHARACTER SET koi8r COLLATE koi8r_general_ci;
CREATE TABLE `user` (
`ip` TINYINT NOT NULL ,
`name` VARCHAR( 20 ) CHARACTER SET koi8r COLLATE koi8r_general_ci NOT NULL ,
`pass` VARCHAR( 20 ) CHARACTER SET koi8r COLLATE koi8r_general_ci NOT NULL
);
Кому чего не нравится, можете подправить.
Не проверял, но работать должно .
-
в любом случае, огроменное спасибо!!! база есть, если будет вопроси обязательно обращусь!
-
вот чего он выдает!
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /www/myform.php on line 41
Извините!
не могу понять, но в базе не хочет храниться IP, любой IP, который прописываешь в таблицу(поле IP) выдает при сохранении значение 127 и, соответственно при проверке скриптом "есть ли такой в базе", выдается ошибка описанная сверху и снизу...
и ещё вот это Fatal error: Call to undefined function: create() in /www/myform.php on line 46
да и как сделать, чтобы при условии, если есть в базе user с таким именем, паролем и IP, то IP этого пользователя дописывалось в файл(из базы) при положении checkbox 1 и щел перезапуск скрипта, а при положении checkbox2 удалялся этот Ip(если такой есть в файле) из того же файла и так же перезапуск скрипта.
Извиняюсь за назойливость и заранее благодарю!
-
вот чего он выдает!
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /www/myform.php on line 41
Извините!
не могу понять, но в базе не хочет храниться IP, любой IP, который прописываешь в таблицу(поле IP) выдает при сохранении значение 127 и, соответственно при проверке скриптом "есть ли такой в базе", выдается ошибка описанная сверху и снизу...
и ещё вот это Fatal error: Call to undefined function: create() in /www/myform.php on line 46
да и как сделать, чтобы при условии, если есть в базе user с таким именем, паролем и IP, то IP этого пользователя дописывалось в файл(из базы) при положении checkbox 1 и щел перезапуск скрипта, а при положении checkbox2 удалялся этот Ip(если такой есть в файле) из того же файла и так же перезапуск скрипта.
Извиняюсь за назойливость и заранее благодарю!
Для тех кто не любит читать документацию
http://dev.mysql.com/doc/refman/5.0/en/num...e-overview.html (http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html)
TINYINT -- A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255.
Вам же нужен для хранения IP адреса как минимум
INT -- A normal-size integer. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295.
Кроме того $_SERVER['REMOTE_ADDR'] хранит на самом деле строку вида (\d{1,3}\.){4}
которую еще нужно перевести в тип INT, например, так
http://ru.php.net/manual/ru/function.ip2long.php (http://ru.php.net/manual/ru/function.ip2long.php)
"p2long -- Converts a string containing an (IPv4) Internet Protocol dotted address into a proper address"
-
Вам же нужен для хранения IP адреса как минимум
INT -- A normal-size integer. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295.
Кроме того $_SERVER['REMOTE_ADDR'] хранит на самом деле строку вида (\d{1,3}\.){4}
которую еще нужно перевести в тип INT, например, так
http://ru.php.net/manual/ru/function.ip2long.php (http://ru.php.net/manual/ru/function.ip2long.php)
"p2long -- Converts a string containing an (IPv4) Internet Protocol dotted address into a proper address"
[/quote]
написал
$ip = $_SERVER['REMOTE_ADDR'];
$ip_long = ip2long($ip);
и в sql задал тип поля INT не работает в sql адресс полноценный храниться только в VARCHAR(15).. но все равно ничего не рпаботает...
выдает по-прежнему Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /www/myform.php on line 42
Извините!
Fatal error: Call to undefined function: create() in /www/myform.php on line 48
help
-
Ok.
Там, при создании таблицы ip, и правда ошибка небольшая закралась. Надо varchar(16), у меня самого ip в такую таблицу пишется. Меняется так:
ALTER TABLE `user` CHANGE `ip` `ip` VARCHAR( 16 ) DEFAULT '0' NOT NULL
Вот, если будет такой тип таблицы, то ипшник можно будет записывать в базу.
Такой вопрос. В mysql-консоли, что выдает запрос:
SELECT ip, name, pass FROM users;
Если выдает правильно, то скорее всего, проблемы в настройках скрипта.
Пароль, логин, хост в скрипте правильно заданы? Имя базы в скрипте менял? я в примере немного другое имя привел.
Функцию create() нужно закомментировать, я ведь ее для примера привел и не написал.
-
грубо говоря завелся, для этого я сделал:
1. Вместо $sql = "SELECT name, pass FROM users WHERE ip=$ip";
сдела запись в скрипте $sql = "SELECT ip, name, pass FROM user" ;
2. sql на запрос SELECT ip, name, pass FROM user; выдал; SQL-запрос:SELECT ip, name, pass
FROM user
LIMIT 0 , 30 и все...
3. поменял тип поля на varchar (16)
да, говорит echo что скрипт удачно отработан.., но не перезагружает скрипты, причем, чего бы ты в полях не писал
можно даже ничего не вводить в форму, он все равно скажет, что все отлично, без ошибок, но тем не менее-результат нулевой
да, и ещё, если делаю $sql = "SELECT name, pass FROM user WHERE ip" ; с этой строчкой выдает:Notice: Undefined offset: 2 in /www/myform.php on line 49
Notice: Undefined offset: 2 in /www/myform.php on line 49
и ещё вместо POST я использую $HTTP_GET_VARS потому как при методе POST выдается ошибка Notice: Undefined index: login in /www/myform.php on line 6
-
все, спасибо, я решил проблемы.. с выборкой пользователей были проблемы + опрос checkbox'а не работали условия..
теперь буду думать, как в файл грузить IP.
-
все, спасибо, я решил проблемы.. с выборкой пользователей были проблемы + опрос checkbox'а не работали условия..
как то особенно скрипт менял? или что сам не то делал?
теперь буду думать, как в файл грузить IP.
а зачем в файл? так мало информации, что легче писать в файл нежели в базу.
Просто интересно.
-
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$inet_on = $HTTP_GET_VARS["on"];
$name = $HTTP_GET_VARS["login"];
$pass = $HTTP_GET_VARS["pass"];
$host = "localhost";
$user_db = "******";
$pass_db = "******";
$dbase = "inet_access";
$dtable = "user";
@ $db = mysql_connect ($host, $user_db, $pass_db);
if (!$db) {
echo "<center><b>оЕ НПЗХ УПЕДЙОЙФШУС У УЕТЧЕТПН...</b>";
exit;
}
mysql_select_db($dbase);
$result = mysql_query("SET NAMES koi8r");
$sql = "SELECT ip, name, pass FROM user WHERE name='".$name."' AND pass='".$pass."'";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);
if ((!$rows) || ($rows < 1))
{
echo "<center><b>йЪЧЙОЙФЕ, ОП ЧБЫЙ ЧЧЕДЕООЩЕ ДБООЩЕ ОЕ УППФЧЕУФЧХАФ ДБООЩН Ч ВБЪЕ!";
# create($name, $pass);
}
else
{
while(list($ip, $name, $pass) = mysql_fetch_row($result))
{
if ($inet_on == "on") system('script1.php'); //
else system('script2.php');
}
echo "<hr><center><b><i>чБЫ IP = ";
echo $_SERVER['REMOTE_ADDR'];
echo "<br>ЙНС РПМШЪПЧБФЕМС ";
echo $name= $HTTP_GET_VARS["login"];
echo "<br><b>УЛТЙРФ ХУРЕЫОП ЧЩРПМОЙМ УЧПА ТБВПФХ!<b><hr>";
if ($inet_on == "on") echo "йОФЕТОЕФ ЧЛМАЮЕО";
else echo "йОФЕТОЕФ ЧЩЛМАЮЕО";
}
?>
вот код.
теперь необходимо, чтобы работали 2 условия либо удаления, либо записи IP в определенный файл, либо удаления, если такой существует. Грубо говоря, скрипт должен проверять при записи, есть ли такой уже существует IP, то выдавать echo, если нет-дописывать. И наоборот, при другом условии: "смотреть" есть ли такой IP если есть- удалять, если нет, то выдавать echo.