Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
1

Архитектура веб-приложения

04.12.2020, 11:19. Показов 1815. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Написал для курсовой работы сайт на PHP. У меня есть файлы .php, в которых HTML находится вперемешку с PHP. Никакие фреймворки я не использовал, писал на чистом PHP. Файлы .css и .js подключаются через стили и скрипты. В курсовой работе имеется пункт, в котором нужно описать архитектуру веб-приложения. Я в основном знаю MVC. Но так, как я писал сайт - это точно не MVC, так как вид и контроллер находятся вместе. Даже преподаватель сказал об этом. И у меня вопрос, какая архитектура в таком случае получается? Думаю несколько дней, но никак не могу что-либо сообразить. Подскажите, пожалуйста, что можно написать в данном разделе работы? Надеюсь на вашу помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2020, 11:19
Ответы с готовыми решениями:

Модульная архитектура приложения
Здравствуйте! Подскажите идею красивой архитектуры модульного приложения. Или какой нибудь...

MVC на практике [Архитектура приложения]
Вкратце: как правильно создать структуру приложения, на что опираться? И как правильно их...

Архитектура веб-приложений
Только начинаю программировать на PHP. Написал первый маленький учебный проект, дабы закрепить...

Kohana и архитектура приложения
Здравствуйте. Прошу откликнуться опытных разработчиков, использующих Kohana 3. Только вот...

11
1261 / 959 / 225
Регистрация: 01.10.2018
Сообщений: 3,713
04.12.2020, 11:39 2
Цитата Сообщение от eganator Посмотреть сообщение
Я в основном знаю MVC. Но так, как я писал сайт - это точно не MVC


Цитата Сообщение от eganator Посмотреть сообщение
Подскажите, пожалуйста, что можно написать в данном разделе работы?
Напишите, что хотели продемонстрировать, как не нужно писать веб-приложения

Добавлено через 4 минуты
Если знаете MVC, может, там не все так плохо. Код в открытом доступе? Дайте ссылку.
0
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
04.12.2020, 11:44  [ТС] 3
estic,
Цитата Сообщение от estic Посмотреть сообщение
Напишите, что хотели продемонстрировать, как не нужно писать веб-приложения
Просто я впервые столкнулся с веб-разработкой) И за короткий срок нужно было быстро сделать что-то хорошее. Глубоко углубиться не было времени, но это интересно) А MVC использую периодически в приложениях на С++. Кода в открытом доступе нет, могу на файлообменник загрузить, если удобно будет
0
1261 / 959 / 225
Регистрация: 01.10.2018
Сообщений: 3,713
04.12.2020, 12:08 4
Здесь прямо в сообщении покажите какой-нибудь типовой файл, только поменьше и обрамленный PHP-BB-кодом.
0
72 / 52 / 8
Регистрация: 13.11.2017
Сообщений: 383
04.12.2020, 12:43  [ТС] 5
estic, например, страница с отзывами. Пользователь может их добавлять, а админ удалять.
PHP/HTML
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
<?php session_start();ini_set("display_errors", 0);?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet" type="text/css">
    <link href="https://fonts.googleapis.com/css?family=Oswald" rel="stylesheet" text="text/css">
    <link href="https://fonts.googleapis.com/css?family=Julius+Sans+One" rel="stylesheet" text="text/css">
    <title>Отзывы</title>
    <link rel="stylesheet" type="text/css" href="style.css?<?php echo time(); ?>">
</head>
<body>
 
    <div id="main">
        <p>ОТЗЫВЫ</p>
        <h2>РЕСТОРАН</h2>
        <h1>КОЛЕСО</h1>
    </div>
    
    <div class="menu" id="regularmenu">
        <ul>
            <a href="index.php"><li>ГЛАВНАЯ</li></a>
            <a href="menu/salads-and-appetizers.php"><li>МЕНЮ</li></a>
            <a href="contact.php"><li>КОНТАКТЫ</li></a>
            <a href="news.php"><li>НОВОСТИ</li></a>
            <a href="note.php"><li>ОТЗЫВЫ</li></a>
            <a href="reges.php"><li>ЛИЧНЫЙ КАБИНЕТ</li></a>
            <a href="booking.php"><li>ЗАБРОНИРОВАТЬ СТОЛИК</li></a>
        </ul>
    </div>
 
