Реалии php && html

NeverMore

Новичок
Реалии php && html

В который раз сталкиваюсь с проблеммой, как необходимо правильно:
1) генерировать весь html код с помощью php функций и в конце выводить всё через один echo или использовать для вывода чистый html.
Приведу 2 примера, что бы вникнуть в суть проблеммы:

-----------Вариант № 1. Используем чистый php-----------
PHP:
<?php
//Необходимые функции

/**
 * Представление ошибки
 *
 * @param описание ошибки $text
 * @return представление
 */

function showError($text) {
    return '<div class="error">' . $text . '</div>';
}

/**
 * Фильтруем строку на xss и sql
 *
 * @param строка $text
 * @return фильтрованная строка
 */
function filterString($text) {
    return mysql_escape_string(strip_tags($_COOKIE['name']));
}

//Инициализация

$name = filterString($_COOKIE['name']);
$pass = filterString($_COOKIE['pass']);

//Сборка странички

$r .= '<div class="head"></div>
    <div class="wrap">';

$users = mysql_query('SELECT * FROM users WHERE name = "' . $name . '" AND password = "' . $pass . '"');
if (mysql_num_rows($user) == 0) {
    
    $r .= showError('Для просмотра данной страницы необходима регистрация');
    
} else {
    $name = stripslashes($name);
    
    $r .= '
        <div class="userShow">
            <p>Добро пожаловать, ' . $name .'</p>
        </div>';
}

$r .= '</div><!--end wrap-->';

//Вывод
echo $r;
----------Вариант № 2. Используем php с вставками html-----------

PHP:
<?php
//Необходимые функции

/**
 * Фильтруем строку на xss и sql
 *
 * @param строка $text
 * @return фильтрованная строка
 */
function filterString($text) {
    return mysql_escape_string(strip_tags($_COOKIE['name']));
}

//Инициализация

$name = filterString($_COOKIE['name']);
$pass = filterString($_COOKIE['pass']);
<div class="head"></div>
<div class="wrap">

PHP:
<?php
$users = mysql_query('SELECT * FROM users WHERE name = "' . $name . '" AND password = "' . $pass . '"');
if (mysql_num_rows($user) == 0) {
<div class="error">Для просмотра данной страницы необходима регистрация</div>

PHP:
<?php
} else {
    $name = stripslashes($name);
<div class="userShow">
<p>Добро пожаловать,

PHP:
<?php echo <?php    
    }
</div><!--end wrap-->
 

NeverMore

Новичок
Да, о шаблонизаторах и о Smarty я уже наслышан, и писал свой. Но проблемма в том, что в любом случае написать функцию без html тегов проблемматично.
Тогда нужны уже подшаблоны например как в моем примере для обработки ошибок.
Или вставлять прямо в шаблон эту часть? :(
<? if ($error) { ?>
<div class="error"><? echo $error; ?></div>
<? } ?>
 

Фанат

oncle terrible
Команда форума
Хехе, какой чудесный клиент пожаловал. Свеженький, розовенький!
тут тебе и filterString, и stripslashes($name);
ну, и сам вопрос, конечно.

NeverMore
Если не брать в расчет неверную постановку самого вопроса, то вариант номер два.
Но было бы сильно лушче, если бы ты привел здесь код, не вызывающий ошибок синтаксиса.

triumvirat, не имеет смысла давать ссылки, объясняющие КАК сделать, если человек не понимает, ЧТО надо сделать.

NeverMore, правильный ответ такой:
3) вывод делается в шаблоне.
Скрипт разделен на две логические части - получение информации, и её вывод.
Во время получения никакого вывода, ни одной строчки.
После этого - выводим. Способов очень много, но один из самых удобных - тот, который у тебя под номером 2
часто удобно вынести вывод в отдельный файл.

-~{}~ 15.12.08 13:57:

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

NeverMore

Новичок
Автор оригинала: *****
Хехе, какой чудесный клиент пожаловал. Свеженький, розовенький!
тут тебе и filterString, и stripslashes($name);
ну, и сам вопрос, конечно.

NeverMore
Если не брать в расчет неверную постановку самого вопроса, то вариант номер два.
Но было бы сильно лушче, если бы ты привел здесь код, не вызывающих ошибок синтаксиса.

triumvirat, не имеет смысла давать ссылки, объясняющие КАК сделать, если человек не понимает, ЧТО надо сделать.

NeverMore, правильный ответ такой:
3) вывод делается в шаблоне.
Скрипт разделен на две логические части - получение информации, и её вывод.
Во время получения никакого вывода, ни одной строчки.
После этого - выводим. Способов очень много, но один из самых удобных - тот, который у тебя под номером 2
часто удобно вынести вывод в отдельный файл.

-~{}~ 15.12.08 13:57:


