Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для SanchO-SEK
61 / 23 / 7
Регистрация: 22.05.2012
Сообщений: 89

Ужасный код :-(

26.05.2015, 04:07. Показов 1666. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Несколько лет практикую программирование, и именно в PHP у меня получается некоторое недоразумение, насчет решения которого даже не знаю что думать Дело вот в чем. Для примера покажу свой ход мыслей при написании кода, например, авторизации:

PHP
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
...
// Получим и подготовим рабочие данные (в коде ниже должно быть удаление пробелов и т.д. и т.п., но сейчас не об этом)
$login = ...;
$pass = ...;
 
if(!strlen($login) || !strlen($pass))
    // Если любое из полей осталось пустым
    exit('Поля заполнены неправильно!');
 
// Если код продолжает выполняться, значит поля не пустые. Продолжаем работу!
// Получаем данные из СУБД
$result = ...; // результат выполнения запроса
// СУБД могла либо вернуть пустой результат (нет указанного пользователя), либо запрос мог вообще не выполниться:
if(!$result)
    exit('При загрузке данных произошла ошибка!');
 
// Если код выполняется до сих пор - ответ от СУБД получен. Но вдруг результат пуст?
if(mysql_num_rows($result)==0)
    exit('Указанный пользователь не найден!'); // Это для примера!
 
// Данные есть. Продолжаем!
$data = mysql_fetch_assoc($result); // $data['login'] и $data['password'] - логин и пароль соответственно
 
if($data['login'] != $login || $data['password'] != $pass)
    exit('Неправильный логин или пароль!');
 
// Логин и пароль правильные. Авторизуем пользователя!..
Этим примером я хотел показать, что при работе с данными происходит множество проверок их правильности, и на каждую ошибку нужно не просто отреагировать, а и вывести ответ пользователю на полноценной странице. Одно дело, когда код разметки находится в одном файле с программным кодом, и совсем другое, когда использую шаблонизатор (в моём случае Smarty). Вот небольшой пример кода выше, только с использованием Smarty:

PHP
1
2
3
4
5
6
if(!strlen($login) || !strlen($pass)) {
    $page->assign('message', 'Поля заполнены неправильно!');
    $page->assign('valueLogin', $login);
    $page->display('login.tpl');
    exit();
}
И так вот для каждой проверки данных выводится такая куча кода. Очень нехорошо это всё! Как вариант думал написать пользовательскую функцию, чтобы не писать каждый раз столько строк, но тогда для каждого случая придется писать собственную функцию. Еще вариант - написать класс, и чтобы его дочерние классы выводили относящиеся к ним ошибки, но этот вариант мне не очень нравится. Есть еще какие-нибудь соображения?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.05.2015, 04:07
Ответы с готовыми решениями:

ПЛЮШКИ - русский язык, ужасный баг
VOT TAKAIA problema. Ispol'zuiu gotovyj skript magazina. Kogda vstavliaiu tovarv bd - na russ. iaz. vse normal'no, vse otobrazhaetsia...

Как написать ужасный код
Здравствуйте. Поругался с преподавателем по программированию и решил сделать следующую лабу максимально нечитабельной. Пишу на си++....

Кажется написал ужасный код. Можно его как-то оптимизировать?
Решал одну задачку: Даны натуральное число n, целые числа x 1 , ..., x n (все числа попарно различны). Поменять местами наибольший и...

8
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
26.05.2015, 06:42
SanchO-SEK, так сразу и не скажешь, как Вам сделать правильно. Тут много тонкостей. Может Вам стоит попробовать framework? И по аналогии сможете у себя сделать...
1
 Аватар для SanchO-SEK
61 / 23 / 7
Регистрация: 22.05.2012
Сообщений: 89
26.05.2015, 07:07  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
SanchO-SEK, так сразу и не скажешь, как Вам сделать правильно. Тут много тонкостей. Может Вам стоит попробовать framework? И по аналогии сможете у себя сделать...
Не хотелось бы работать с фреймворками! Надо бы еще покопошиться в кодах таких продуктов, как, например, phpBB, InstantCMS и т.д. и т.п. - их авторы гораздо более профессиональней, чем авторы скриптов на свалках типа visavi.net!..
А тем временем надеюсь, здесь будут еще ответы Спасибо за внимание!
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
26.05.2015, 07:11
Цитата Сообщение от SanchO-SEK Посмотреть сообщение
их авторы гораздо более профессиональней, чем авторы скриптов на свалках типа visavi.net
Так, а кто спорит? Или Вы думаете, что framework'и берутся с visavi.net? Сильно ошибаетесь.
Если не хотите пока с framework знакомиться - можете почитать для начала о MVC. Потом быстро выйдите на путь истинный.
1
 Аватар для SanchO-SEK
61 / 23 / 7
Регистрация: 22.05.2012
Сообщений: 89
26.05.2015, 07:29  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
Так, а кто спорит? Или Вы думаете, что framework'и берутся с visavi.net? Сильно ошибаетесь.
Я имел ввиду то, что в скриптах с визави настолько ужасный код, что ничему хорошему по нему не научишься

Цитата Сообщение от Para bellum Посмотреть сообщение
Если не хотите пока с framework знакомиться - можете почитать для начала о MVC.
Читал однажды, но очень поверхностно, и единственное, чему научился в тот момент, это использовать шаблонизатор. Благодаря только ему (не используя идею MVC в полной мере) уже стало удобней работать (верстальщикам проще стало писать шаблоны скриптов, а мне проще приделать их к программному коду).
Так-с, тогда надо будет погрузиться в литературу по MVC для более глубокого знакомства. В этом вопросе Google мне в помощь!
Большое спасибо за совет, но вопрос еще не закрыт!
0
Заблокирован
26.05.2015, 11:42
Можно делать "если ошибка, то выход; если ошибка, то выход; ...". Такой вариант хорошо подходит, если вы перед выходом сохраняете информацию об ошибке и делаете перенаправление, чтобы потом эту ошибку "оформить", как следует. Если "оформить" ошибку нужно в рамках обработки текущего запроса, то используете вложенные ветвления. Например:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
 
$warning='';
 
if (OK)
{
  if (OK)
  {
    ...
  }
  else $warning='Ошибка #2';
}
else $warning='Ошибка #1';
 
?><?= $warning ?>
Если может быть накоплено несколько ошибок (для этого опять-таки используется простая последовательная схема, о которой я писала в самом начале), то накапливайте их в массиве ($warning[]='Ошибка'), а потом выводите в цикле, или просто используйте конкатенацию, если вам так удобнее (например, когда не нужно обрамлять сообщения об ошибке какими-то дополнительными тегами при выводе).
1
365 / 372 / 89
Регистрация: 01.12.2013
Сообщений: 1,629
26.05.2015, 18:20
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function error($error) {
        $page = '<!DOCTYPE html><html><head><title>Ошибка</title><meta charset="UTF-8"></head><body>';
        if (__DEBUG__) {
            $page.='<h3>Ошибка</h3><p>';
            $page.=$error;
            $page.='</p>';
        } else {
            //mail($page, $subject, $mail); // можно мыло админу отправить
            /* посетителю незачем видеть отчеты о наших ошибках */
            $page.='<h3>Непредвиденная ошибка</h3><p>Мы делаем все, чтобы ее устранить. Приносим свои извинения.</p>';
        }
        $page.='</body></html>';
        exit($page);
    }
Цитата Сообщение от SanchO-SEK Посмотреть сообщение
Еще вариант - написать класс, и чтобы его дочерние классы выводили относящиеся к ним ошибки, но этот вариант мне не очень нравится.
а зря

зы мой пример конечно для отлова ошибок программиста, а не кривого ввода пользователя, но этот же принцип можно использовать для пользовательских ошибок. просто делаете спец. страничку для вывода ошибок и подставляете туда конкретные значения. А лучше возьмите фреймворк, потом сможете написать свой..
1
508 / 358 / 13
Регистрация: 12.03.2012
Сообщений: 1,896
26.05.2015, 23:03
Цитата Сообщение от SanchO-SEK Посмотреть сообщение
Есть еще какие-нибудь соображения?
Все очень просто.
Передавать в шаблон объект ОшибкиМодели. Ключи этого объекта будут ОшибкаПоля. ОшибкаПоля будет содержать список ошибок для конкретного поля.

Добавлено через 1 минуту
Цитата Сообщение от SanchO-SEK Посмотреть сообщение
Надо бы еще покопошиться в кодах таких продуктов, как, например, phpBB, InstantCMS и т.д. и т.п. - их авторы гораздо более профессиональней, чем авторы скриптов на свалках типа visavi.net!..
Нет, там такой же отвратительный код.
1
88 / 88 / 34
Регистрация: 22.05.2012
Сообщений: 404
27.05.2015, 21:11
Цитата Сообщение от OnYourLips Посмотреть сообщение
Нет, там такой же отвратительный код.
Отвратительный это даже мягко сказано !!!!
Лучше поройся скажем в Yii2 штука хорошая ( не без изянов есественн. ) но это лучший вариант для начинающих в php ООП.
Цитата Сообщение от SanchO-SEK Посмотреть сообщение
Еще вариант - написать класс, и чтобы его дочерние классы выводили относящиеся к ним ошибки, но этот вариант мне не очень нравится
Это ты зря ООП действительно творит чудеса
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.05.2015, 21:11
Помогаю со студенческими работами здесь

Ужасный, ужасный линукс!!
По требованию начальства установила линукс-мастер на комп. теперь не могу установить к нему принтер самсунг scx-4220. Перепробовала...

Ужасный запоминатель
Помогите составить программу. На форме текстовое поле едит и кнопки запомнить и вывести. Пишешь что-то в текстовом поле потом нажимаешь...

Ужасный шрифт
установил восмерку (так чисто что бы потестировать) но тут начались приколы))))))) сначала (до активации она выглядела очень ужасно)...

Ужасный трабл с флешкой
есть флешка на 8 гигов... я залил туда образ img. он мне стал показывать что мол места там теперь 0. потом я форматнул флешку через винду и...

UAC великий и ужасный
Это какая-то жесть. Систему поставил с нуля пару недель назад. Несколько дней назад UAC решил отключить, ибо достал. Потом узрел целый...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru