Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/106: Рейтинг темы: голосов - 106, средняя оценка - 4.81
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337

Создание системы регистрации в программе

30.06.2013, 18:06. Показов 21476. Ответов 8

Студворк — интернет-сервис помощи студентам
Захотелось мне написать/дополнить статью про создание системы авторизации в программе при помощи xml файла. Если статья написана не в том разделе прошу перенести.
Делать мы всё будем на одной форме для простоты обучения. (Самостоятельно вы сможете разделить регистрацию и вход по разным формам). Или же сделать например скрытие одних элементов и появление других черед Panel.
1) Для начала создадим новый проект "Приложение Windows Forms".
2) На данную нам Form1 добавим следующие элементы:

На форме расположены:
  1. Текстовые поля loginenbox и passenbox для входа
  2. Текстовые поля loginregbox и passregbox для регистрации.
  3. Так же для понятности 4 label (логин и пароль)x2.
  4. Кнопки enterbutton и registerbutton для входа и регистрации соответственно.
3) Щелкнем два раза по конструктору формы откроется файл кода программы и отправит нас в событие Form1_Load.
4) Но пока мы оставим его и перейдём в начало файла и после:
C#
1
using System;
Добавим пространства имён:
C#
1
2
using System.IO;
using System.Xml;
Для того что бы просто было использовать функции Xml и системы файлов.
5) Так же добавим "публичную" переменную defpath для простоты изменения пути к Xml файлу в дальнейшем.
C#
1
public string defpath = "users.xml";
Как видно ей присвоено значение имени файла, но вы можете прописать путь например "C:/users.xml" для того чтобы данный файл создавался в нужной вам папке, а не рядом с программой.
6) Создадим событие создания xml файла:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
private void CreateXMLDocument(string filepath) //создание xml файла
{
    XmlTextWriter xtw = new XmlTextWriter(filepath, Encoding.UTF32); 
    xtw.WriteStartDocument();
    xtw.WriteStartElement("users");
    xtw.WriteEndDocument();
    xtw.Close();
}

7) В Form1_load который мы попадали ранее, (для того что бы создать xml файл если его ещё нет) добавим:
C#
1
2
3
4
private void Form1_Load(object sender, EventArgs e)
{
     if (!File.Exists(defpath)) CreateXMLDocument(defpath);
}
8) Теперь нам необходимо добавить событие для нахождения свободного ID пользователя. Расскажу о нём чуть позже:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private string MaxID(string filepath) //вычисление max id
{
    List<int> idList = new List<int>();
    int id;
    XmlDocument xd = new XmlDocument();
    FileStream fs = new FileStream(filepath, FileMode.Open);
    xd.Load(fs);
    XmlNodeList list = xd.GetElementsByTagName("user");
    if (list.Count > 0)
    {
        for (int i = 0; i < list.Count; i++)
        {
            XmlElement user = (XmlElement)xd.GetElementsByTagName("user")[i];
            id = Convert.ToInt32(user.GetAttribute("id"));
            idList.Add(id);
        }                
        int result = 0;
        foreach (int j in idList)
            if (j > result)
                result = j;
        result++; 
        fs.Close();
        return result.ToString();
    }
    else
    {
        fs.Close();
        return "1"; 
    }
}

9) Раз уж мы теперь можем вычислить ID нового пользователя то можно добавить событие регистрации нового пользователя:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        private void WriteToXMLDocument(string filepath, string name, string pwd) //добавление записи
        {
            if (!File.Exists(defpath)) CreateXMLDocument(defpath);
            string id = MaxID(filepath);
            XmlDocument xd = new XmlDocument();
            FileStream fs = new FileStream(filepath, FileMode.Open);
            xd.Load(fs);
 
            XmlElement user = xd.CreateElement("user");
            user.SetAttribute("id", id);
 
            XmlElement login = xd.CreateElement("login");
            XmlElement pass = xd.CreateElement("password");
 
            XmlText tLogin = xd.CreateTextNode(name);
            XmlText tPassword = xd.CreateTextNode(pwd);
 
            login.AppendChild(tLogin);
            pass.AppendChild(tPassword);
 
            user.AppendChild(login);
            user.AppendChild(pass);
 
            xd.DocumentElement.AppendChild(user);
 
            fs.Close();
            xd.Save(filepath);
        }

О нём я расскажу немного подробнее. Мы снова проверяем есть ли xml файл (простое избегание ошибок - вдруг файл был удалён во время работы программы). В xml добавляем нового пользователя с номером (номер мы получаем из события созданного ранее).

10) Далее вернёмся в конструктор и добавим событие для кнопки регистрации (двойной щелчок по ней в конструкторе):
C#
1
2
3
4
5
6
        private void registerbutton_Click(object sender, EventArgs e)
        {
            if (!(loginregbox.Text == "") & !(passregbox.Text == ""))
                WriteToXMLDocument(defpath, loginregbox.Text, passregbox.Text);
            else MessageBox.Show("Введите имя пользователя и пароль");         
        }
Тут мы на всякий случай проверяем не пусты ли текстовые поля с логином и паролем.

Можно попробовать запустить программу и протестировать запись xml файла, он должен получится таким (я вводил сначала пользователя yura097 с паролем 12345, а затем пользователя admin с паролем parol):
XML
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-32"?>
<users>
  <user id="1">
    <login>yura097</login>
    <password>12345</password>
  </user>
  <user id="2">
    <login>admin</login>
    <password>parol</password>
  </user>
</users>
Как мы видим программа создала 2 записи с разными ID и записала в них наши данные.

11) Если у вас всё получилось то можно приступить к созданию события входа:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        private void ReadXMLDocument(string filepath, string loget, string passget)
        {
            string name, pwd;
            XmlDocument xd = new XmlDocument();
            FileStream fs = new FileStream(filepath, FileMode.Open);
            xd.Load(fs);
            XmlNodeList list = xd.GetElementsByTagName("user");
            for (int i = 0; i < list.Count; i++)
            {
                XmlElement user = (XmlElement)xd.GetElementsByTagName("login")[i];
                XmlElement pass = (XmlElement)xd.GetElementsByTagName("password")[i];
                name = user.InnerText;
                pwd = pass.InnerText;
                if ((loget == name) & (passget == pwd))
                {
                    MessageBox.Show("Успешный вход");
                    break;
                }
                else if (i == list.Count - 1) MessageBox.Show("Неверный логин или пароль");
            }
            fs.Close(); 
        }

В данном событии мы сравниваем наши сточки из полей логина и пароля с входа со всеми пользователями в нашем xml файле. Если пользователь найдет то будет выведено сообщение "Успешный вход". Если же пользователь не найден и список пользователей закончен то будет выведено сообщение "Неверный логин и пароль". Конечно же вместо сообщения "Успешный вход" можно открывать другую форму и так далее.