проблема в том, что ты никогда не задумывался, зачем тебе вообще нужен шаблон. Если задумаешься, то ответы найдутся сами собой.
Код набросан на коленке только для того, что бы понять что я имею ввиду. Да и обернуть его в теги
PHP:
удачно не получилось.
Я месяц назад для себя уже реализовал шаблонизатор, но когда начал переписывать все функции вывода под шаблоны, да и повнимательнее ознакомился с MVC архитектурой таких фреймворков, как Zend и Symfony стал вопрос: как ПРАВИЛЬНО делать. Я так понимаю из вашего поста что правильно - полностью отделять логику от представления (возможно даже в разные файлы).
p.s.
А чем вас не устраивает название функции filterString и stripslashes? Может посдкажете более грамотную реализацию?
В том же punBB есть аналогичные функции для фильтрации XSS и SQL injection.
 

Фанат

oncle terrible
Команда форума
Код набросан на коленке
Это очень большая проблема.
Нельзя решать реальные задачи нереальным кодом. Нереальный пример не принесет пользы. Надо взять ту задачу, которую решал месяц назад, и работать с ней.
полностью отделять логику от представления
поправка. очень важная. правильно - отделять логику получения данных от логики представления.
А чем вас не устраивает название функции filterString и stripslashes?
не название, а содержимое.
stripslashes здесь вообще лишняя, а filterstring не имеет смысла.
должно быть две функции - quote_sql, для помещения параметров в запрос, и quote_html, для очистки текста. Эти две функции выполняют совершенно разные, никак не связанные между собой операции. Они могут пересекаться, но не настолько часто, чтобы писать их в одной функции.
 

NeverMore

Новичок
Автор оригинала: *****
Это очень большая проблема.
Нельзя решать реальные задачи нереальным кодом. Нереальный пример не принесет пользы. Надо взять ту задачу, которую решал месяц назад, и работать с ней.

поправка. очень важная. правильно - отделять логику получения данных от логики представления.

не название, а содержимое.
stripslashes здесь вообще лишняя, а filterstring не имеет смысла.
должно быть две функции - quote_sql, для помещения параметров в запрос, и quote_html, для очистки текста. Эти две функции выполняют совершенно разные, никак не связанные между собой операции. Они могут пересекаться, но не настолько часто, чтобы писать их в одной функции.
Вопрос по логике получения данных:
Постоянно необходимо фильтровать полученные $_GET и $_POST данные. В каком виде их передавать?
1) переменные с уникальным указателем типа $getObjectName , $postUnicalPrefix (что бы было понятно откуда)
$getObjectName = intval(abs($_GET['objectName']));

2) переменные, как они представляются при register_globals on (
$objectName = intval(abs($_GET['objectName']));
$unicalPrefix = intval(abs($_POST['unicalPrefix']));
)
3) Оперировать переменными прямо из массива $_GET['objectName'] = intval(abs($_GET['objectName']));
p.s.
Наверное лучше написать и использовать функцию типа
function intAbs($a) { return intval(abs($a)); }
для таких случаев

ну и вопрос по представлению:
Когда у меня накапливается большое количество шаблонов, для всех я использую единый css файл. В результате он весит под 120 кбайт
и подключается даже в тех шаблонах, где используется около 4-6 селекторов. Как с этим бороться? создавать много мини css файлов и 1 общий, или использовать динамическую генерацию css ( с помощью php )
 

Фанат

oncle terrible
Команда форума
Постоянно необходимо фильтровать
конкретнее. зачем фильтровать? что конкретно фильтровать?
В каком виде их передавать?
да в каком хочешь. как тебе удобнее.
разницу между способами 1 и 2 не уловил.
при чем здесь register_globals - не понял.

зачем делать intval после abs, тоже осталось для меня загадкой.

вопрос про CSS вообще непонятно, какое отношение имеет к шаблонам и к PHP.
 

NeverMore

Новичок
Автор оригинала: *****
конкретнее. зачем фильтровать? что конкретно фильтровать?

да в каком хочешь. как тебе удобнее.
разницу между способами 1 и 2 не уловил.
при чем здесь register_globals - не понял.

зачем делать intval после abs, тоже осталось для меня загадкой.

вопрос про CSS вообще непонятно, какое отношение имеет к шаблонам и к PHP.
1) фильтровать id номера товара например , передаваемого как параметр через GET или POST
перед тем как доставать о нем информацию
$id = intval($id);
mysql_query('SELECT * FROM products WHERE id = ' . $id );
2) шаблон не будет выглядеть так, как нам необходимо без использования css.
Вот и вопрос: генерировать css в зависимости от шаблона с помощью php, вставлять css стили прямо в шаблон или
делать отдельный css файл для каждого шаблона.
 

Фанат

oncle terrible
Команда форума
В п.1 мы ничего не фильтруем. А приводим запрос в соотвествие с синтаксисом языка. И GET и POST здесь не при чем вообще.

П.2 не имеет отношения к PHP. поищи тематическое сообщество, посвященное HTML
 

Духовность™

Продвинутый новичок
NeverMore
да успокойся ты со своим CSS, он один раз загрузится, остальное время из кэша броузера будет браться.
 
Сверху