FallenSoul
|
|
« : 16-08-2007 19:11 » |
|
Добрый день. Прочитал руководства по установке апач+пхп+Mysql, учебник по пхп- всё очень хорошо написано и главное работает. Но вот что я не нашел в учебнике. Каким образом реализуется механизм изменения содержимого .пхп страницы ? Вот index.php на котором 2 формы для входа в систему. Как в этом отрывке if(strcmp($login,$row->login)==0 && strcmp($pass,$row->passw)==0) { } реализовать "очистку страницы" и вывода на абсолютно чистой новой странице с тем же адресом в URL /index.php сообщение вида "Добро пожаловать.", но чтобы ни форм ничего другого там не было а только текст. Весьма благодарен. <html> <head> <title> Игра </title> </head>
<body> <font face="Verdana" size=1> <br><hr size=3 color=red> <form action=/index.php method="get"> <br><b> Login : </b> <br><input type="text" name="login" value="" emptyok="true"> <br><b> Password :</b> <br><input type="text" name="password" value="" emptyok="true"> <br><br><input type="submit" value="Войти"> </form> <a href=/registration.php > Регистрация </a> </font>
<?
include "config.php";
$login=$HTTP_GET_VARS['login']; $pass=$HTTP_GET_VARS['password']; $play=mysql_query("select * from player;"); if($play) { while($row=mysql_fetch_object($play)) { if(strcmp($login,$row->login)==0 && strcmp($pass,$row->passw)==0) { // } } } ?> </body> </html>
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #1 : 16-08-2007 20:07 » |
|
1. $HTTP_GET_VARS['login'] Это давно устаревшая форма получения данных запроса. Следует пользоваться массивом $_GET. Точно также с POST запросом - $_POST. 2. Проверка логин/пароля. Перебор всех строк - крайне негуманный и неудобный метод. Укажи проверяемое в запросе. <?php $query = " SELECT * FROM player WHERE login = '" . mysql_escape_string($login) . "' AND passw = '" . mysql_escape_string($pass) . "'"; $res = mysql_query($query); if (mysql_num_rows($res) == 0) { // not logged in } else { // now logged } mysql_free_result($res); ?> 3. Изменение состава выводимой страницы. Можно использовать множество способов. Например, самый простой, но и самый неудобный из-за смешивания php-кода и html и плохой читаемости. <?php if ($condition) { ?> ...одни данные... <?php } else { ?> ...другие данные... <?php } ?>
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
FallenSoul
|
|
« Ответ #2 : 16-08-2007 20:14 » |
|
По поводу первых 2х пунктов я понял, а что касается третьего:
Допустим у нас 3 страницы- Главная с формами для заполнения, промежуток с приветствием "Добро пожаловать " такой то юзер, содержимое отображающееся только для авторизированного юзера. Какое взять условие для этих 3х случаев?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #3 : 16-08-2007 20:46 » |
|
Если попроще, то так: <?php switch($condition) { case 0: include('file0.html'); break; case 1: include('file1.html'); break; case 2: include('file2.html'); break; default: include('file_default.html'); break; } ?>
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
FallenSoul
|
|
« Ответ #4 : 17-08-2007 06:45 » |
|
Еще один вопрос ... Как передавать допустим со страницы "Добро пожаловать" на следующую на которую переход будет по ссылке допустим переменную чтобы проверять какого её значение, в подтверждение того что пользователь попал в авторизованную зону введя логин и пароль предварительно. ?
|
|
« Последнее редактирование: 17-08-2007 07:01 от FallenSoul »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #5 : 17-08-2007 07:27 » |
|
например так: h**p://myexample.com/index.php?object=myobject
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
FallenSoul
|
|
« Ответ #6 : 17-08-2007 07:46 » |
|
Не совсем понял. Точнее понял, но не до конца. Вот у меня после проверки на первой странице правильности ввода логина/пароля отображается следующее Добро пожаловать. <a href=/main.php?enter=$enter> Вход </a> Выше я переменной $enter задавал значение если она в положительной ветке условного оператора который проверяет правильность ввода логина/пароля. А на следующей странице адресс у меня выглядит как main.php?enter=$enter,но проверку if($enter==0) { ?>
<font face=Verdana size=1> Зайдите заного с Главной страницы </font>
<? } else if($enter==1) { ?> // <? } Не проходит.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #7 : 17-08-2007 08:04 » |
|
FallenSoul, тебя спасет использование сессий. См. в мануале session_start() и все, что написано рядом. Загляни в наши статьи - год назад я писал по этому делу.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
FallenSoul
|
|
« Ответ #8 : 17-08-2007 11:50 » |
|
<?
$today = date("m.d.y H:i:s");
if(!empty($name) && !empty($pass) && !empty($nick)) { if($born==1 || $born==2) { $play=" select * from player where login = '" . mysql_escape_string($name) . "' ";
$sql=mysql_query($play);
if($x==0 && mysql_num_rows($sql) > 0) echo "Такой логин уже существует"; else if($x==0 && mysql_num_rows($sql) == 0) { mysql_query("insert into player values (NULL,'$name','$pass','$nick','$sex','$born',NULL,'$today') "); echo "Вы зарегистрированы и можете войти в игру.";
} } }
?> Сессии потихоньку осваиваю-а вот отрывок из регистрации которую переписал в том стиле в котором мне написали авторизацию. Здесь есть какие то неточности или что-то лишнее ?
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #9 : 17-08-2007 21:04 » |
|
Вопрос по поводу php и MySql. При регистрации мне приходится выполнять след. запрос : mysql_query("insert into player values (NULL,'$name','$pass','$nick','$sex','$born','0','0','3','3','3','$today') ");
хотя предпоследние 5 параметров 0,0,...,3 у меня в таблице равны соответствующим числам по default'у,но не указывая их или оставляя пустым содержимое ковычек, добавлять новую запись в таблицу не хочет. 3 вопроса. 1. Можно ли как-то опустить наличие этих ковычек в запросе ? 2. Как действует дефолт значения у столбца если при создании записи всё равно надо указывать значение этого столбца? 3. MySql дружит с кирилицей? Дело в том что если разрешить создавать записи,в которых будет присутствовать кирилица,- то выводя их на страницах пхп проблем никаких нет, однако если просматривать содержащиеся в таблице соответствующие записи,то вся кирилица превращается в абру кадабру.
|
|
« Последнее редактирование: 17-08-2007 21:11 от FallenSoul »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #10 : 18-08-2007 07:22 » |
|
FallenSoul, связывать интерактивные страницы можно по разному. Типичный подход: сохранение параметров в сессии. При старте страницы запускаешь сессию - данные (если это не первый заход этой сессии) подкачиваются автоматом в массив $_SESSION. При завершении страницы массив также автоматически сохраняется. Подробно здесь: https://club.shelek.ru/view.php?id=28 : прочти "Сессии PHP. Часть 1." - этого достаточно для понимания сессий. В статье "Создание динамического веб-сайта, с использованием ПХП(часть первая)" рассматривается пример, подобный приведенному мною выше. Вопрос по поводу php и MySql. При регистрации мне приходится выполнять след. запрос : mysql_query("insert into player values (NULL,'$name','$pass','$nick','$sex','$born','0','0','3','3','3','$today') "); хотя предпоследние 5 параметров 0,0,...,3 у меня в таблице равны соответствующим числам по default'у,но не указывая их или оставляя пустым содержимое ковычек, добавлять новую запись в таблицу не хочет. 3 вопроса. 1. Можно ли как-то опустить наличие этих ковычек в запросе ? 2. Как действует дефолт значения у столбца если при создании записи всё равно надо указывать значение этого столбца? 3. MySql дружит с кирилицей? Дело в том что если разрешить создавать записи,в которых будет присутствовать кирилица,- то выводя их на страницах пхп проблем никаких нет, однако если просматривать содержащиеся в таблице соответствующие записи,то вся кирилица превращается в абру кадабру. 1. Можно. Кроме того, крайне небезопасно делать так, как в твоем примере - выше я уже указывал, что нужно делать со строками перед помещением их в SQL-запрос: обрабатывать ф-ией mysql_escape_string(). Почитай в инете о "SQL-Injection" - полезно знать. 2. Вообще, это вопрос не по web - см. его в мануале по MySQL. Для вставки неполной строки нужно указать список столбцов. INSERT INTO TABLE (col1, col7, col8, col9) VALUES (1, 7, 8, 9) 3. Это проблема не MySQL, а утилиты, которой ты пользуешься. Если, к примеру, у тебя винда и ты хранишь в базе текст в кодировке windows-1251, при просмотре его через консольную утилиту получишь мусор, т.к. виндовая консоль работает с кодировкой cp866 (дебильное наследие прошлого). Для удобства администрирования поставь PHPMyAdmin - web-инструмент для администрирования MySQL.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
FallenSoul
|
|
« Ответ #11 : 18-08-2007 08:28 » |
|
Каждый день узнаю всё больше и больше нового для себя, и спс тебе за это =) Поставил пхпадмин, изменил код занесения учетной записи в таблицу при регистрации на следующий : $query="insert into player values (NULL, '".mysql_escape_string($name)."', '".mysql_escape_string($pass)."', '".mysql_escape_string($nick)."', '$sex','$born','0','0','3','3','3', '".mysql_escape_string($today)."' );"; $res=mysql_query($query); if($res) echo "Вы зарегистрированы и можете войти "; Всё довольно удобно,но только ради интереса подскажи- почему и пхп админ показывает мне в столбце nick который при регистрации я ввожу русскими буквами абра кадабру? id_player login passw nick sex born gold level str dex stam regdate 28 test test ìàêñ 1 1 0 0 3 3 3 08.18.07 12:22:12 Перед тем как занести, все текстовые переменные обрабатываю след. образом : $nick=$_POST["nick"]; $nick = substr($_POST["nick"],0,32); $nick = htmlspecialchars(stripslashes($nick));
|
|
« Последнее редактирование: 18-08-2007 08:32 от FallenSoul »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #12 : 18-08-2007 09:49 » |
|
'$sex','$born' Ты уверен, что тут именно числа? Если эти данные получены от клиента, то надо обязательно их проверить перед вставкой. Для чисел можно сделать так: $born = 0 + $born; Это автоматом конвертит строку в число и если она не является числом, то преобразуется в ноль. Запомни важную вещь: все данные, полученные от клиента, потенциально опасные. Их нужно проверять и по возможности не использовать напрямую. Напр., параметер sex. Это перечисляемый тип с конечным кол-вом значений и лучше передавать его в виде числа. <?php // предполагаем, что sex имеет три значения: 0 - unknown, 1 - man, 2 - woman
$sex = isset($_POST['sex']) ? $_POST['sex'] : 0; // передан ли вообще параметер
if ($sex < 0 || $sex > 2) $sex = 0; ?> $nick = htmlspecialchars(stripslashes($nick)); По моему это излишество. htmlspecialchars() лучше использовать при выводе, а не вводе. stripslashes() вообще не нужен, если у тебя в php не активирована фича magic quotes (тоже излишество). Уникальные столбцы (напр. nick) полезно проверять до вставки или обработать ошибку вставки. Кракозябры: не настроена кодировка PHPMyAdmin-а. Быстрее всего он у тебя объявил страницу как iso8859-1, а тебе нужно windows-1251. Посмотри в его настройках (в конфиге). Проверить можно легко: загрузив страницу поменяй кодировку в браузере.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
FallenSoul
|
|
« Ответ #13 : 18-08-2007 10:05 » |
|
по поводу $sex и $born я специально сделал их числами и затем в самом коде в отличие от того какое значение принимают эти переменные происходит вывод. if($sex==1) (string)$sex="Мужской"; else if($sex==2) (string)$sex="Женский";
echo "<b>Пол : </b>" .$sex. "<br>";
htmlspecialchars() , stripslashes() -это всё старался делать по учебнику чтобы защититься от всяких недоброжелателей уберу если лишнее. Нашел следующие настройки- стояло и вправду iso8859-1, но заменив на windows-1251 ничего не изменилось =-\ Менял кодировку-толку 0. $cfg['DefaultLang'] = 'windows-1251'; $cfg['Lang'] = 'windows-1251'; $cfg['DefaultCharset'] = 'windows-1251'; 3 А что можно придумать с взаимодействием 2х таблиц о кот. я выше попробовал изложить?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #14 : 18-08-2007 12:16 » |
|
htmlspecialchars() , stripslashes() -это всё старался делать по учебнику чтобы защититься от всяких недоброжелателей уберу если лишнее. Делать надо зная, что и зачем делается. Не торопись делать умные страницы - просто поэкспериментируй в ф-иями и посмотри, какая что делает. Рекомендую смотреть html-код генерируемой страницы - брузер может делать поблажки, но это не значит, что так можно делать. $cfg['DefaultLang'] = 'windows-1251'; $cfg['Lang'] = 'windows-1251'; $cfg['DefaultCharset'] = 'windows-1251';
Lang - это язык (language), а не кодировка. Оставь "en" или задай "ru" (если конечно есть его поддержка). Посмотри свойства страницы в браузере - какая там кодировка. 3 А что можно придумать с взаимодействием 2х таблиц о кот. я выше попробовал изложить?
В теме нет "2-х таблиц". О чем речь?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|