12) Конечно же нужно не забыть вернуться в конструктор и создать событие для кнопки входа:
C#
1
2
3
4
5
6
7
private void enterbutton_Click(object sender, EventArgs e)
{
    if (!(loginenbox.Text == "") & !(passenbox.Text == ""))
    {
        ReadXMLDocument(defpath, loginenbox.Text, passenbox.Text);
    }
}
Собственно всё. На самом "простом уровне" наша система для входа в программу готова.
Вот на всякий случай полный код программы:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System;
using System.IO;
using System.Xml;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        public string defpath = "users.xml";
 
        private void Form1_Load(object sender, EventArgs e)
        {
            if (!File.Exists(defpath))
                CreateXMLDocument(defpath);
        }
 
        private void CreateXMLDocument(string filepath) //создание xml при запуске
        {
            XmlTextWriter xtw = new XmlTextWriter(filepath, Encoding.UTF32);
            xtw.WriteStartDocument();
            xtw.WriteStartElement("users");
            xtw.WriteEndDocument();
            xtw.Close();
        }
 
        private string MaxID(string filepath) //вычисление max id
        {
            List<int> idList = new List<int>();
            int id;
            XmlDocument xd = new XmlDocument();
            FileStream fs = new FileStream(filepath, FileMode.Open);
            xd.Load(fs);
            XmlNodeList list = xd.GetElementsByTagName("user");
            if (list.Count > 0)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    XmlElement user = (XmlElement)xd.GetElementsByTagName("user")[i];
                    id = Convert.ToInt32(user.GetAttribute("id"));
                    idList.Add(id);
                }
                int result = 0;
                foreach (int j in idList)
                    if (j > result)
                        result = j;
                result++;
                fs.Close();
                return result.ToString();
            }
            else
            {
                fs.Close();
                return "1";
            }
        }
 
        private void WriteToXMLDocument(string filepath, string name, string pwd) //добавление записи
        {
            if (!File.Exists(defpath))
                CreateXMLDocument(defpath);
            string id = MaxID(filepath);
            XmlDocument xd = new XmlDocument();
            FileStream fs = new FileStream(filepath, FileMode.Open);
            xd.Load(fs);
 
            XmlElement user = xd.CreateElement("user");
            user.SetAttribute("id", id);
 
            XmlElement login = xd.CreateElement("login");
            XmlElement pass = xd.CreateElement("password");
 
            XmlText tLogin = xd.CreateTextNode(name);
            XmlText tPassword = xd.CreateTextNode(pwd);
 
            login.AppendChild(tLogin);
            pass.AppendChild(tPassword);
 
            user.AppendChild(login);
            user.AppendChild(pass);
 
            xd.DocumentElement.AppendChild(user);
 
            fs.Close();
            xd.Save(filepath);
        }
 
        private void registerbutton_Click(object sender, EventArgs e)
        {
            if (!(loginregbox.Text == "") & !(passregbox.Text == ""))
                WriteToXMLDocument(defpath, loginregbox.Text, passregbox.Text);
            else MessageBox.Show("Введите имя пользователя и пароль");         
        }
 
        private void ReadXMLDocument(string filepath, string loget, string passget)
        {
            string name, pwd;
            XmlDocument xd = new XmlDocument();
            FileStream fs = new FileStream(filepath, FileMode.Open);
            xd.Load(fs);
            XmlNodeList list = xd.GetElementsByTagName("user");
            for (int i = 0; i < list.Count; i++)
            {
                XmlElement user = (XmlElement)xd.GetElementsByTagName("login")[i];
                XmlElement pass = (XmlElement)xd.GetElementsByTagName("password")[i];
                name = user.InnerText;
                pwd = pass.InnerText;
                if ((loget == name) & (passget == pwd))
                {
                    MessageBox.Show("Успешный вход");
                    break;
                }
                else if (i == list.Count - 1) MessageBox.Show("Неверный логин или пароль");
            }
            fs.Close();
        }
 
        private void enterbutton_Click(object sender, EventArgs e)
        {
            if (!(loginenbox.Text == "") & !(passenbox.Text == ""))
            {
                ReadXMLDocument(defpath, loginenbox.Text, passenbox.Text);
            }
        }
    }
}


Конечно же тут нет например "запоминания пароля" или "удаления пользователя". Так же отсутствует какое либо шифрование. Но возможно я расскажу вам об этом в дальнейшем. Да и в принципе вы сможете сделать всё это сами.
Для определённой красоты можно элементы входа и регистрации поместить на панели и сделать дополнительно кнопку "регистрации", а на панели с регистрацией "отмена" и "ок". Ну в общем это всё ваша фантазия.
Вы можете для красоты в текстовых полях пароля включить свойство UseSystemPasswordChar для скрытия пароля при вводе.
Вообщем пора остановиться ибо "добавлять" можно бесконечно.
Спасибо за прочтение, об ошибках конечно же сообщайте. Так же возможно о способах оптимизации.
2
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.06.2013, 18:06
Ответы с готовыми решениями:

Создание системы регистрации/авторизации
Фабула ----------------------------------------------------------------------------------------------------------------------------- ...

Создание регистрации и аутентификации spring. Логика регистрации и авторизации
Для регистрации юзера на сервер приходят данные в json формате(логин пароль подтвержденный пароль). Принимаю их на контроллер на маппинг...

Режим регистрации в программе тестирования
Пишу дипломную работу, нужна ваша помощь . Дело в том что я создал тестирование на делфи, но не могу разобраться как сделать для нее...

8
 Аватар для Zuzik
298 / 256 / 57
Регистрация: 11.06.2012
Сообщений: 1,557
01.07.2013, 01:11
Для начинающих может и не плохо, но сугубо для начинающих. Насчет оптимизации кода - прочитайте более подробно про способы работы с хмл файлами, в частности про сериализацию, Linq to XML (это при желании). Кое где не совсем логичные названия переменных. Не путайте что такое событие и функция. Наконец - представьте сколько вам кода придется изменять при необходимости добавить еще адрес электронной почты пользователя? И конкретная вещь - нахождение максимального айди пользователя и преобразование его в строку - зачем (8 пункт)? Почему не оставить старый добрый инт?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.07.2013, 03:32
yura097, как уже сказано выше, почитайте про сериализацию. Можно добиться того же, буквально в 3-4 строчки.

