LINUX.ORG.RU

Поругайте код

 


0

2

Суть - маленькая никому не нужная типа гостевая книжка для тыканья на локалхосте. Написано на основе кода из книги, так что интересует вопрос - что там можно подправить во имя луны? Также вопрос по post.php - если при отправке формы оставить поля пустыми - то в базу будут внесены пустые строки. Как исправить? Проверка !isset($_POST) по полям user и message не срабатывает.

Архив

★★★★

делай гист, какие архивы в 2016?

kelyar ★★★★★
()
Ответ на: комментарий от Valkeru

Суть в том что пыхокод как ты его называешь сплошная дыра пока ты используешь mysql.

Переделай под PDO с try и catch.

Это азы.

Проверку делай if(empty($чётотам)){код}

VictimOfLoveToLinux
()
Ответ на: комментарий от Valkeru

Когда-то оно будет лежать на доступном с интернетов хосте, и я там зарегаюсь :)

JN
()
Ответ на: комментарий от Valkeru

Серьезно, загугли книжку 15 года. У меня была хорошая но я отдал не смогу подсказать название.

В ПХП нельзя учится по олдскул книжкам, учись сразу по современникам.

VictimOfLoveToLinux
()
Ответ на: комментарий от VictimOfLoveToLinux

if(empty($_POST['login'] && $_POST['pass'])){

Что-то в этой конструкции не так.

Deleted
()
Ответ на: комментарий от Valkeru

А! У тебя там текст, значит слушай сюда.

//стартуем сессию
session_start();
//тут короче чистим текст от тегов
$USER_MESSAGE = strip_tags($_POST['message']);
$USER_NAME = strip_tags($_POST['name']);
//начинаем хранить это дело в сессии 
$_SESSION['message'] = $USER_MESSAGE;
$_SESSION['name'] = $USER_NAME;

//тут геты для страницы с формой чтобы на странице горела ошибка
//лучше конечно записать сразу в сессию, и читать от туда раз мы уж её открыли
//но у нас всё по хардкору же
$BACK_URL_TEXT = 'form.php?err=NO_TEXT';
$BACK_URL_NAME = 'form.php?err=NO_NAME';

if(empty($USER_MESSAGE)){
 echo 'Вы не ввели сообщение, сейчас вас перенаправит обратно.';
 header("Refresh: 2; URL=$BACK_URL_TEXT");
 die();}

if(empty($USER_NAME)){
 echo 'Вы не представились, сейчас вас перенаправит обратно.';
 header("Refresh: 2; URL=$BACK_URL_NAME");
 die();}

ну и на странице с формой так же включаем сессию и проверяем наличие переменных текст и имя в них если они есть запихиваем это всё дело в инпуты в var и требуем от юзера ввести то что он не ввёл

а вообще лучше использовать аякс и http://htmlbook.ru/html/input/required

VictimOfLoveToLinux
()
Последнее исправление: VictimOfLoveToLinux (всего исправлений: 1)

Расширение mysql было объявлено устаревшим в какой-то из 5.x.x версий. В PHP 7 вообще удалено. Т.е. твой код на последней версии PHP работать не будет. Используй PDO или mysqli.

Всякие мелочи:

  • Ужасное форматирование. Лишние пустые строки, табы как для отступов, так и для выравнивания.
  • ?> в конце файла писать не принято. Принято иметь пустую строку.
  • Комментарии. Зачем? В таком виде не нужно. И без них понятно, что там происходит.
  • Имена переменных $a, $b и т.д. Они же ни о чём не говорят. Не надо так.

Короче, гугли PSR, описывающие рекомендации по оформлению PHP кода.

Вот так делать не рекомендуется:

or die('Ошибка! ' . mysql_error())
Пиши ошибку в лог, хотя бы с помощью error_log, а юзеру отдавай 500-ку. Сообщение потом найдёшь в логах веб-сервера. Можно конечно и просто в файл записать или библиотеку для логгирования прикрутить. Тут уже на твоё усмотрение.

echo "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp";

Странное решение мягко говоря. Да и к тому же не понимаю, почему оно у тебя работает. Ведь работает же?   вроде должно быть, не?

else $page = $_GET['page'];

//Индекс первого сообщения для вывода на странице
$msg = $page * $cnum;

А тут кажется забыли про intval

$cnum = 4;	//Комментов на страницу

Можно было бы просто назвать переменную $itemsPerPage например. Тогда и комментарий не нужен будет.

Атрибуты тегов в html должны быть заключены в кавычки. Т.е. вместо:

<body bgcolor = green>

Лучше написать:

<body bgcolor="green">

В данном случае лучше будет даже так:

<body style="background-color: green">
А ещё лучше в отдельный css файл стили вынести.

Там ёщё много всякого. Мне дальше лень писать просто.

PS: Рекомендую ознакомиться с материалом по этой ссылке: http://www.phptherightway.com/

Kilte ★★★★★
()

Также вопрос по post.php - если при отправке формы оставить поля пустыми - то в базу будут внесены пустые строки. Как исправить? Проверка !isset($_POST) по полям user и message не срабатывает.

man strlen
man mb_strlen
man isset

Kilte ★★★★★
()
Последнее исправление: Kilte (всего исправлений: 1)

php

http://moisuper.sait/ska4at-besplatno-gostevuha.tar.gz

Покритиковал.

Написано на основе кода из книги

Мне всегда казалось, что у пхп сносная официальная документация (для такого высера вместо яп), зачем жрать говно вроде «Зделать сайт за 15 минут бызтро СЕО роскрутка сикреты уебмастеров»?

Deleted
()
Ответ на: комментарий от VictimOfLoveToLinux

Абсолютно серьезный вопрос - а в чем преимущества PDO над mysql/i? Насколько я знаю, он помогает абстрагироваться от конкретной СУБД, и на этом мои познания заканчиваются...

l0stparadise ★★★★★
()
Ответ на: комментарий от l0stparadise

Отличается только подход к построению SQL запросов. Всё остальное - это горячечный бред лора, где толпа студентов-обезьян до кровавой пены будет убеждать несчастных новичков юзать свистоперделки, которые нафиг не нужны ни здоровым людям, ни конкретно этому проекту с гостевухой.

Вся фигня в том, что конкретно тот автор выше, который полощет мозги своим PDO, не в теме, что PDO обладает меньшим количеством возможностей драйвера СУБД по сравнению с mysqli и вовсе не освобождает от SQL инъекций даже при наличии подготавливаемых запросов. Не говоря уже о том, что данный персонаж старается насадить в своём воспалённом мозгу рамки по используемому инструментарию для разработки незнакомым людям. Подобные люди - позорище того языка, который они выбрали.

ThisNameWasFree
()
Последнее исправление: ThisNameWasFree (всего исправлений: 4)
Ответ на: комментарий от ThisNameWasFree

PDO обладает меньшим количеством возможностей
не освобождает от SQL инъекций даже при наличии подготавливаемых запросов

Примеры в студию.

isildur
()

Твоя книга видимо из прошлого десятилетия? Прости, но этот код УГ в плане используемых подходов, разве что в принципе читается неплохо, но таки не PSR.

n0044h
()
Ответ на: комментарий от ThisNameWasFree

Расскажи плз, каким образом произвести SQL-Injection используя PDOStatement? Мне правда интересно в проф. целях.

n0044h
()
Ответ на: комментарий от ThisNameWasFree

Ну ты же понимаешь, что эта «атака» очень уж синтетическая. Используя utf8 и более-менее свежую версию PHP, ты скорее всего не будешь уязвим к этой атаке.

n0044h
()
Ответ на: комментарий от n0044h

Багфикс вышел только на PHP 5.3.6, поэтому ещё год-полтора можно смело бить по голове каждого, кто будет заявлять о безопасности PDO.

ThisNameWasFree
()
Последнее исправление: ThisNameWasFree (всего исправлений: 1)
Ответ на: комментарий от ThisNameWasFree

Ну это вопрос к таким хостерам, 5.3 релизнулся 7 лет назад... И да, я не говорю, что PDO обязан все резать к чертям, никто не отменял фильтрацию и валидацию до PDO. Конкретно свою обязанность он выполняет, не больше.

n0044h
()
Ответ на: комментарий от n0044h

И да, я не говорю, что PDO обязан все резать к чертям, никто не отменял фильтрацию и валидацию до PDO. Конкретно свою обязанность он выполняет, не больше.

Я приводил пруфы на фразу «PDO ... вовсе не освобождает от SQL инъекций даже при наличии подготавливаемых запросов». В остальном мне по барабану на выбор между PDO/mysqli. В любом случае ни тот, ни другой вариант в голом виде меня не устраивает и я всё же предлагаю смотреть в сторону человеческих ORM.

ThisNameWasFree
()
Ответ на: комментарий от l0stparadise

Тоже не понимаю в чем прикол городить какие то абстракции вместо обычного sql-запроса\самописной обертки того же запроса. Ну, будет у тебя доступ к разным бд, только один хер все mysql используют )

gobot ★★★★
()
Ответ на: комментарий от ThisNameWasFree

Поддерживаю в этой позиции. Сам использую «голые» PDO и mysqli только ради каких то наколеночных скриптов, не более.

n0044h
()
Ответ на: комментарий от ritsufag

В нормальной ORM можно сконструировать практически любой запрос.

pawnhearts ★★★★★
()
Ответ на: комментарий от l0stparadise

В документации подробно всё разжёвано в принципе. Лично мне нравятся prepared statements, например когда я в цикле хочу вставлять данные и мне не нужно монструозить страшную строку с включением параметров, я могу подготовить её «где то там» и далее параметризовать этот запрос, внутри своего цикла, просто назначая значения для placeholders.

n0044h
()
Ответ на: комментарий от l0stparadise

Скажем так, это такой базовый набор классов для абстракции над БД, который позволяет не писать велосипеды каждый раз, а делать работу.)

n0044h
()
Ответ на: комментарий от ritsufag

Во-первых, не нужно быть голословным и писать шаблонные отмазки. Во-вторых, за все ORM не отвечаю, но конкретно то, с чем имею дело: три года назад умудрился попасть в сопровождение медицинских журналов с офисом в Майами, где околачиваюсь до сих пор, ковыряя десятилетные сорцы и добавляя новую хрень на старое уродство. Один из бывших разрабов, родом из Израиля, перечитал Мартина Фаулера и впёр на основе стратегий Active Record (это байан) и Query Builder (а вот это рекомендую погуглить) зайчатки ORM в проект. На текущий момент я реализовал с нуля идеи этого разраба и впёр в рабочие проекты самопальную ORM на базе драйвера mysqli, которая умеет следующее:

  • 1. Полное экранирование входных данных (аля statement из PDO на стороне сервера).
  • 2. Автогенерация кода на основе существующей таблицы (в сорцах на таблицу, к примеру, users, появляется классы user [Active Record / работа с одним объектом] и users [Query Builder / работа с одним|несколькими объектами] с десятком методов для работы через IDE с автодополнением и прочими плюшками)
  • 3. Полный CRUD и немножно больше (индексы и прочее).
  • 4. Кэш анализатора структуры таблиц.
  • 5. Поддержка почти всех возможных типов данных для MariaDB/MySQL.

Всё это требует для своей работы всего один запрос структуры таблицы (SHOW COLUMNS) единожды для каждой таблицы, которая участвует в запросах к СУБД.

Дополнительная нагрузка на СУБД минимальна (SHOW COLUMNS требует совсем смешные ресурсы если, конечно, вас не укололо докинуть ещё анализатор связей по внешним ключам), но вместо тупого набивание однотипных SQL'ей для чтения\вставки очередной строки изо дня в день каждую неделю можно сразу работать с данными, экономя собственное время и нервы.

ThisNameWasFree
()
Последнее исправление: ThisNameWasFree (всего исправлений: 11)
Ответ на: комментарий от n0044h

Ну то есть строить на нем новые приложения смысл имеет, а переносить что-то уже написанное - бесполезно. Ок, спасибо :)

l0stparadise ★★★★★
()
Ответ на: комментарий от gobot

Мне до понимания далеко, я даже не разработчик, строго говоря :) Просто все чаще вижу рекомендации переезжать на PDO, и хотелось понять, есть ли в PDO что-то, что меня заинтересует перетащить на него свои сайты.

l0stparadise ★★★★★
()
Ответ на: комментарий от Valkeru

гостевая книжка для тыканья на локалхосте
mysql
2016

Предлагаешь данные хранить в текстовых файлах?

Ну sqlite же есть, если уж так хочется ковырять устаревшие подходы.
Комментарии к каждой странице давно победили общие гестбуки.

xtraeft ★★☆☆
()
Ответ на: комментарий от Kilte

?> в конце файла писать не принято. Принято иметь пустую строку.

О, может тут ответят - какой в этом практический смысл?

xtraeft ★★☆☆
()
Ответ на: комментарий от xtraeft

Думаю, после ?> может отказаться пробел или переход строки, и если ты этот файл include`ишь из другого - это переход строки отправится до того, как начнется сессия/куки будут установлены и т.п.. Как-то так.

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

То есть если этот файл гарантировано не инклудится - можно не переживать? Постоянно вижу этот подход в однофайловых скриптах и поэтому не понимаю, есть ли там еще какой то подвох.

Ну или просто не оставлять \n после ?>, нет?

xtraeft ★★☆☆
()
Последнее исправление: xtraeft (всего исправлений: 1)
Ответ на: комментарий от xtraeft

А смысл писать этот ?> в конце? Лучше иметь привычку никогда не писать, чтобы с этим не столкнуться.

не оставлять \n после ?>

Легко не заметить же. И обычно принято иметь \n в конце файла.

pawnhearts ★★★★★
()
Ответ на: комментарий от xtraeft

И ещё - обычно пользуются шаблонизаторами и предпочтительно, чтобы помимо шаблонизатора сам скрипт ничего не выводил.

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

А смысл писать этот ?> в конце? Лучше иметь привычку никогда не писать, чтобы с этим не столкнуться.

Ну привычка например. Ты же синтаксис соблюдаешь языка, чтоб все работало?

Легко не заметить же.

Даже в самом убогом редакторе невозможно не заметить, помоему.

И ещё - обычно пользуются шаблонизаторами и предпочтительно, чтобы помимо шаблонизатора сам скрипт ничего не выводил.

Ну он и не выведет, если нет мусора после ?>

xtraeft ★★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.