<div id="news">
        <?php
         $mysqli = @new mysqli('localhost', 'root', 'root', 'id15267461_base3');
  if (mysqli_connect_errno()) {
    echo "Подключение невозможно: ".mysqli_connect_error();
  }
    $result_set = $mysqli->query("SELECT * FROM `stars`"); 
    while($row = mysqli_fetch_array($result_set)){
    ?>
     
        <div class="news-card">
            <h3><strong> <?php print_r($row[Fio]);  ?></strong></h3>
            <p>
                <?php print_r($row[inf]);  ?>
            </p>
<?php if ($_SESSION['admin']==true) { 
?>  <form id="note-form" method="post" action="?del">
        <input type="hidden" name="id" value="<?php print_r($row[id]);?>">
        <button type="submit">Удалить отзыв</button>
    </form>
<?php
}?> 
        </div>
        <?php }?>
 
 
    
    </div>
 
 
    
            
             <?php if ($_SESSION['name']!=true AND $_SESSION['admin']!=true)
   { ?>    <div class="forminfo"><div class="service-icon" style="background-image: url('блокнот.svg')">
        </div>
        <div class="title"><p>ЗДРАВСТВУЙТЕ!</p>
            <p>Для того что бы оставить отзыв необходимо авторзиоваться!</p>  <?php } ?>
            <?php if ($_SESSION['name']==true)
   { ?>
            
        </div>
        <p>
        Здесь Вы можете отправить нам отзыв, написать сообщение обо всём.<br>
        Приветствуются любые отзывы, пожелания и предложения. Критика в наш адрес также приветствуется.<br><br>
        СПАСИБО, ЧТО ПОСЕТИЛИ НАШ РЕСТОРАН!
        </p>
    </div>
    
 
    <form id="note-form" method="post" action="?otz">
        <input class="formtext" type="text" name="name" placeholder="Ваше имя..." style="margin-bottom: 15px;"/>
        <br>
        <textarea class="formtext" name="message" rows="9" cols="80" class="input" placeholder="Ваш отзыв..." style="margin-bottom: 10px;" required></textarea><br>
        <button type="submit">ОТПРАВИТЬ!</button>
    </form>
<?php } ?>
<?php
if (isset($_GET['otz'])) 
{ 
    $name = $_POST['name'];
    $text = htmlspecialchars($_POST['message']);
    
    $mysqli = @new mysqli('localhost', 'root', 'root', 'id15267461_base3');
  if (mysqli_connect_errno()) {
    echo "Подключение невозможно: ".mysqli_connect_error();
  }
    $result_set = $mysqli->query("INSERT INTO `stars` VALUES (NULL,'$name','$text')");
     
       ?><script>document.location.href="note.php"</script><?php
}
 
if (isset($_GET['del'])) 
{ 
    $id = $_POST['id'];
  
    $mysqli = @new mysqli('localhost', 'root', 'root', 'id15267461_base3');
  if (mysqli_connect_errno()) {
    echo "Подключение невозможно: ".mysqli_connect_error();
  }
    $result_set = $mysqli->query("DELETE FROM `stars` WHERE id='$id'");
    ?><script>document.location.href="note.php"</script><?php
     
    
}
 
 
?>
    </div>  </div>
    <div class="footer menu">
        <ul>
            <a href="index.php"><li>ГЛАВНАЯ</li></a>
            <a href="menu/salads-and-appetizers.php"><li>МЕНЮ</li></a>
            <a href="contact.php"><li>КОНТАКТЫ</li></a>
            <a href="news.php"><li>НОВОСТИ</li></a>
            <a href="note.php"><li>ОТЗЫВЫ</li></a>
            <a href="reges.php"><li>ЛИЧНЫЙ КАБИНЕТ</li></a>
            <a href="booking.php"><li>ЗАБРОНИРОВАТЬ СТОЛИК</li></a>
        </ul>
    </div>
        
    <div class="final">
        <p>EgaNator 2020</p>
    </div>
    
</body>
</html>
0
1261 / 959 / 225
Регистрация: 01.10.2018
Сообщений: 3,713
04.12.2020, 16:30 6
Все плохо.

Немного порадовало method="post" action="?del", но взаимодействие с базой данных вперемешку с HTML-кодом, отсутствие нормальной маршрутизации, защиты от SQL-инъекций и т.д. не позволяют сказать об этом ничего хорошего. Извините.

Добавлено через 1 минуту
Вам нужно было обратиться к кому-нибудь за консультацией, прежде чем приступать к написанию.
0
2232 / 1278 / 611
Регистрация: 23.08.2015
Сообщений: 3,228
04.12.2020, 19:24 7
eganator, Давайте разбираться по порядку. В контексте html кода php играет роль простого шаблонизатора. В нем нельзя обращаться к базе данных и содержать бизнес логику. В шаблон html должны приходить уже готовые данные для вывода.

Так же используется конструкция <php if ():?> <?php endif ?> вместо <php if (){?> <?php } ?>

Для начала вынесете запросы к бд из html кода в самый верх - область формирования данных для вывода.

PHP/HTML
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
139
140
141
142
143
144
<?php
 
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
 
session_start();
 
$mysqli = new mysqli('localhost', 'root', 'root', 'id15267461_base3');
 
if (mysqli_connect_errno()) {
    echo "Подключение невозможно: " . mysqli_connect_error();
    die();
}
 
if (!empty($_POST)) {
    if (isset($_GET['del'])) {
        $id = $_POST['id'];
 
        $stmt = $mysqli->prepare("DELETE FROM `stars` WHERE id=?");
        $stmt->bind_param('i', $id);
        $stmt->execute();
 
        header('Location: /note.php');
        die();
    }
 
    if (isset($_GET['otz'])) {
        $name = $_POST['name'];
        $text = $_POST['message'];
 
        $stmt = $mysqli->prepare("INSERT INTO `stars` VALUES (NULL, ?, ?)");
        $stmt->bind_param('ss', $name, $text);
        $stmt->execute();
 
        header('Location: /note.php');
        die();
    }
}
 
 
$reviews = [];
$res = $mysqli->query("SELECT * FROM `stars`");
while($row = mysqli_fetch_array($res)) {
    $reviews[] = $row;
}
 
 
$isAdmin = $_SESSION['admin'] == true;
$isGuest = empty($_SESSION['name']);
 
?>
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet" type="text/css">
    <link href="https://fonts.googleapis.com/css?family=Oswald" rel="stylesheet" text="text/css">
    <link href="https://fonts.googleapis.com/css?family=Julius+Sans+One" rel="stylesheet" text="text/css">
    <title>Отзывы</title>
    <link rel="stylesheet" type="text/css" href="style.css?<?= time(); ?>">
</head>
<body>
 
<div id="main">
    <p>ОТЗЫВЫ</p>
    <h2>РЕСТОРАН</h2>
    <h1>КОЛЕСО</h1>
</div>
 
<div class="menu" id="regularmenu">
    <ul>
        <a href="index.php"><li>ГЛАВНАЯ</li></a>
        <a href="menu/salads-and-appetizers.php"><li>МЕНЮ</li></a>
        <a href="contact.php"><li>КОНТАКТЫ</li></a>
        <a href="news.php"><li>НОВОСТИ</li></a>
        <a href="note.php"><li>ОТЗЫВЫ</li></a>
        <a href="reges.php"><li>ЛИЧНЫЙ КАБИНЕТ</li></a>
        <a href="booking.php"><li>ЗАБРОНИРОВАТЬ СТОЛИК</li></a>
    </ul>
</div>
 
<div id="news">
    <?php foreach ($reviews as $review): ?>
        <div class="news-card">
            <h3><strong> <?= $review['Fio'] ?></strong></h3>
            <p>
                <?= $review['inf'] ?>
            </p>
            <?php if ($isAdmin) : ?>
                <form id="note-form" method="post" action="?del">
                    <input type="hidden" name="id" value="<?= $review['id'] ?>">
                    <button type="submit">Удалить отзыв</button>
                </form>
            <?php endif; ?>
        </div>
    <?php endforeach ?>
</div>
 
<div class="forminfo">
    <?php if ($isGuest AND !$isAdmin) : ?>
        <div class="service-icon" style="background-image: url('блокнот.svg')"></div>
        <div class="title"><p>ЗДРАВСТВУЙТЕ!</p>
            <p>Для того что бы оставить отзыв необходимо авторзиоваться!</p>
        </div>
    <?php endif; ?>
    <?php if (!$isGuest): ?>
        <p>
            Здесь Вы можете отправить нам отзыв, написать сообщение обо всём.<br>
            Приветствуются любые отзывы, пожелания и предложения. Критика в наш адрес также приветствуется.<br><br>
            СПАСИБО, ЧТО ПОСЕТИЛИ НАШ РЕСТОРАН!
        </p>
    <?php endif; ?>
</div>
 
<?php if (!$isGuest): ?>
    <form id="note-form" method="post" action="?otz">
        <input class="formtext" type="text" name="name" placeholder="Ваше имя..." style="margin-bottom: 15px;"/>
        <br>
        <textarea class="formtext" name="message" rows="9" cols="80" class="input" placeholder="Ваш отзыв..." style="margin-bottom: 10px;" required></textarea><br>
        <button type="submit">ОТПРАВИТЬ!</button>
    </form>
<?php endif; ?>
 
<div class="footer menu">
    <ul>
        <a href="index.php"><li>ГЛАВНАЯ</li></a>
        <a href="menu/salads-and-appetizers.php"><li>МЕНЮ</li></a>
        <a href="contact.php"><li>КОНТАКТЫ</li></a>
        <a href="news.php"><li>НОВОСТИ</li></a>
        <a href="note.php"><li>ОТЗЫВЫ</li></a>
        <a href="reges.php"><li>ЛИЧНЫЙ КАБИНЕТ</li></a>
        <a href="booking.php"><li>ЗАБРОНИРОВАТЬ СТОЛИК</li></a>
    </ul>
</div>
 
<div class="final">
    <p>EgaNator 2020</p>
</div>
 
</body>
</html>
Добавлено через 2 минуты
Так же не отключайте вывод ошибок. И не подавляйте их символом @.

Добавлено через 23 минуты
eganator, Еще один момент. Для защиты от SQL-инъекций используйте подготовленные запросы. Не используйте htmlspecialchars при записи в БД - храните данные как есть.

Иначе могут возникать куча проблем. Ну к примеру вы захотите обрезать текст сообщения для вывода превьюшки на 100 символов. Из-за того, что там уже заменены спецсимволы на html сущности, количество символов уже будет больше, и может обрезаться посреди html сущности так, что полетит верстка. Тут можно еще придумать разные ситуации.

Самый надежный вариант это использовать htmlspecialchars при выводе данных.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php foreach ($reviews as $review): ?>
    <div class="news-card">
        <h3><strong> <?= htmlspecialchars($review['Fio'], ENT_QUOTES | ENT_SUBSTITUTE) ?></strong></h3>
        <p>
            <?= htmlspecialchars($review['inf'], ENT_QUOTES | ENT_SUBSTITUTE) ?>
        </p>
        <?php if ($isAdmin) : ?>
            <form id="note-form" method="post" action="/?del">
                <input type="hidden" name="id" value="<?= $review['id'] ?>">
                <button type="submit">Удалить отзыв</button>
            </form>
        <?php endif; ?>
    </div>
<?php endforeach ?>
1
1261 / 959 / 225
Регистрация: 01.10.2018
Сообщений: 3,713
04.12.2020, 20:06 8
Цитата Сообщение от sad67man Посмотреть сообщение
if (!empty($_POST)) {
Авторизационную проверку забыли.

Цитата Сообщение от sad67man Посмотреть сообщение
$id = $_POST['id'];
Цитата Сообщение от sad67man Посмотреть сообщение
$name = $_POST['name'];
$text = $_POST['message'];


Цитата Сообщение от sad67man Посмотреть сообщение
Так же не отключайте вывод ошибок.
На проде?

Добавлено через 2 минуты
Нет обработки ошибок MySQLi, не считая подключения.
0
2232 / 1278 / 611
Регистрация: 23.08.2015
Сообщений: 3,228
04.12.2020, 21:27 9
estic, В основе рефакторинга лежит последовательность небольших преобразований, сохраняющих поведение, а не переписывания всего кода. Если я что-то упустил, это значит, что так было и не являлось целью конкретного преобразования. Сейчас я просто вынес php код из html.

Не по теме:

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

1
1261 / 959 / 225
Регистрация: 01.10.2018
Сообщений: 3,713
05.12.2020, 10:04 10
sad67man, автор не просил исправлять его код, а спрашивал, что можно написать ("хорошее") по поводу имеющегося Я извинился и ответил, что ничего, к сожалению.

Я "критикую", чтобы помочь. В начале я назвал достаточно простые для исправления вещи, которые вы пропустили. Боюсь, что и в другом вашем коде подобное будет ждать рефакторинга еще очень долго. Если я не прав, и это просто такое отношение к коду на форуме, то извините.

Добавлено через 1 минуту
Про отключение вывода ошибок вы так и не пояснили.

Добавлено через 6 минут

Не по теме:

Вижу, вам достался лайк от автора. Значит, он продолжает следить за темой, что хорошо.

0
29 / 15 / 3
Регистрация: 03.08.2019
Сообщений: 82
05.12.2020, 13:12 11
sad67man,

Строки 16-18 / 28-30
Не правильная валидация внешних данных и ключей в 2к20 + проверка типа запроса.
Тип запроса POST придет с пустыми данными, что будешь делать ?

Строки 20-22
Не правильная оптимизация кода с добавлением лишних действий. Запрос можно послать как query, если к переменной добавить лишь конверт тип
PHP
1
"DELETE FROM `stars` WHERE `id` = " . ( int ) $id
Смысла в препарировании данных тут нет.

Строки 42-46
1) Ты используешь mysql инструмент ООП функционала, НО - каким боком влезла Функция процедурного стиля mysqli_fetch_array ?
2) В php документации, существуют функции такие как mysqli_result::fetch_all как в ООП, так и в процедурном. Зачем циклы????

Строка 49
PHP
1
$isAdmin = $_SESSION['admin'] == true;
А если не существует в сессии ключ admin, то что мы словим? угадайте. Да даже если будет ключ - зачем == true ???
Для этого существует специальный класс Аутентификации сессии с отдельным методом.
0
gogolik
05.12.2020, 13:14     Архитектура веб-приложения
  #12
 Комментарий модератора 
Уважаемые товарищи. Ведём себя прилично и в рамках правил форума.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2020, 13:14

Архитектура приложения на yii
Помогите кто сможете. Пишу на yii, но думаю фреймворк непринципиален.. Данные организованы не...

Архитектура приложения. Коды ошибок
Добрый день Заметил одно &quot;неудобство&quot; с работой с кодами ошибок при наследовании. Приведу...

Архитектура приложения в Yii2, хотя такая задача мб и в др фреймворках)
Вечер добрый) Есть небольшой вопрос по архитектуре, точнее хочу услышать ваше мнение и советы. ...

Архитектура веб-приложения
Добрый вечер! Собираюсь писать веб-приложение с использование asp.net core(клиентская и серверная...

Архитектура веб-приложения
Ребят, я запутался. Помогите распутаться, пожалуйста. Проект очень схож с интернет-магазином....

Подробная архитектура веб-приложения
Доброго времени суток! 1)Подскажите как расширить имеющуюся схему архитектуры веб-приложения...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru