Помогите сделать запросы через один файл

malina95

Дракула кода:)
Здравствуйте, я бы хотел спросить как сделать так чтобы как у любого фреймворка или cms был обработчиком всего один файл индекс... Я просто сейчас делаю и делал раньше через несколько файлов и каждый из них выполняет свою работу...но мне хочется чего то нового но без ООП так как для меня ещё рано его учить... Помогите пожалуйста
 

WMix

герр M:)ller
Партнер клуба
достойное желание, но непонятна проблема!
 

malina95

Дракула кода:)
Например сейас страница которая выводит статью по гет запросу такая

PHP:
<?php
	require_once "lib/functions.php";
	if (isset($_GET['art'])) {
		$url = $_GET['art'];
		escapeString($url);
		$table = "articles";
		$pole = "id";
		$article = getArticle($table, $pole, $url);
		$new_view = $article["view"] + 1;
		global $mysqli;
		connectDB();
		$update = $mysqli->query("UPDATE `articles` SET `view` = '$new_view' WHERE `id` = '".$article['id']."'");
		$title = $article['title'];
		$meta_d = $article['meta_d'];
		$meta_k = $article['meta_k'];
		$text = $article['text'];
		$view = $article['view'];
	}	
	require_once "block/meta.php";
	
	echo "<body>";
	
	require_once "block/header.php";
	require_once "block/top_menu.php";
	
	echo "<div id = 'content'>";
	
	require_once "block/left.php";
	require_once "block/right.php";
	
	echo "<div id = 'center'>";
	
	echo $text."<br /><br />Просмотров: ".$view."<br />";
	
	$result = $mysqli->query("SELECT * FROM `comments` WHERE `page_id` = '$url'");
	if($result->num_rows > 0) {
		while ($row = $result->fetch_assoc()) {
			echo $row['name']."<br />";
			echo replaceBBCode($row['comment'])."<hr />";
		}
	}
	require_once "block/comment_form.php";
	echo "</div>
		</div>";
	require_once "block/footer.php";
	echo "</body>
		</html>";
?>
Как реализовать всё в одном файле, и категории и статьи и авторизацию например и т.д.
 

malina95

Дракула кода:)
это идея да я согласен, но как же шаблоны? как их менять в зависимости от запроса гет? может через иф?
например
PHP:
if ($_GET['articles'] == 'all')  {
//выводить все статьи
}
if ($_GET['category'] == '1') {
//выводить все статьи из категории где айди == 1
}
Я правильно мыслю?
 

WMix

герр M:)ller
Партнер клуба
ну если хочешь... тут нет правильно или не правильно...!
я сам не изобретаю велосипед а юзаю фрэймворк
 

malina95

Дракула кода:)
для тех кто знает ООП тем легко... а мне нереально его юзать
 

fixxxer

К.О.
Партнер клуба
Можно и без ООП. Принципы те же - все реквесты валим на index.php и роутим на контроллер (пусть им будет просто файл) и action (пусть это будет функция)

Вот на коленке за 3 минуты например (код не проверял, может и не работать =)

PHP:
// config/routes.php
return array(
     '^/$' => array('controller' => 'index', 'action' => 'default'),
     '^/articles/(?<article_id>\d+)/$' => array('controller' => 'articles', 'action' => 'default'),
     '^/articles/(?<article_id>\d+)/edit/$' => array('controller' => 'articles', 'action' => 'edit'),
);


