Есть рабочий вариант кода страницы, для вывода текста из БД с помощью RedBeanPHP:
<?php
require_once('db.php');
$id = isset($_GET['id']) ? $_GET['id'] : null;
$page = R::load('pages', $id);
switch ($id) {
case $id:
$title = $page->page_title;
?>
<h2><?php echo $page->page_h2; ?></h2>
<h3><?php echo $page->page_h3; ?></h3>
<?php echo $page->content; ?>
<h4><?php echo $page->page_h4; ?></h4>
<?php
exit;
}
В нем происходит вывод текста на страницу из БД, он рабочий. Только лишь УРЛ неудобный.
В БД, каждой странице приписан свой page_url, хотелось быть именно с помощью page_url: /page.php?id=page_url обращаться к странице, а не как сейчас /page.php?id=1 и т.д.
Далее в .htaccess я буду использовать: RewriteRule ^(.*)$ page.php?id=$1 [L] чтобы получить более красивый УРЛ, вида /page_url
$id = '';
$id = isset($_GET['id']) ? $_GET['id'] : null;
Можно не инициализировать переменную, потому что в следующей строчке вы ее сразу же переопределяете.
$_GET['id']
- если вы захотели использовать цитирую " буквенным $page_url, которые присвоены каждой странице", то для общего понятия можно использовать $_GET['alias']
, т.к. это подходит к логике вашего приложения. Соответственно и хранить в базе поле с названием alias
и в GET параметре указывать page.php?alias=my_web_page
- момент не основной, но чтобы не писать "плохой" код, понятный вам же, думаю данная замена будет полезной.
if ($page->id == '0' && $page->id == 'null')
В первом условии $page->id == '0'
вы используете проверку
$page
может быть значение NULL
, которое вам присвоит метод redbean, если не найдет, это означает что будет вызвана ошикбка уровня E_NOTICE
, говорящая о том что вы обращаетесь к переменной объекта, когда объект равен NULL
$page
загружаете данные из БД, с помощью метода R::load('pages', $id)
- который грузит данные по индентефикатору записи. Если вы хотите использовать "алиас" страницы, то должны использовать метод R::find('pages', 'alias = ?', [$alias])
, если ваш "алиас" действительно уникален, то вы без проблем получите одну запись и она сохранится в $page
.if(!$page = R::find('pages', 'alias = ?', [$alias])) {
header("Location: 404");
}
Советую так же убрать конструкцию switch-case, т.к. она совершенно бесполезная в данной ситуации, потому что ваш будущий $alias
будет принимать только одно значение, просто уберите ее и следуйте советам, которые я описал ниже.
На счет ЧПУ. Можете посмотреть как реализованы такие подходы на разрын фреймворках - они почти везде одинаковые. За пример можете взять популярный фреймворк Yii2. Могу так же посоветовать серию видео-уроков по написанию собственного фреймворка, в которых подбробно решается ваша проблема и + к этому вы поймете кое-что большее для себя, и узнаете что-нибудь новенькое :)
Плейлист уроков
В вашем случае подойдет такой вариант:
<?php
require_once('db.php');
if($alias = isset($_GET['alias']) ? $_GET['alias'] : null
&& $page = R::find('pages', 'page_url = ?', [$alias])) {
echo "<p>{$page->page_url}</p>";
} else {
exit("404 Not found");
}
?>
Конструкцию switch
можно не использовать, т.к. в вагем случае алиас страницы уникален.
Но я предпочел бы использовать "Альтернативный синтаксис" и выполнил бы вашу задачу так:
<?php
require_once('db.php');
$alias = isset($_GET['alias']) ? $_GET['alias'] : null;
$page = R::find('pages', 'page_url = ?', [$alias]);
?>
<? if($page): ?>
<p><?= $page ?></p>
<? else: ?>
<p>404 Error - not found.</p>
<? endif ?>
Также вы можете настроить ЧПУ с помощью apache(.htaccess), а в php уже использовать регулярные выражения, чтобы обрабатывать ваш входной УРЛ.
Хорошего дня и успехов в программировании!
Разобрался, но вместо find использовал findOne. Спасибо, заработало:
<?php
require_once('db.php');
$alias = isset($_GET['alias']) ? $_GET['alias'] : null;
$page = R::findOne('pages', 'alias = ?', [$alias]);
?>
<? if($page): ?>
<p><?= $page ?></p>
<? else: ?>
<p>404 Error - not found.</p>
<? endif ?>
------
Спасибо!
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хочу научиться делать фронтенд для Rest Api приложенийВыбрал React
Всем привет! Объясните пожалуйста, как переписать данный код в стиле ООП (если возможно то с использованием интерфейсов)Собственно код:
Как найти слово или строку для того чтобы занести её в HashMap в ключ например: