Дизайн сайта на сайте/материалы завалю


Я действительно не есть какие-то конкретные вопросы по этой теме. Я работаю недавно на независимый проект и узнали все из интернета. Только вчера мне стало известно о шаблоны и идею отделения Деловой и презентационной логики.

Я был бы очень благодарен за любые комментарии по поводу возможного повторного factorings, уязвимостей, улучшена философии дизайна и т. д. Цель этой ветки-в основном для проверки и убедиться, что мой текущий дизайн и методология звук.

index.php

<?php
require('db.php');

$resultsPerPage = 15;
$submissionCount = mysql_num_rows(mysql_query("SELECT id FROM $submissionsTableName"));
$pageCount = ceil($submissionCount / $resultsPerPage);

if (isset($_GET['sort']))
    if ($_GET['sort'] == 'hot' || $_GET['sort'] == 'new' || $_GET['sort'] == 'top')
        $sort = $_GET['sort'];
    else
        header('Location: 404.php');
else
    $sort = 'hot';

switch ($sort) {
    case 'hot':
        $sortAlgorithm = 'submissions.id * (submissions.upvote - submissions.downvote)';
        break;
    case 'new':
        $sortAlgorithm = 'submissions.id';
        break;
    case 'top':
        $sortAlgorithm = '(submissions.upvote - submissions.downvote)';
        break;
}

if (isset($_GET['page']))
    if ($_GET['page'] <= $pageCount && $_GET['page'] >= 1)
        $page = $_GET['page'];
    else
        header('Location: 404.php');
else
    $page = 1;

$startRow = ($page - 1) * $resultsPerPage;

if (isset($_GET['search'])) {
    $searchArgs = explode(' ', $_GET['search']);
    $argCount = count($searchArgs);
    $searchSQL = '\'' . $searchArgs[0] . '\'';

    for ($i = 1; $i < $argCount; $i++) {
        $searchSQL .= ', \'' . $searchArgs[$i] . '\'';
    }

    $submissionQuery = mysql_query("SELECT submissions.* FROM submissions, tags, tagmap WHERE tagmap.tagID = tags.id AND (tags.text IN ($searchSQL)) AND submissions.id = tagmap.submissionID ORDER BY $sortAlgorithm DESC LIMIT $startRow, $resultsPerPage");
} else {
    $submissionQuery = mysql_query("SELECT id, category, title, author, date, upvote, downvote FROM $submissionsTableName ORDER BY $sortAlgorithm DESC LIMIT $startRow, $resultsPerPage");
}

$outcomeCount = mysql_num_rows($submissionQuery);

$submissions = array();
while ($row = mysql_fetch_assoc($submissionQuery)) {    
    $upvote = "upvote";
    $downvote = "downvote";
    $rowIP = $_SERVER['REMOTE_ADDR'];
    $userIPRow = mysql_fetch_assoc(mysql_query("SELECT type FROM $votingIPsTableName WHERE submissionID = $row[id] AND commentID = 0 AND IPAddress = '$rowIP'"));

    if ($userIPRow['type'] == 'upvote active')
        $upvote = 'upvote active';
    else if ($userIPRow['type'] == 'downvote active')
        $downvote = 'downvote active';
    $votes = $row['upvote'] - $row['downvote'];

    $tagsQuery = mysql_query("SELECT tags.text FROM tags INNER JOIN tagmap ON tags.id = tagmap.tagID WHERE tagmap.submissionID = $row[id]");
    $tags = array();
    while ($tag = mysql_fetch_assoc($tagsQuery)) {
        $tags[] = $tag['text'];
    }

    $commentsQuery = mysql_query("SELECT id FROM $commentsTableName WHERE submissionID = $row[id]");
    $commentCount = mysql_num_rows($commentsQuery);

    $submissions[] = array('submission' => $row, 'upvote' => $upvote, 'votes' => $votes, 'downvote' => $downvote, 'tags' => $tags, 'commentCount' => $commentCount);
}

// Divider

