О хорошем стиле программирования на PHP

AKoval

Guest
О хорошем стиле программирования на PHP

Прошу прощения за беспокойство.

О себе: программирую уже много лет, от pl1 на ЕС до java.
Сделал несколько динамических сайтов на PHP, но большим спецом в PHP себя не считаю.
Недавно возникла дискуссия с одним специалистом (по крайней мере так он считает).

1. Формирование ссылок href в динамических страницах.
его мнение - все ссылки должны быть указаны полностью, т.е http(s)://....,
мое мнение - все локальные ссылки можно указывать относительно base href, а если они не локальные,
или протокол отличается - то только тогда можно указать полностью. Что доволно легко решается
программно.

2. Навигация по дереву каталогов сайта (имеется в виду использование путей в include, require.
его мнение - все файлы в include/require должны быть описаны с использованием полного пути файловой
системы, т.е. /home/virtua/site.com/var/www/html/inc/abc.php. Так вроде бы легче переносить с одного
сайта на другой, указал в переменной путь к корневой директории сайта и вперед, цепляй ее где нужно.
мое мнение - достаточно знать корневую директорию сайта и плясать от нее, потому что по любому, все
мои скрипты находятся в пределах сайта. Хотя здесь он может быть прав.
3.
его мнение - не должно быть include/require("../../str/script.php"); ни в коем случае.
мое мнение - а почему бы и нет?
4.
его мнение - если есть например необходимость пользователю логиниться для работы с сайтом, то он
каждого ползователя, как я понял, заносит в таблицу users Mysl-а и дает ему права на работу с
базой данных сайта. ну и скрипты потом коннектятся к базе с тем username и userpassword.
мое мнение - а зачем? Может проще создать таблицу пользователей в самой базе данных, а с базой
данных работать с account-ом администратора этой базы. Данные accounta (login/password) хранить
или в закодированном скрипте, или в сктрипте вне сайта, правда тогда при переносе не забыть про него.

Хотелось бы прочитать мнение спецалистов, в чем я неправ.
Попробовал поискать по форуму что нибудь подобное - не получилось.
 

Tor

Новичок
1) мне кажется, прав ты
почему для него удобство при переезде во втором пункте критично, а впервом нет?

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

3) не красиво, согласен

4) я считаю, что к самой базе должно быть минимум пользователей
все остальное следует рализовывать на уровне приложения
 

AKoval

Guest
Автор оригинала: Tor
2) лучше в конфиге задать расположение корня сайта, а потом во всех скриптах к нему цеплять относиительные пути, как мне кажется
Ну естественно, что в конфиге можно это указать. Но ведь я, в принципе, могу эту информацию и в процессе выполнения скрипта узнать из предопределенных переменных, если я не ошибаюсь. Правда, где то прочитал, что там тоже есть подводные камни, но серьезно с этим не копался. Просто в Linux RedHat/FreeBSD/Windows эта информация доступна.
 

Tor

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

Ilya

Новичок
если так рассуждать, то ты можешь и перед каждым подключением к БД объявлять переменные для подключения.
:)
но куда проще один раз указать их в конфиге
 

Кром

Новичок
1.
В php.ini ставим session.use_trans_sid = 1 в скрипте пишем:
<?
session_start();
?>
<a href="http://localhost/some_file.php">global link</a>
<a href="some_file.php?PHPSESSID=8bf32oqicc6ridi0u0lonl12k4">local link</a>

Что получается, SESSIONID не добавлятеся к глобальным ссылкам, даже в пределах своего домена.
Вывод, думаю, понятен.

2.
>все файлы в include/require должны быть описаны с использованием полного пути файловой
системы
Правильно. См. ниже.

3.
>не должно быть include/require("../../str/script.php"); ни в коем случае.
Правильно. В противном случае, это постоянный истчник нелепых ошибок, особенно при изменении и/или перемещении скрипта в файловом дереве.

4.
>каждого ползователя, как я понял, заносит в таблицу users Mysl-а и дает ему права на работу с
базой данных сайта. ну и скрипты потом коннектятся к базе с тем username и userpassword.

В основном это может быть оправдано только в интранет системах или в корпоративных порталах.
При этом, если пароли всех mysql пользователей (как админа, так и веб-пользователя) лежат в одном файлике, доступном mysql_query(), защита построенная на таком уровне превращается в фикцию.
 

AKoval

Guest
Автор оригинала: Кром
1.
В php.ini ставим session.use_trans_sid = 1 в скрипте пишем:
<?
session_start();
?>
<a href="http://localhost/some_file.php">global link</a>
<a href="some_file.php?PHPSESSID=8bf32oqicc6ridi0u0lonl12k4">local link</a>

Что получается, SESSIONID не добавлятеся к глобальным ссылкам, даже в пределах своего домена.
Вывод, думаю, понятен.
Понял, но я имел в виду, что ссылки я формирую программно и, поэтому там же и вписываю значение PHPSESSID, если нужно.
А можно поинтересоваться, что значит в пределах одного домена: т.е. если я ссылаюсь из a.site.com на b.site.com, то в этом случае я могу пользрваться старой сессией?
 

Mufasa_King

Guest
1. Однозначно относительные. При указании абсолютных ссылок достаточно перенести корневой каталог скрипта, чтобы пришлось указывать новый адрес скриптов. Конечно, сменить его нетрудно, если он изначально указывается в конфиге, но, согласитесь, к чему лишний геморрой, когда всё можно сделать проще.

4. Я считаю, что на сайте помимо авторизации обязательно должна быть регистрация с последующим хранением аккаунтов в б/д или же в текстовых файлах, что, согласитесь, удобнее, нежели хранение данных каком-то закодированном скрипте, на каком-то хосте.

Аналогично, по второму и третьему пунктам я согласен с товарищем AKoval'ем. Быть может, ни вы, ни я ещё не постигли ДАО правильного кодинга, однако "Правильно - не значит сложно." (с).
 

Kelkos

Сам себе программер
1. На мой взгляд на локальный адрес ссылки лучше начинать с "/" типа /index.php?a=2 (это оч. удобно, т.к. "/" означает путь от корня сайта)
2. хм. намучался я с этим. ох намучился. когда сначала сайт делается на одном хостинге.. потом показывается на другом.. потом переносится на третий и плюс к этому часто является то доменом 3-го уровня.. то 2-го.. Оказалось проще указывать относительный путь в корень ЭТОГО сайта. типа $rootpath='../'; и плясать от него. Пусть его запихивают куда угодно. Да и часто помогает запускать инициализатор сайта из скрипта, который "где то в глубине каталогов". Иногда это намного проще, чем везде прописывать полные пути типа /home/virtua/site.com/var/www/html/inc/abc.php.
3. см. пункт 2.
4. согласен с Кромоом. У нас так и сделано.
 

Breeze

goshogun
Команда форума
Партнер клуба
Иногда это намного проще, чем везде прописывать полные пути типа /home/virtua/site.com/var/www/html/inc/abc.php
ох как трудно сделать в конфиге

define("ROOT_PATH","/home/virtua/site.com/var/www/html");
 

Breeze

goshogun
Команда форума
Партнер клуба
Donald

который очень часто бесполезен.. и не у всех уеб-серверов он есть
 

_RVK_

Новичок
который очень часто бесполезен.. и не у всех уеб-серверов он есть
Не забываем что глобальные массивы не ридонли, посему никто не помешает записать в него свое значение. Личто я делаю так:
define('DOC_ROOT',$_SERVER['DOCUMENT_ROOT']);

если необходимо, я всегда могу переопределить константу.
AKoval
Ты прав в первом и 4-м пункте. Так что у вас нечья :)
 

Кром

Новичок
>Аналогично, по второму и третьему пунктам я согласен с товарищем AKoval'ем

>Иногда это намного проще, чем везде прописывать полные пути типа /home/virtua/site.com/var/www/html/inc/abc.php.

Всем, до кого еще не доходит по поводу пункта 2 и 3, объясняю.

Во-первых: PHP FAQ: Различие между абсолютными и относительными путями. В файловой системе и на сайте.

Во-вторых. Все эти нелепые примеры на тему "хм. намучался я с этим. ох намучился" никакого отношения к тому, как указывать пути, не имеют. Это проблемы кривых рук.
И решается это простым созданием двух констант, с серверным путем к сайту и web-путем. Т.е. писать нужно не так:
$path = '/home/virtua/site.com/var/www/html/inc/abc.php';
а так
$path = SERVER_PATH.'inc/abc.php'
а еще лучше офрмить это в функцию, чтобы не париться со слешами:
get_serv_path('inc/abc.php');
и
get_web_path('inc/abc.php');

SERVER_PATH и WEB_PATH настроить один раз в конфиге и изменять при переезде на другой сервер только в одном месте. Причем, никакого труда не составляет сделать так чтобы эти константы определялись динамически.
 

Kelkos

Сам себе программер
Самый хороший стиль - это когда без ошибок всё работает
А реализация... ну.. на мой взгляд каждому (даже крутому программеру) стыдно показывать свой код другим людям. Обязательно кто нить начнёт тыкать пальцем и удивляться - почему это ты пишешь так.. а не так.. и долго объяснять ЧТО ПРОСТО ПРИВЫК ПИСАТЬ ТАК..
 
Сверху