Что добавлю
1)
Щелкнем два раза по конструктору формы откроется файл кода программы и отправит нас в событие Form1_Load.
такое ощущение, что мы в квест играем Забавно, но ладно
2) почему функция ReadDocument проверяет валидность пароля? Она просто должна считать для нас данные. А проверкой должен заниматься какой-нибудь метод IsValidLoginPassword(string login, string password). Соответственно и называться они должны так, а не loget, passget.
3) собственно вытекает из предыдущего пункта, метод MaxID оказывается ненужным.
4) много неочевидных конструкций:
C#
1
2
3
4
            if (!(loginenbox.Text == "") & !(passenbox.Text == ""))
            {
                ReadXMLDocument(defpath, loginenbox.Text, passenbox.Text);
            }
5) если читатель просто скопирует код, то у него ничего работать не будет, т.к. большая часть кода лежит в form1.designer.cs, привязки событий к кнопкам и т.д. Лучше выкладывать весь проект...


А в целом очень даже недурно
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.07.2013, 04:15
В общем, примерно так я себе это представляю:
1) создаем новое WPF-приложение, называем его как хотим (WPF просто потому, что его исходный код легко выкладывать
2) пишем следующую разметку:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Window x:Class="WpfLogin.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="370" Width="255" FontSize="30" 
        WindowStartupLocation="CenterScreen">
    <StackPanel>
        <TextBlock Margin="5" HorizontalAlignment="Center" Name="LogLabel">Введите логин</TextBlock>
        <TextBox Name="LoginTb" Margin="5" HorizontalAlignment="Center" MinWidth="200"/>
        <TextBlock Margin="5" HorizontalAlignment="Center">Введите Пароль</TextBlock>
        <TextBox Name="PasswordTb" Margin="5" HorizontalAlignment="Center" MinWidth="200"/>
        <Button Margin="5" Click="Enter_Click">Войти</Button>
        <Button Margin="5" Click="Register_Click">Регистрация</Button>
    </StackPanel>
</Window>
нетрудно увидеть, что мы создаем формочку в центре экрана, на котором будет 2 лейбла, 2 текстовых поля для ввода и 2 кнопочки
3) исходный код формы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System.Windows;
 
namespace WpfLogin
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow
    {
        private readonly Personalizer personalizer = new Personalizer(new Repository());
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void Enter_Click(object sender, RoutedEventArgs e)
        {
            bool successLogin = personalizer.Login(LoginTb.Text, PasswordTb.Text);
            MessageBox.Show(successLogin ? "Вы успешно вошли" : "Ошибка при входе");
        }
 
        private void Register_Click(object sender, RoutedEventArgs e)
        {
            bool successRegister = personalizer.Register(LoginTb.Text, PasswordTb.Text);
            MessageBox.Show(successRegister ? "Вы успешно зарегестрировались" : "Пользовтель с таким логином уже существует");
        }
    }
}
ну и создаем новый файл, обзываем его, опять же, как хотим, и пишем там следующий код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Xml.Serialization;
 
namespace WpfLogin
{
    [XmlType]
    public class Person
    {
        public string Login { get; set; }
        public string Password { get; set; }
    }
 
    public interface IRepository
    {
        IEnumerable<Person> Persons { get; }
        void Add(Person person);
    }
 
 
    public class Repository : IRepository
    {
        private const string Filename = "rep.xml";
 
        static readonly XmlSerializer Serializer = new XmlSerializer(typeof(Person[]));
 
        public IEnumerable<Person> Persons
        {
            get
            {
                return DeserializePersons();
            }
        }
 
        private static IEnumerable<Person> DeserializePersons()
        {
            try
            {
                using (var fileStream = new FileStream(Filename, FileMode.Open))
                {
                    return (IEnumerable<Person>) Serializer.Deserialize(fileStream);
                }
            }
            catch
            {
                return Enumerable.Empty<Person>();
            }
        }
 
        public void Add(Person person)
        {
            var persons = DeserializePersons().ToList();
            persons.Add(person);
            using (var fileStream = new FileStream(Filename, FileMode.Create))
            {
                Serializer.Serialize(fileStream, persons.ToArray());
            }
        }
    }
 
 
    public class Personalizer
    {
        private readonly IRepository repository;
 
        public Personalizer(IRepository repository)
        {
            this.repository = repository;
        }
 
