Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение содержимого страницы через php  (Прочитано 24359 раз)
0 Пользователей и 1 Гость смотрят эту тему.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« : 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 Offline
Пол: Мужской

WWW
« Ответ #1 : 16-08-2007 20:07 » 

1. $HTTP_GET_VARS['login']
Это давно устаревшая форма получения данных запроса. Следует пользоваться массивом $_GET. Точно также с POST запросом - $_POST.

2. Проверка логин/пароля.
Перебор всех строк - крайне негуманный и неудобный метод. Укажи проверяемое в запросе.
Код: (PHP)
<?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 и плохой читаемости.
Код: (HTML)
<?php
if ($condition)
{
?>
...одни данные...
<?php
}
else
{
?>
...другие данные...
<?php
}
?>
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 16-08-2007 20:14 » 

По поводу первых 2х пунктов я понял, а что касается третьего:

Допустим у нас 3 страницы- Главная с формами для заполнения, промежуток с приветствием "Добро пожаловать " такой то юзер, содержимое отображающееся только для авторизированного юзера. Какое взять условие для этих 3х случаев?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 16-08-2007 20:46 » 

Если попроще, то так:

Код: (PHP)
<?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
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 17-08-2007 06:45 » 

Еще один вопрос ... Как передавать допустим со страницы "Добро пожаловать" на следующую на которую переход будет по ссылке допустим переменную чтобы проверять какого её значение, в подтверждение того что пользователь попал в авторизованную зону введя логин и пароль предварительно. ?
« Последнее редактирование: 17-08-2007 07:01 от FallenSoul » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 17-08-2007 07:27 » 

например так:
h**p://myexample.com/index.php?object=myobject
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #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 Offline
Пол: Мужской

WWW
« Ответ #7 : 17-08-2007 08:04 » 

FallenSoul, тебя спасет использование сессий. См. в мануале session_start() и все, что написано рядом. Загляни в наши статьи - год назад я писал по этому делу.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #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
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #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 Offline
Пол: Мужской

WWW
« Ответ #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. Для вставки неполной строки нужно указать список столбцов.
Код: (SQL)
INSERT INTO TABLE (col1, col7, col8, col9) VALUES (1, 7, 8, 9)

3. Это проблема не MySQL, а утилиты, которой ты пользуешься. Если, к примеру, у тебя винда и ты хранишь в базе текст в кодировке windows-1251, при просмотре его через консольную утилиту получишь мусор, т.к. виндовая консоль работает с кодировкой cp866 (дебильное наследие прошлого). Для удобства администрирования поставь PHPMyAdmin - web-инструмент для администрирования MySQL.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #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 Offline
Пол: Мужской

WWW
« Ответ #12 : 18-08-2007 09:49 » 

Цитата
'$sex','$born'
Ты уверен, что тут именно числа? Если эти данные получены от клиента, то надо обязательно их проверить перед вставкой. Для чисел можно сделать так: $born = 0 + $born; Это автоматом конвертит строку в число и если она не является числом, то преобразуется в ноль.

Запомни важную вещь: все данные, полученные от клиента, потенциально опасные. Их нужно проверять и по возможности не использовать напрямую.

Напр., параметер sex. Это перечисляемый тип с конечным кол-вом значений и лучше передавать его в виде числа.
Код: (PHP)
<?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
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #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 Offline
Пол: Мужской

WWW
« Ответ #14 : 18-08-2007 12:16 » new

htmlspecialchars() , stripslashes() -это всё старался делать по учебнику чтобы защититься от всяких недоброжелателей Улыбаюсь уберу если лишнее.
Делать надо зная, что и зачем делается. Не торопись делать умные страницы - просто поэкспериментируй в ф-иями и посмотри, какая что делает. Рекомендую смотреть html-код генерируемой страницы - брузер может делать поблажки, но это не значит, что так можно делать.

Цитата
$cfg['DefaultLang'] = 'windows-1251';
$cfg['Lang']     = 'windows-1251';
$cfg['DefaultCharset'] = 'windows-1251';
Lang - это язык (language), а не кодировка. Оставь "en" или задай "ru" (если конечно есть его поддержка).
Посмотри свойства страницы в браузере - какая там кодировка.

Цитата
3 А что можно придумать с взаимодействием 2х таблиц о кот. я выше попробовал изложить?
В теме нет "2-х таблиц". О чем речь?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines