Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

PHP, SQL, SSI-Дневник ламера, превращающегося в ГУРУ :-) Dsgecr пятый. Работа с формами.


Информационный Канал Subscribe.Ru

Выпуск номер 5
Рассылка: Дневник ламера.
     
 

Здравствуйте. Давненько не писал. Загрузили на работе. Неприятно :-)
Надо завязывать с этой работой. Всё никак не могу магазинчик свой дописать до конца.

Сегодня стояла задача - сдалать список иностранных языков, которые в зависимости от состояния флажка ENABLE в базе данных должны отображаться, либо не отображаться :-)
Также нахвания необходимо редактировать и удалять. До этого я делал четыре отдельных процедуры на страничке, одна добавляла, другая редактировала, третья удаляла, четвёртая выставляла флажок ENABLE.
Сегодя я подумал, что это неспортивно и по ламерски, поэтому сдалал всё в одной страничке.
Сначала про работу с СЕССИЯМИ.

Это полезная штука, которая позволяет на протяжении всего сеанса работы с сервером идентифицировать пользователя. Работает так:

session_name("sid"); Задаём имя сессии (Необязательно. По умолчанию у меня в настройках сервера я поставил "SID")
session_start(); Стартуем сессию. Это должно происходить на каждой странице вашего сайта вместе с определением имени сессии, иначе возможна потеря этой сессии.
$_SESSION["referal"]=$mod; Определение номера реферала, который отправил нам данного пользователя на сайт. Далее идут операции с базой данных, по подсчёту юзеров, пришедших от реферала на наш сайт. Их я опущу.
$_SESSION["userlevel"]=3; Это включение режима администратора. Тоесть лично у меня 0 - это нерегистрированный пользователь, 1 - просто зарегистированный пользователь, 2 - администратор, 3 - лично Я, которому доступны ВСЕ настройки и опции управления.

$_SESSION[" "] - это определение переменной в сессии. На сервере создаётся файл(в директории TEMP у меня), в котором хранятся эти переменные, а пользователь лишь "Протаскивает" через все страницы номер своей Сессии и РНР из файла с номером сессии уже извлекает переменые. Это также хорошо тем, что пользователь сам не имеет доступа к значениям переменных, в отличии от варианта с Куками. REFERAL и USERLEVEL - это определения переменных сессии, к которым мы можем обратиться в любой момент. Тоесть это просто переменная, с которой можно делать тоже самое, что и с остальными, обращаясь: $_SESSION["Имя Переменной "] Вот так всё просто.

Далее формы ввода. Они стоят в конце, но для понимания привожу их в начале:

<form name="form1" method="post" action="addlang.php?ok=1">
<!--Если данные из формы поступили, то переменная $ok имеет значение 1 -->
<?
$query='select * from languages;'; //Форминуем запрос к базе SQL

include'./files/sql.php'; //это у меня процедура подключения к базе: connect, select_db $result=mysql_query($query, $db); // Выбираем из базы все языки, которые есть в таблице languages
$sum=mysql_num_rows($result); //Считаем количество строк(рядов) в результате запроса
$count=1; //Счётчик для цикла
while($arr=mysql_fetch_array($result)) //Начало цикла
{ ?> <!-- Обратите внимание, скрипт заканчивается, но цикл не обрывается, он гоняется уже по тегам HTML -->
<a href="addlang.php?mode=delete&delid=<? echo $arr['id']; ?>">Удалить</a>
<!-- Кнопочка Удаления, включает MODE на удаление и передаёт ID номера элемента, который надо снести в этот-же скрипт. Проверка состояния переменной в самом начале -->
<input type="text" name="name<? echo $count; ?>" value="<? echo $arr["name"]; ?>">
<!-- Форма ввода текста, в которой по умолчанию стоит название языка. Его можно сразу-же редактировать. имя формы состоит из двух кусков: name и номер ID в базе -->
<input type="checkbox" name="enable<? echo $count; ?>"<? if($arr["enable"]==1){echo' checked';} ?> value="1">
<!-- Флажок отображения-скрытия языка. Если в базе стоит значение ENABLE=1 то мы добавляем в форму чекбокса значение checked что означает, что по умолчанию он выбран. Имя элемента также состоит из двух частей: слово "ENABLE" и ID элемента в базе данных.
Что интересно, Чекбокс имеет поле значения VALUE="что-то" Tckb xtr,jrc отмечен, то в скрипт передаётся переменная с ЭТИМ значением VALUE В моём примере это значение "1" но ничего не мешает сделать его другим. Мы имеем в данном случае два плюса, если переменная вообще определена, то значит Чекбокс был отмечен, а прочитав значение, переданное чекбоксом, можно уже ещё один параметр идентифицировать. Тоесть мы получаем с одного элемента, сразу ДВА вводных параметра -->
<input type="hidden" name="id<? echo $count.'" value="'.$arr['id']; ?>"> <!-- Просто передаём количество переменных(строк) в базе и на экране -->

<br>

<? $count +=1; } ?> <!-- Цикл заканчивается -->
<br>Новый язык:
<input name="newlang" type="text"> <!-- просто форма добавления нового языка -->

<input name="enablenew" type="checkbox" checked> <!-- Сразу-же выставляем новому языку флажок отображения-скрытия -->

<br>
<input type="submit" name="Submit" value=" Ok "> <!-- Кнопка отправки данных формы -->
<input type="hidden" name="count" value="<? echo $sum; ?>"> <!-- Скрытая переменная формы. Затем нужна будет в скрипте-обработчике -->
</form>

Теперь процедуры обработки всех этих полей, когда они поступают к нам в скрипт.
Приведённые ниже процедуры стоят В НАЧАЛЕ скрипта:

<?

if($_SESSION['userlevel']==3 && isset($ok) && $ok=="1") // Если это чел с уровнем доступа "userlevel"=3, тоесть Я, то идём дальше
{
if(isset($newlang)){settype($newlang,"string"); // Если поле - новый язык определено, то заносим его в базу данных приведённой ниже процедурой

if(isset($enablenew)){$enablenew=1;} else{$enablenew=0;} // Тут определяем значение флажка ENABLE языка, выставляемого в Чекбоксе
$query='select * from languages where name="'.$newlang.'";'; // Формируем запрос к SQL базе, для проверки наличия такой записи о языке в ней

include'./files/sql.php'; $result=mysql_query($query, $db); // Подключаемся к SQLю и проверяем
if(mysql_num_rows($result)==0 && $newlang!=""){ // Проверяем записи. Если количество выбранных элементов равно нулю(тоесть такого языка в базе нет) и строка запроса НЕНУЛЕВАЯ то добавляем в базу новую запись с языком.

$query='insert into languages values("","'.$newlang.'","'.$enablenew.'");';
mysql_query($query, $db);}

}

settype($count,"integer"); // Определяем переменную, поступившую из формы как INTEGER(Необязательно, но пусть будет, на всякий случай) Она нужна, чтобы проверить все текстовые поля INPUT и занести в базу новые изменения, если они были.
if($count>200){$count=200;}
// Это ограничение. Тоесть реально я в таблице базы не собираюсь держать больше 200 записей языков. Защита от флудеров, чтоб если что, базу не забили излишне.
$countwhile=1; //Иництиализирую счётчик для цикла, на перебор имён текстовых полей INPUT, пришедших из формы
include"./files/sql.php";
// Повтор подключения к SQL серверу, на всякий случай, если ранее этого не произошло.

while($countwhile<=$count) //Начинаем перебор текстовых полей, пришедших из формы
{
$namew="name".$countwhile;
// тут посредством Конкатенации, тоесть символа точки(.) в задании значения переменной, мы последовательно перебираем bvtyf полей input type="text"
которые были в форме. Для этого создавая форму я и использовал каунтер
$enablew="enable".$countwhile; //Делаем тоже самое для полей ENABLE
$idw="id".$countwhile; // И для поля, определяющего ID записи в таблице базы
settype($$enablew,'boolean');
Определяем значение флажка как BOOLEAN, тоесть 1 или 0
$query='update languages set name="'.$$namew.'", enable="'.$$enablew.'" where id="'.$$idw.'";';
// Формируем запрос к таблице. Он сделан оператором UPDATE, который изменяет существующую запись, тоесть изменяет все параметры, упомянутые в запросе. В моём случае есть три значения у одной записи: ID, Name и Enable. Я, как вы заметили прочитав запрос, изменяю только два из них, оставляя поле ID прежним.
mysql_query($query,$db); //Собсно сам запрос к базе, изменяющий одну строчку в ней.
$countwhile+=1;
// И приращение каунтера, для следующей выборки значений полей
}}

if(isset($mode) && $mode=='delete' && $_SESSION['userlevel']==3) // Это процедура удаления. Если помните, я её помещал слева от текстового поля. Просто ссылка с переменными в самой строке - Инициализация переменной MODE на удаление (Значение "Delete") и ID записи, которую следует удалить. Процедура опять-же запускается только в случае, если стоит соответствующий уровень доступа.
{settype($delid, "integer"); $query='delete from languages where id="'.$delid.'";'; // определяем переменную, содержащую ID удаляемой строки как INTEGER и сразу-же формируем запрос к базе на удаление.

include"./files/sql.php"; mysql_query($query,$db); } // Собсно опять подключение к базе данных и удаление параметра

?>

 

Вот в общем всё насегодня. Ещё раз прошу прощения за то, что давненько не делал выпуски. Если у кого-то будут комментарии к вышеприведённому листингу, то пишите. Буду рад узнать возможные упрощения к нему и апгрейды :-)

Досвиданья, типа будьте здоровы и живите богато %)))

 
     
Евгений Евсеев - IrkutskProject(Собака)yandex.ru

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.php1sql1ssi
Отписаться

В избранное