$index_view = new Template('index_view.php', array(
    'header' => new Template('header.php'),
    'menu' => new Template('menu.php'),
    'submissions' => new Template('submissions.php', array('submissions' => $submissions)),
    'pagination' => new Template('pagination.php', array('page' => $page,   'pageCount' => $pageCount, 'resultsPerPage' => $resultsPerPage, 'outcomeCount' => $outcomeCount, 'submissionCount' => $submissionCount, 'sort' => $sort)),
    'footer' => new Template('footer.php')
));

$index_view->render();
?>

submissions.php

<div id="submissions">
    <?php foreach ($this->submissions as $row): ?>
        <div class="submission" id="submission<?php echo $row['submission']['id']; ?>">
            <div class="voteblock">
                <a class="<?php echo $row['upvote']; ?>" title="Upvote"></a>
                <div class="votes"><?php echo $row['votes']; ?></div>
                <a class="<?php echo $row['downvote']; ?>" title="Downvote"></a>
            </div>
            <div class="submissionblock">
                <h3><a href="s/<?php echo $row['submission']['id']; ?>.php"><?php echo $row['submission']['title']; ?></a> (<?php echo $row['submission']['category']; ?>) - <?php echo $row['commentCount']; ?> comments</h3>
                <div class="tags">
                    <?php
                    foreach ($row['tags'] as $tag):
                        echo $tag . ' ';
                    endforeach;
                    ?>
                </div>
                <span class="date"><?php echo $row['submission']['date']; ?></span> by 
                <span class="author"><?php echo $row['submission']['author']; ?></span>
            </div>
        </div>
    <?php endforeach; ?>
</div>

index_view.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Website</title>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <link href="styles.css" rel="stylesheet" type="text/css"/>
        <link href="favicon.png" rel="shortcut icon" />
    </head>
    <body>
        <?php
        $this->header->render();
        $this->menu->render();
        $this->submissions->render();
        $this->pagination->render();
        $this->footer->render();
        ?>

        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
        <script type="text/javascript" src="vote.js"></script>
        <script type="text/javascript" src="prettydate.js"></script>
    </body>
</html>


1037
4
php
задан 2 апреля 2011 в 05:04 Источник Поделиться
Комментарии
2 ответа

Ну, это хорошо, что ты это придумала. И вы определенно движемся в правильном направлении. Ваш код вроде бы нормально, но все равно не очень четкий и не очень структурированный. Попробуйте организовать свой код в классы или меньше функций. Е. Г. это:

if (isset($_GET['sort']))
if ($_GET['sort'] == 'hot' || $_GET['sort'] == 'new' || $_GET['sort'] == 'top')
$sort = $_GET['sort'];
else
header('Location: 404.php');
else
$sort = 'hot';

switch ($sort) {
case 'hot':
$sortAlgorithm = 'submissions.id * (submissions.upvote - submissions.downvote)';
break;
case 'new':
$sortAlgorithm = 'submissions.id';
break;
case 'top':
$sortAlgorithm = '(submissions.upvote - submissions.downvote)';
break;
}

Должны быть в функции get_sort_algorith(), или даже в классе запрос, или его подкласса. Это может показаться бесполезным сейчас, но кода в функции или класса облегчает отладку и делает это повторно использовать код в другой части проекта.

Вы слышали/пробовали какой-либо фреймворков MVC и/или о MVC шаблон проектирования? Этот шаблон описывает разделения кода на модель (=данных и доступ к базе), посмотреть (=HTML-шаблоны) и контроллер (код, который манипулирует данными и звонки просмотров за выход).

Вот некоторые полезные ссылки, которые могут помочь вам:

Некоторые другие заметки:

header('Location: 404.php');

Это, вероятно, не дать вам то, чего вы хотите. Этот Волд быть 301 редирект, а не ошибка 404. Вам лучше использовать заголовок (префикс"HTTP/1.0 404 не найден"); и настроить свой сервер на карте ошибка 404 К 404.php. В Apache это можно сделать с ErrorDocument 404 /404.php

if (isset($_GET['search'])) {
$searchArgs = explode(' ', $_GET['search']);
$argCount = count($searchArgs);
$searchSQL = '\'' . $searchArgs[0] . '\'';

for ($i = 1; $i < $argCount; $i++) {
$searchSQL .= ', \'' . $searchArgs[$i] . '\'';
}

Вот SQL-инъекций. Предположим, что будет, если кто-нибудь сделает запрос в поиск='; удалить таблицу пользователей. Всегда сбежать от того, что вы получаете из вне вашего приложения.

7
ответ дан 2 апреля 2011 в 08:04 Источник Поделиться

Использовать SQL обязательны

Добавка к выше ответ, смотрим в SQL обязательны. После прохождения цикла обучения себя (беспрепятственный вход пользователя в SQL, то SQL побега, и, наконец, в SQL обязательны), ни один из первых двух должны быть использованы для все, что касается ввода пользователя, а затем переходит к любой базе данных, которая вам нравится. На всех.

Другими словами, чем раньше вы начнете использовать связывание с SQL, тем лучше вы будете.
ПДО ( http://php.net/manual/en/book.pdo.php ) является то, что вы хотите получить немного знаком с, но э-э, API, я думаю, для ПДО является довольно сложным, так что я сделал реализуется оболочку, которая позволяет мне работать так:

$датум = query_item('выберите ID от пользователей, где user_id = :ИД', массив ('идентификатор'=>5));
$row_array = query_row('выберите * из пользователей, где user_id = :ИД', массив ('идентификатор'=>5));
$iterable_resultset = запрос (выбрать * из пользователей, где user_id = :ИД', массив ('идентификатор'=>5));

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

Функции частично основаны на вот код:

https://github.com/tchalvak/ninjawars/blob/master/deploy/lib/data/lib_db.php

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

Использование шаблонов принципов

Одна вещь, я заметил, что с вашим кодом (submissions.php и index_view.php например), что вы используете голый PHP в HTML-код. Что будет, как правило, получить сложнее, когда вы в конечном итоге с помощью трех или четырех языках/принципы (на PHP, HTML и JavaScript, CSS) в той же странице. Позвольте мне сказать вам, что код, который я ненавижу, кода меня коробит, когда я вижу, мне придется отлаживать его, это код JavaScript с PHP вперемешку с HTML-страницы работа с CSS. То, что вы хотите работать, разделение интересов. Когда дело доходит до PHP, так что понимание и использование преимуществ, что, по крайней мере, если вы новичок в PHP, будет значительно увеличена с помощью шаблона двигатель на некоторое время, по крайней мере, пока вы не понимаете в PHP достаточно, чтобы решить, когда и хотите ли вы, чтобы пропустить шаблонов агента.

1/4 в пользу шаблонизатор будет упрощенный синтаксис, и 3/4 пособие будет разделение. Используя паттерн MVC, который @РВС упомянул, дает аналогичные возможности, но знакомство с шаблонизатором библиотека будет полезно, если вы в конечном итоге делает очистку на чужой код и не могу полностью переписать существующую систему (история моей жизни как PHP разработчик).

Поэтому я предлагаю знакомство с Smarty ( http://www.smarty.net/ ). В начале следует просто включить Смарти как Либ в проектах с использованием шаблонов.

Вместо шаблонизатора

Предположим, вы не хотите попасть в сложности шаблонизаторов и синтаксис шаблонизатора на данный момент, Вы все равно должны добиваться разделения проблем. Простой способ сделать это в PHP-это просто избегать любой PHP, кроме эхо в HTML. Делаю все по вашей логике -вне - вашего HTML, и просто передавать переменные в эхо или перебрать и тогда Эхо В где-нибудь в HTML-код. Это сделает ваш PHP-код и HTML-код гораздо проще для отладки и гораздо легче редизайн.

В SQL связывания и разделения проблем, это самые большие вещи, которые я узнал, сделать свою жизнь проще при разработке на PHP.

1
ответ дан 7 апреля 2011 в 03:04 Источник Поделиться