// lib/router.php
function getRoute($uri = null) {
     static $routes;
     if (!isset($routes)) $routes = include DIR . '/config/routes.php';
     if (!$uri) $uri = strtok($_SERVER['REQUEST_URI'], '?');
     foreach ($routes as $uriRegexp => $routeCfg) {
         if (preg_match('#' . $uriRegexp . '#', $uri, $matches) {
              $routeCfg['args'] = $matches;
              return $routeCfg;
         }
     }
     return null;
}

function getRoute404() {
    return array('controller' => 'error', 'action' => '404', 'args' => array());
}


// index.php
define('DIR', __DIR__);
include DIR . '/lib/router.php';
$route = getRoute();
if (!$route) {
     $route = getRoute404();
}
require_once DIR . '/controllers/' . $route['controller'] . '.php';
call_user_func('controller_' . $route['controller'] . '_' . $route['action'], $route['args']);


// controllers/index.php
function controller_index_default() {
    echo "Hello! I am Index Page!";
}


// controllers/articles.php
function controller_articles_default($args) {
     $articleId = $args['article_id'];
     echo "Viewing article #$articleId";
}

function controller_articles_edit($args) {
     $articleId = $args['article_id'];
     echo "Editing article #$articleId";
}

// controllers/error.php

function controller_error_404() {
    header('HTTP/1.0 404 Not Found');
    echo "404";
}
 

Beavis

Banned
это идея да я согласен, но как же шаблоны? как их менять в зависимости от запроса гет? может через иф?
Это называется Роутинг
Для каждого типа "шаблона", как ты их называешь, должен быть свой action (это может быть просто функция, или метод в классе).
Action'ы группируются в контроллеры. Контроллер может быть просто файлом с несколькими функциями action'ов или классом.

Далее тебе необходимо в зависимости от урла выбрать нужный контроллер и экшн

в самом простом случае можешь передавать их так: /index.php?controller=users&action=register
далее для красоты можно сделать ЧПУ /users/register

а в процессе роутинга разбиваешь запрос на части, первая часть - это контроллер, вторая - action
 

WMix

герр M:)ller
Партнер клуба
malina95
а может просто попробывать понять? прежде чем делать чтото глобальное, ООП проходят на первых 3-5 уроках... мне тоже было сложно понять поначалу... слово класс было магическим но по сути это масив в небольшим функционалом ... там ничего умного... знаю людей которые понимают ооп но не умеют программировать...
программировать сложно, нужен аналитический ум, нужно уметь представлять и считать... ооп это простой набор правил... не понимая ооп сложно писать, даже библиотечку готовую не прилепить...
 

WMix

герр M:)ller
Партнер клуба
это идея да я согласен, но как же шаблоны? как их менять в зависимости от запроса гет?
если с точки зрения MVC но шаблонами управляет контроллер...
request: /index.php?a=xyz-pdf
request: /index.php?a=xyz-html
вызывает различные акции действия (Controller), а они в свою очередь могут использовать одинаковую функцию по сбору данных (Model) но различную по визуализации (View)...
те яб не делал дополнительную переменную для выбора шаблона, или избегал бы...

возможно, есть акция действие по переключению шаблонов, а после выбранный находится в состоянии (Session/State)! как ты это сделаешь решать тебе

поправка
яб не делал дополнительную переменную для выбора шаблона, или избегал бы...
но имено так хранят состояние (непосредственно в URL или куках или в сессии)
 

Фанат

oncle terrible
Команда форума
"идею" WMix я удалил, поскольку чудовищная дыра.

по поводу остального - я бы сначала спросил себя - "зачем?"
если у тебя есть чёткий и конкретный ответ на этот вопрос, то сначала следует определиться - правильно ли ты определил проблему и средство для её решения.
если у тебя нет чёткого и конкретного ответа на этот вопрос, то ничего путного у тебя не получится.
 

Фанат

oncle terrible
Команда форума
Лично я бы предложил заняться совсем другим - внедрением полноценных шаблонов.
Чтобы сначала исполнялся код, а потом уже только начинался вывод. причем ввод был отделен от обработки данных.

Это, на мой взгляд, гораздо важнее, чем запихивать все запросы в один файл.
 

malina95

Дракула кода:)
Я бы сделал так как сказали вы Фанат, но как мне запихнуть цикл в переменную чтобы потом просто выводить? я пробовал по разному а он выводит ошибку... да это и тупо запихивать работу цикла который очень часто и быстро меняеться в переменную... Может подскажите
 

Фанат

oncle terrible
Команда форума
Переменная, которая получается в результате работы цикла, называется "массив"
PHP:
    $data = array();
    $result = $mysqli->query("SELECT * FROM `comments` WHERE `page_id` = '$url'");
    while ($row = $result->fetch_assoc()) {
        foreach($row as $key => $value) {
            $row[$key] = htmlspecialchars($value,ENT_QUOTES);
        }
        $row['comment'] = replaceBBCode($row['comment']);
        $data[] = $row;
    }
В массиве $data у тебя теперь все данные из базы, подготовленные для вывода в HTML.
теперь ты можешь передать её в шаблон, где в цикле вывести.

Глубокомысленное замечание про "тупо запихивать работу цикла" я, с твоего разрешения, оставлю без комментариев.
 

Beavis

Banned
К сожалению, PHP не настолько прогрессивный язык, чтобы позволять запихивать циклы в переменную..
 

craz

Нестандартное звание
а как же
PHP:
$var = function () use (){
}
Или это не то?
 

Фанат

oncle terrible
Команда форума
Кстати.
Ппомнишь, я писал тебе в другом топике, что
сама по себе MySQLI никак безопасности не прибавляет
?
Вот ты как раз используешь mysqli точно так же, как mysql. Не используя присущие mysqli средства обеспечения безопасности - prepared statements
 
Сверху