RedBeanPHP и PHP switch: case

93
19 июня 2021, 03:40

Есть рабочий вариант кода страницы, для вывода текста из БД с помощью 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

Answer 1
$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' вы используете проверку

  1. В Переменной $page может быть значение NULL, которое вам присвоит метод redbean, если не найдет, это означает что будет вызвана ошикбка уровня E_NOTICE, говорящая о том что вы обращаетесь к переменной объекта, когда объект равен NULL
  2. Вы в переменную $page загружаете данные из БД, с помощью метода R::load('pages', $id) - который грузит данные по индентефикатору записи. Если вы хотите использовать "алиас" страницы, то должны использовать метод R::find('pages', 'alias = ?', [$alias]), если ваш "алиас" действительно уникален, то вы без проблем получите одну запись и она сохранится в $page.
  3. Я бы использовал такой подход:
    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 уже использовать регулярные выражения, чтобы обрабатывать ваш входной УРЛ.

Хорошего дня и успехов в программировании!

Answer 2

Разобрался, но вместо 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 ?>
------
Спасибо!

READ ALSO
ReactJS + Spring Boot 2 FullStack пиложение, как разобрать

ReactJS + Spring Boot 2 FullStack пиложение, как разобрать

Хочу научиться делать фронтенд для Rest Api приложенийВыбрал React

109
Как переписать код в стиле ООП?

Как переписать код в стиле ООП?

Всем привет! Объясните пожалуйста, как переписать данный код в стиле ООП (если возможно то с использованием интерфейсов)Собственно код:

94
Как найти строку или слова в StringBuilder

Как найти строку или слова в StringBuilder

Как найти слово или строку для того чтобы занести её в HashMap в ключ например:

92