        public bool Login(string login, string password)
        {
            var encodedPassword = Encode(password);
            return repository.Persons.Any(p => p.Password == encodedPassword);
        }
 
        public bool Register(string login, string password)
        {
            var encodedPassword = Encode(password);
            bool canRegister = repository.Persons.All(p => p.Login != login); // Не существует с таким логин
            if (canRegister)
                repository.Add(new Person {Login = login, Password = encodedPassword});
            return canRegister;
        }
 
        private static string Encode(string password)
        {
            using (var md5 = MD5.Create())
            {
                byte[] hash = md5.ComputeHash(password.ToCharArray().Select(x => (byte) x).ToArray());
                return string.Join(string.Empty, hash);
            }
        }
    }
}
по-хорошему стоило бы каждый класс вынести в свой отдельный файлик, но для простоты оставил так.

В результате получаем довольно приятное приложение с возможностью авторизации, при этом в явном виде пароли мы не храним, а используем для этого распространенный хэш MD5. Работу приложения можно потестить, исходники прикладываю.


P.S. Из WPF там только 15 строчек разметки, причем довольно все понятно, что к чему
XML
1
<TextBox Name="PasswordTb" Margin="5" HorizontalAlignment="Center" MinWidth="200"/>
создаем кнопочку с именем PasswordTb, с отступом от краев в 5 пикселей с центрированием по горизонтали и шириной не менее 200 пикселей (но при растягивании формы может быть и более)

Поэтому пугаться что это не винформа не стоит.

Дочитавшим до сюда - печеньку

P.P.S. В приложенном исходнике файлы по-человечески размещены в свои файлы.
Вложения
Тип файла: rar WpfLogin.rar (40.3 Кб, 379 просмотров)
1
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
01.07.2013, 11:02  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
5) если читатель просто скопирует код, то у него ничего работать не будет, т.к. большая часть кода лежит в form1.designer.cs, привязки событий к кнопкам и т.д. Лучше выкладывать весь проект...
Для того и было "вернёмся в конструктор и создадим событие".

Я собственно просто нашел решение для своей проблемы и решил поделиться этим решением с людьми.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.07.2013, 11:10
yura097, а кто-то недоволен? Я всегда считал, что на форуме люди могут общаться, а не просто блог ведут. Вот и поправил, как мне кажется правильные.
0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
01.07.2013, 11:12  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
yura097, а кто-то недоволен? Я всегда считал, что на форуме люди могут общаться, а не просто блог ведут. Вот и поправил, как мне кажется правильные.
Нет. Я просто не признаю таких людей которые тупо копируют код
Если уж не хватит ума на то, что нужно бы создать событие для кнопки то зачем вообще копировать этот код...
1
 Аватар для Kolutonec
0 / 0 / 0
Регистрация: 22.05.2014
Сообщений: 14
29.05.2014, 00:00
Цитата Сообщение от yura097 Посмотреть сообщение
C#
1
2
3
4
5
6
7
private void enterbutton_Click(object sender, EventArgs e)
{
    if (!(loginenbox.Text == "") & !(passenbox.Text == ""))
    {
       ReadXMLDocument(defpath, loginenbox.Text, passenbox.Text);
    }
}
А как после нажатия перейти на другой форм?

Добавлено через 4 минуты
Все спасибо разобрался
0
0 / 0 / 0
Регистрация: 02.01.2019
Сообщений: 57
16.07.2019, 00:33
Спасибо сделал регистрацию и вход))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.07.2019, 00:33
Помогаю со студенческими работами здесь

Задумка системы регистрации
В общем, у меня вопрос... Можно ли как-нибудь сделать так. Проверить существование файла. Допустим я делаю систему регистрации по консоли....

Яндекес и системы автоматической регистрации в кат
Такое дело. Сайт имеет Тиц 180. Какое то время назад я с помощью систем 1ps и uhuhu внес в большое кол-во каталогов свой сайт. Тиц...

Написать простой прототип системы регистрации пользователей
задание такое, что я сделала не правильно? подскажите 1. Создавать новый экземпляр объекта UserList (с пустым свойством-массивом...

Разработка диаграмм UML Информационной системы регистрации
Вариант &quot;Информационная система регистрации у владельца сайта и функционирования адресата в сети Internet (Рамблер, Яндекс, Майл,...

Создание регистрации
я только начал учится созданию сайтов на php, подскажите как создать регистрацию на главной странице сайта, регистрация должна выглядеть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru