เด•เตŠเดดเตเดชเตเดชเดฟเดฒเตเดฒเดพเดคเต† เดฒเดฟเด™เตเด•เตเด•เตพ เดšเตเดฐเตเด•เตเด•เตเดจเตเดจเต (F3)

เด•เตŠเดดเตเดชเตเดชเดฟเดฒเตเดฒเดพเดคเต† เดฒเดฟเด™เตเด•เตเด•เตพ เดšเตเดฐเตเด•เตเด•เตเดจเตเดจเต (F3)

13-เตฝ เดฒเดฟเด™เตเด•เตเด•เตพ เดšเตเดฐเตเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เดฒเดœเตเดœเดฏเดฟเดฒเตเดฒ, เด…เดฒเตเดฒเต‡? เด’เดฐเต เดคเตเดŸเด•เตเด•เด•เตเด•เดพเดฐเตป, เด’เดฐเต เดคเตเดŸเด•เตเด•เด•เตเด•เดพเดฐเตป เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดšเดฟเดฒ เดชเตเดคเดฟเดฏ เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเตเด•เตพ เดชเด เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดธเตเดตเดจเตเดคเด‚ เดฒเดฟเด™เตเด•เต เดŸเดพเดฎเตผ เดŽเดดเตเดคเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดฃเด‚. เดเดคเดพเดฃเต เดžเดพเตป เดšเต†เดฏเตเดคเดคเต. เดŽเดจเดฟเด•เตเด•เต เดŽเดจเตเดคเต เดชเดฑเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚ - เด…เดžเตเดšเดพเดฎเดคเตเดคเต† เดฌเต‚เดŸเตเดŸเตเดธเตเดŸเตเดฐเดพเดชเตเดชเต, เด•เตŠเดดเตเดชเตเดชเต เด•เตเดฑเดžเตเดž เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเต, เด†เดคเตเดฎเดพเดตเดฟเดจเตเดฑเต† เด’เดฐเต เดญเดพเด—เด‚.

เด‡เดตเดฟเดŸเต† เดกเต†เดฎเต‹, เด‡เดตเดฟเดŸเต† เด•เต‹เดกเต. เดŽเดจเตเดจเต†เดชเตเดชเต‹เดฒเตเดณเตเดณ เดตเดพเดฏเดจเด•เตเด•เดพเตผเด•เตเด•เต ๐Ÿ˜‰

เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเต, เด…เดฒเตเดฒเต‡?

เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚ เดฒเดพเดฑเดตเต†เดฒเตเด‚ เดฎเดฑเตเดฑเตเด‚ เด…เดฒเตเดฒ - เด‡เดจเตเดจเต เดžเด™เตเด™เตพ 65 เด•เดฟเดฒเต‹เดฌเตˆเดฑเตเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดšเต†เดฏเตเดฏเตเด‚ FatFreeFramework. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตˆเดคเตเดคเตบ เดซเตเดฒเดพเดธเตเด•เต เดชเดฐเดฟเดšเดฟเดคเดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด‡เดคเต เด‡เดคเดฟเดจเด•เด‚ เดŽเดตเดฟเดŸเต†เดฏเต‹ เดšเต†เดฏเตเดคเดคเดพเดฏเดฟ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดคเต‹เดจเตเดจเตเด‚:

#ั€ะพัƒั‚ะธะฝะณ ะฒะพ ะคะปะฐัะบะต
@app.route('/')
def hello_world():
    return 'Hello, World!'
//ั€ะพัƒั‚ะธะฝะณ ะฒ ะžะฑะตะทะถะธั€ะตะฝะฝะพะผ
$f3->route('GET /',
    function() {
        echo 'Hello, world!';
    }
);

เดถเดฐเดฟ, เดฎเดฑเด•เตเด•เตเด•. เดกเต—เตบเดฒเต‡เดพเดกเต เด“เดซเตโ€Œเดธเตˆเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต .zip, เด…เดคเต เด’เดฐเต เดซเต‹เตพเดกเดฑเดฟเดฒเต‡เด•เตเด•เต เด…เตบเดชเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเตเด•, เด…เดคเต‡ เดจเดฟเดฎเดฟเดทเดคเตเดคเดฟเตฝ เด…เดคเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดฟเดฏเดชเตเดชเต†เดŸเตเดŸ เด•เต‹เดกเต เดŽเดกเดฟเดฑเตเดฑเดฑเดฟเตฝ เดคเตเดฑเด•เตเด•เตเด‚. เด•เตเดฒเดฟเดฏเตผ index.php เดฏเต† เด•เต‚เดŸเดพเดคเต† เดŽเดฒเตเดฒเดพเด‚ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเด• /ui.

เด‡เดตเดฟเดŸเต† เดŽเดฒเตเดฒเดพเด‚ เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฃเต - เดซเต‹เตพเดกเดฑเดฟเตฝ ui เดžเด™เตเด™เตพเด•เตเด•เต เดŽเดฒเตเดฒเดพ เด•เดพเดดเตโ€Œเดšเด•เดณเตเด‚ เด‰เดฃเตเดŸเต, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดฒเดณเดฟเดคเดฎเดพเดฏเดฟ เดชเดฑเดžเตเดžเดพเตฝ, เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ URL เดธเดจเตเดฆเตผเดถเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต เดžเด™เตเด™เตพ เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจ เดจเดตเต€เด•เดฐเดฟเดšเตเดš HTML เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเตเด•เตพ.

เดžเด™เตเด™เดณเตเดŸเต† "เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต†" เด…เดธเตเดฅเดฟเด•เต‚เดŸเด‚ เด‡เดคเดพ:

<?php
//ะคะฐะนะป: index.php

// Kickstart the framework
$f3=require('lib/base.php');
$f3->set('DEBUG', 1);
if ((float)PCRE_VERSION<8.0)
    trigger_error('PCRE version is out of date');
$f3->config('config.ini');

//ะ’ะ•ะกะฌ ะžะกะขะะ›ะฌะะžะ™ ะšะžะ” ะ‘ะฃะ”ะ•ะœ ะŸะ˜ะกะะขะฌ ะ—ะ”ะ•ะกะฌ

$f3->run();

เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพ เด…เดฑเดฟเดžเตเดžเดฟเดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต เด‡เดคเตเดฐเดฎเดพเดคเตเดฐเด‚. เดจเดฎเตเด•เตเด•เต เด•เต‹เดกเดฟเด‚เด—เต เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเด‚!

[เดตเดฟเด•เดธเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เดžเดพเตป เดฒเต‹เด•เตเด•เตฝ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เตเดธเด…เด‚เดชเตเดชเต เดตเดฟเตปเดกเต‹เดธเดฟเดฒเตเด‚ เดตเดฟเดŽเดธเต เด•เต‹เดกเดฟเดฒเตเด‚, เดจเต—เดทเดจเดฟเตฝ เดŽเดดเตเดคเดฟเดฏ เดฒเต‡เด–เดจเด‚]

เดนเต‡เดพเด‚เดชเต‡เดœเต

เดชเตเดฐเดงเดพเดจ เดชเต‡เดœเดฟเตฝ เดจเดฟเดจเตเดจเต เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเด‚. เดฒเต‹เดœเดฟเด•เตเด•เตฝ, เด…เดฒเตเดฒเต‡?

//ะคะฐะนะป: index.php

$f3->route('GET /',
    function($f3) { //ั‡ั‚ะพะฑั‹ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ั„ัƒะฝะบั†ะธะธ F3 ะฟะตั€ะตะดะฐะตะผ ะตะณะพ ะฒ ั€ะพัƒั‚
                $view = new View; // ัะพะทะดะฐะตะผ ะฒัŒัŽัˆะบัƒ
        echo $view->render('home.htm'); //ั€ะตะฝะดะตั€ะธะผ ัˆะฐะฑะปะพะฝ
    }
);

เด‡เดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพ เดˆ เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเต เดŽเดดเตเดคเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดฒเดพเดณเดฟเดคเตเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ เดžเดพเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฌเต‚เดŸเตเดŸเตเดธเตเดŸเตเดฐเดพเดชเตเดชเต v5 alpfa.

เดซเต‹เตพเดกเดฑเดฟเตฝ เดŽเดฒเตเดฒเดพ เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเตเด•เดณเตเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เดฎเดฑเด•เตเด•เดฐเตเดคเต ui, เด…เดฒเตเดฒเดพเดคเตเดคเดชเด•เตเดทเด‚ เด…เดตเตผ เดšเต†เดฏเตเดฏเดฟเดฒเตเดฒ เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเดฟเตฝ เดฆเตƒเดถเตเดฏเดฎเดพเดฃเต

<!-- ะคะฐะนะป: ui/home.htm -->

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="<?php echo $ENCODING; ?>" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>ะŸะธัˆะตะผ (ะบะพะด), ัะพะบั€ะฐั‰ะฐะตะผ (ััั‹ะปะบะธ)!</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha1/css/bootstrap.min.css" integrity="sha384-r4NyP46KrjDleawBgD5tp8Y7UzmLA05oM1iAEQ17CSuDqnUK2+k9luXQOfXJCJ4I" crossorigin="anonymous">
    </head>
    <body class="text-center bg-dark text-light"> <!-- ั‚ะตะผะฝะฐั ั‚ะตะผะฐ ;) -->

        <!-- ะผะตะฝัŽัˆะบะฐ -->
        <nav class="m-2">
            <ul class="nav nav-pills justify-content-center">
                <li class="nav-item">
                    <a class="nav-link active" aria-current="page" href="#">ะ“ะปะฐะฒะฝะฐั</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="#">ะกั‚ะฐั‚ัŒั ะฝะฐ ะฅะฐะฑั€ะต</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="https://nikonovs.ru">ะกะพะทะดะฐั‚ะตะปัŒ</a>
                </li>
            </ul>
        </nav>

        <div class="container">
        <h1>ะšะพั€ะพั‚ะบะธะต ััั‹ะปะบะธ ัƒะถะต ะทะดะตััŒ.</h1>

        <!-- ะ‘ัƒะดะตะผ ะพั‚ะฟั€ะฐะฒะปัั‚ัŒ ะดะฐะฝะฝั‹ะต POST-ะทะฐะฟั€ะพัะพะผ ะฝะฐ /newLink -->
        <form class="mt-5 mb-3" action="/ml/newLink/" method="POST">
            <div class="row justify-content-center">
                <div class="col-auto">
                <label for="inputLink" class="col-form-label">ะ’ะฒะตะดะธ ััั‹ะปะบัƒ:</label>
                </div>
                <div class="col-auto">
                <input required placeholder="https://" type="url" name="link" id="inputLink" class="form-control mb-1" aria-describedby="inputLink">
                </div>
                <div class="col-auto">
                <button type="submit" class="btn btn-outline-primary">ะกะพะบั€ะฐั‚ะธั‚ัŒ!</button>
                </div>
            </div>
        </form>

        <!-- ะฝะตะผะฝะพะณะพ -->
        <p class="text-left m-auto mb-5" style="max-width: 30rem;">Lorem ipsum dolor sit, amet consectetur adipisicing elit. Omnis illum molestiae hic fugiat molestias nemo, architecto beatae repellat ullam exercitationem non ab, necessitatibus maxime quod iure ipsa quam quos! Reprehenderit. Lorem ipsum dolor, sit amet consectetur adipisicing elit. Necessitatibus eos sapiente voluptates veniam sequi delectus totam tenetur praesentium obcaecati. Repudiandae quisquam, ipsa ullam corrupti molestiae minima optio nihil est modi?</p>

        <footer class="m-2">ะกะดะตะปะฐะฝะพ ั <img width="20" height="20" src="https://image.flaticon.com/icons/svg/833/833472.svg" alt="ะปัŽะฑะพะฒัŒัŽ">, <a href="https://v5.getbootstrap.com/">ะฟัั‚ั‹ะผ Bootstrap'ะพะผ</a>    ะธ <a href="https://fatfreeframework.com/">ะฑะตะท ะถะธั€ะฐ</a></footer>
        </div>
    </body>
</html>

เด…เดคเตเดฐเดฏเต‡เดฏเตเดณเตเดณเต‚, เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดงเดพเดจ เดชเต‡เดœเต เด‡เดคเดฟเดจเด•เด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต. เดซเต‹เด‚ เด’เดฐเต POST เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดฒเดฟเด™เตเด•เต เดšเต†เดฑเตเดคเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.
เด‡เดชเตเดชเต‹เตพ เดฐเดธเด•เดฐเดฎเดพเดฏ เดญเดพเด—เด‚ เดตเดฐเตเดจเตเดจเต (เด…เดฒเตเดฒ).

เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต

เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด‰เดฃเตเดŸเดพเด•เตเด•เดพเด‚ - MySQL. เดจเดฟเด™เตเด™เตพ PhpMyAdmin เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เด’เดฐเต เดชเตเดคเดฟเดฏ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด• "เดฒเดฟเด™เตเด•เตผ" เดคเตเดŸเตผเดจเตเดจเต เดˆ SQL เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•:

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

CREATE TABLE IF NOT EXISTS `links` (
  `code` varchar(4) NOT NULL,
  `link` varchar(1000) NOT NULL,
  `hits` int(255) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

ALTER TABLE `links`
  ADD UNIQUE KEY `code` (`code`);

เด“เดฐเต‹ เดฒเดฟเด™เตเด•เดฟเดจเตเด‚ เดžเด™เตเด™เตพเด•เตเด•เต 3 เดซเต€เตฝเดกเตเด•เตพ เด‰เดฃเตเดŸเดพเด•เตเด‚:

  1. เดกเตŠเดฎเต†เดฏเตโ€Œเดจเดฟเดจเต เดถเต‡เดทเด‚ เด•เตเดฐเดฎเดฐเดนเดฟเดคเดฎเดพเดฏ 4 เดชเตเดฐเดคเต€เด•เด™เตเด™เดณเดพเดฃเต เด•เต‹เดกเต, เด…เดคเดฟเดฒเต‚เดŸเต† เดฑเต€เดกเดฏเดฑเด•เตเดทเตป เดธเด‚เดญเดตเดฟเด•เตเด•เตเด‚ example.com/ABC1
  2. เดฒเดฟเด™เตเด•เต - เดšเตเดฐเตเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ เดฒเดฟเด™เตเด•เต.
  3. เดนเดฟเดฑเตเดฑเตเด•เตพ - เดšเตเดฐเตเด•เตเด•เดฟเดฏ เดฒเดฟเด™เตเด•เดฟเดฒเต† เด•เตเดฒเดฟเด•เตเด•เตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚.

เด•เตŠเดดเตเดชเตเดชเต เด•เต‚เดŸเดพเดคเต† เด’เดฐเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เดคเดคเตเดตเด‚ เดžเดพเตป เดšเตเดฐเตเด•เตเด•เดฎเดพเดฏเดฟ เดชเดฑเดฏเดพเด‚.

<?php
//ัะฝะฐั‡ะฐะปะฐ ะฝัƒะถะฝะพ ะฟะพะดะบะปัŽั‡ะธั‚ัŒัั ะบ ะ‘ะ”
$db = new DBSQL(
    'mysql:host=localhost;port=3306;dbname=linker',
    'root',
    ''
);

//ะ”ะฐะปัŒัˆะต ะตัั‚ัŒ ะดะฒะฐ ะฒะฐั€ะธะฐะฝะดะฐ ั€ะฐะฑะพั‚ั‹ ั ะดะฐะฝะฝั‹ะผะธ:

//ะœะพะถะฝะพ ัƒัั‚ะฐะฝะพะฒะธั‚ัŒ ะฟะตั€ะตะผะตะฝะฝัƒัŽ ะฒ ะคั€ะตะนะผะฒะพั€ะบ c ะฟะพะผะพั‰ัŒัŽ ะพะฑั‹ั‡ะฝะพะณะพ SQL-ะทะฐะฟั€ะพัะฐ:
$f3->set('result', $db->exec('SELECT * FROM wherever')); 
//ะพะฝะธ ะฑัƒะดัƒั‚ ะดะพัั‚ัƒะฟะฝั‹ ะฒ ัˆะฐะฑะปะพะฝะฐั…, ะบะฐะบ <?= $resul ? >

//ะ ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะฒัั‚ั€ะพะตะฝะฝั‹ะน SQL Mapper:
$row = new DBSQLMapper($db, 'links');

$row->load(array('link="https://habrahabr.ru"')); //ั‚ะตะฟะตั€ัŒ ะธะท ัั‚ะพะณะพ ะพะฑัŠะตะบั‚ะฐ ะดะพัั‚ัƒะฟะฝั‹ ะฒัะต ะบะพะปะพะฝะบะธ ัั‚ั€ะพะบะธ, ะณะดะต ััั‹ะปะบะฐ ะฝะฐ ะฅะฐะฑั€:
$row_value = $row->somerow; //ะ’ะพั‚ ั‚ะฐะบ

// ะ•ัั‚ะตััั‚ะฒะตะฝะฝะพ ะผะพะถะฝะพ ะธะทะผะตะฝัั‚ัŒ ะทะฝะฐั‡ะตะฝะธั:
$row->link = 'https://habr.com';
$row->save(); //ะธะทะผะตะฝะตะฝะธั ะฝัƒะถะฝะพ ัะพั…ั€ะฐะฝะธั‚ัŒ, ะฐ ั‡ั‚ะพ ะฒั‹ ะดัƒะผะฐะปะธ

// ะฑะพะปัŒัˆะต ะธะฝั„ะพั€ะผะฐั†ะธะธ ะฟะพ ั€ะฐะฑะพั‚ะต ั ะ‘ะ” ะดะพัั‚ัƒะฟะฝะพ ะทะดะตััŒ: https://a.nikonovs.ru/MPHR ะะฐัั‚ะพัั‚ะตะปัŒะฝะพ ั€ะตะบะพะผะตะฝะดัƒัŽ ะฟั€ะพั‡ะธั‚ะฐั‚ัŒ, ั…ะพั‚ัะฑั‹ ั ะฟะพะผะพั‰ัŒัŽ ะฟะตั€ะตะฒะพะดั‡ะธะบะฐ, ะฒัั‚ั€ะพะตะฝะฝะพะณะพ ะฒ ะฑั€ะฐัƒะทะตั€.
?>

เดšเตเดฐเตเด•เตเด•เดฟ เดคเตเดŸเด™เตเด™เดพเด‚.

เด’เดฐเต เดชเตเดคเดฟเดฏ เดฒเดฟเด™เตเด•เต เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด’เดฐเต เดชเตเดคเดฟเดฏ เด•เดพเดดเตเดš เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด• เดธเต‚เดšเดฟเด•, เด‡เดคเต เดชเตเดฐเดงเดพเดจ เดชเต‡เดœเดฟเดฒเต† เดซเต‹เดฎเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเด‚.

เด†เดฆเตเดฏเด‚, เดจเดฎเตเด•เตเด•เต เดชเตเดคเดฟเดฏเดคเตเด‚ เดŽเดจเตเดจเดพเตฝ เด†เดฆเตเดฏเดคเตเดคเต† (hm.htm) เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเตเดฎเดพเดฏเดฟ เดตเดณเดฐเต† เดธเดพเดฎเตเดฏเดฎเตเดณเตเดณเดคเตเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเด‚ - "newLink.htm".
เด…เดตเดฟเดŸเต† เดžเด™เตเด™เตพ เด‡เดคเดฟเดจเด•เด‚ เดšเตเดฐเตเด•เตเด•เดฟเดฏ เดฒเดฟเด™เตเด•เตเด‚ เด…เดคเดฟเดฒเต† เด•เตเดฒเดฟเด•เตเด•เตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเดตเตเด‚ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚ (เดˆ โ€œเดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเด•เตเด•เดฃเด•เตเด•เตเด•เตพโ€ เดตเต€เดฃเตเดŸเตเด‚ เด•เดพเดฃเตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพ เด…เดคเต‡ เดฒเดฟเด™เตเด•เต เดตเต€เดฃเตเดŸเตเด‚ เดšเต†เดฑเตเดคเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต - เดตเดฟเดฒเดพเดธเด‚ เด…เดคเต‡เดชเดŸเดฟ เดคเตเดŸเดฐเตเด‚).
เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป, เดžเด™เตเด™เตพ "เดตเต‡เดฐเดฟเดฏเดฌเดฟเตพ เดชเดพเดธเดฟเด‚เด—เต" เดŸเตเดฐเดฟเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚:

<?php
//ะคะฐะนะป: ะฝะตั‚ (ะฟั€ะธะผะตั€)

//ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฟะตั€ะตะผะตะฝะฝัƒัŽ ะฒ index'ะต ะธ ั€ะตะฝะดะตั€ะธะผ ัˆะฐะฑะปะพะฝ
$f3->set('link', $shorted_link);
$view = new View;
echo $view->render('newLink.htm');
//ั‚ะตะฟะตั€ัŒ ะฒ ัˆะฐะฑะปะพะฝะต ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ:
<?= $link ?>

เด’เดชเตเดชเด‚ เดฒเดฟเดธเตเดฑเตเดฑเดฟเด‚เด—เต เด‡เดคเดพ newLink.html:

<!-- ะคะฐะนะป: newLink.htm -->

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="<?php echo $ENCODING; ?>" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>ะŸะธัˆะตะผ (ะบะพะด), ัะพะบั€ะฐั‰ะฐะตะผ (ััั‹ะปะบะธ)!</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha1/css/bootstrap.min.css" integrity="sha384-r4NyP46KrjDleawBgD5tp8Y7UzmLA05oM1iAEQ17CSuDqnUK2+k9luXQOfXJCJ4I" crossorigin="anonymous">
    </head>
    <body class="text-center bg-dark text-light">
        <nav class="m-2">
            <ul class="nav nav-pills justify-content-center">
                <li class="nav-item">
                    <a class="nav-link" aria-current="page" href="/ml/">ะ“ะปะฐะฒะฝะฐั</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="#">ะกั‚ะฐั‚ัŒั ะฝะฐ ะฅะฐะฑั€ะต</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="https://nikonovs.ru">ะกะพะทะดะฐั‚ะตะปัŒ</a>
                </li>
            </ul>
        </nav>

        <div class="container">
        <h1>ะšะพั€ะพั‚ะบะธะต ััั‹ะปะบะธ ัƒะถะต ะทะดะตััŒ.</h1>

        <!-- ะฃะฑะธั€ะฐะตะผ ะธะท ั„ะพั€ะผั‹ ั„ัƒะฝะบั†ะธะพะฝะฐะป ั„ะพั€ะผั‹ ะธ ะฒั‹ะฒะพะดะธะผ ะฟะตั€ะตะผะตะฝะฝั‹ะต -->
        <form class="mt-5 mb-3">
            <div class="row justify-content-center">
                <div class="col-auto">
                    <label for="inputLink" class="col-form-label">ะกะพะบั€ะฐั‚ะธะปะธ:</label>
                </div>
                <div class="col-auto">
                    <input disabled required type="url" name="link" id="inputLink" class="form-control disabled" aria-describedby="inputLink" value="<?= $link ?>">
                </div>
            </div>
            <p class="m-2 text-secondary">ะŸะพ ัั‚ะพะน ััั‹ะปะบะต ะฟะตั€ะตัˆะปะธ: `<?= $hits ?>`</p>
        </form>

        <a href="/ml/" class="mt-3 mb-5 btn btn-primary btn-lg">ะ’ะ•ะ ะะฃะขะฌะกะฏ ะะ ะ“ะ›ะะ’ะะฃะฎ</a>

        <footer class="m-2">ะกะดะตะปะฐะฝะพ ั <img width="20" height="20" src="https://image.flaticon.com/icons/svg/833/833472.svg" alt="ะปัŽะฑะพะฒัŒัŽ">, <a href="https://v5.getbootstrap.com/">ะฟัั‚ั‹ะผ Bootstrap'ะพะผ</a>    ะธ <a href="https://fatfreeframework.com/">ะฑะตะท ะถะธั€ะฐ</a></footer>
        </div>
    </body>
</html>

เดžเด™เตเด™เตพ เดฑเต‚เดŸเตเดŸเต เดคเดจเตเดจเต† เดŽเดดเตเดคเตเดจเตเดจเต.

$f3->route('GET|POST /newLink', //ะผั‹ ะฑัƒะดะตะผ ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐั‚ัŒ ะธ POST ะธ GET
    function($f3) {

            $db = new DBSQL( //ะŸะพะดะบะปัŽั‡ะตะฝะธะต ะบ ะ‘ะ” ะฝะพะฒะพะต ะฒ ะบะฐะถะดะพะผ ะ ะพัƒั‚ะต
                'mysql:host=localhost;port=3306;dbname=linker',
                'root',
                ''
            );

            //ะฟั€ะตะบั€ะฐัะฝะฐั ั„ัƒะฝะบั†ะธั ะณะตะฝะตั€ะฐั†ะธะธ ั€ะฐะดะพะผะฝั‹ั… ัะธะผะฒะพะปะพะฒ:
            $permitted_chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
            function generate_string($input, $strength = 4) {
                $input_length = strlen($input);
                $random_string = '';
                for($i = 0; $i < $strength; $i++) {
                    $random_character = $input[mt_rand(0, $input_length - 1)];
                    $random_string .= $random_character;
                }

                return $random_string;
            }

            //ะฟั€ะพะฒะตั€ะบะฐ ะฝะฐ ะฟะพะฒั‚ะพั€ะตะฝะธะต link - ะฝะฐะผ ะถะต ะฝะต ะฝัƒะถะฝะพ ั‡ั‚ะพะฑั‹ ะบะฐะถะดั‹ะน ั€ะฐะท ะณะตะฝะตั€ะธั€ะพะฒะฐะปะธััŒ ะฝะพะฒั‹ะต ััั‹ะปะบะธ. link - ัƒะฝะธะบะฐะปัŒะฝั‹ะน.
            $check = new DBSQLMapper($db,'links');
            $check->load(array('link="'. $link .'"'));
            if ($check->dry()) {
                $g_code = generate_string($permitted_chars);
                $row = new DBSQLMapper($db,'links');
                $row->reset();
                $row->code = $g_code;
                $row->link = $link;
                $row->save();
            } else {
                $g_code = $check->code; //ะตัะปะธ link ะฟะพะฒั‚ะพั€ัะตั‚ัั, ั‚ะพ ะฟะพะบะฐะทั‹ะฒะฐะตะผ ัั‚ะฐั€ั‹ะน ะบะพะด
            }

            $short_link = 'https://'. $_SERVER['HTTP_HOST'] . '/' . $g_code; //ัะพะฑะธั€ะฐะตะผ ะบะพะฝะตั‡ะฝัƒัŽ ััั‹ะปะบัƒ

            //ะฟะฐั€ะฐะผะตั‚ั€ั‹ ะธะท $_POST ะผะพะถะฝะพ ะฟะพะปัƒั‡ะธั‚ัŒ ั ะฟะพะผะพั‰ัŒัŽ $f3->get('POST'), ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ัั ั‚ะพั‡ะตั‡ะฝะฐั ะฝะพั‚ะฐั†ะธั (ะฟะพะฟั€ะฐะฒัŒั‚ะต, ะตัะปะธ ะฝะตะฟั€ะฐะฒะธะปัŒะฝะพ ะฝะฐะทั‹ะฒะฐัŽ): ะฟะฐั€ะฐะผะตั‚ั€ "link" ะผะพะถะฝะพ ะฟะพะปัƒั‡ะธั‚ัŒ ั‚ะฐะบ: 
            $link = $f3->get('POST.link');

            if ( !empty($f3->get('POST')) ) { //ะ’ั‹ะดะฐะตะผ HTML, ั‚ะพะปัŒะบะพ ะตัะปะธ POST ะฝะต ะฟัƒัั‚ะพะน.

            $f3->set('link', $short_link);
            $f3->set('hits', $check->hits);
            $view = new View;
            echo $view->render('newLink.htm');

            } else { //ะธะฝะฐั‡ะต - ั€ะตะดะธั€ะตะบั‚ ะฝะฐ ะณะปะฐะฒะฝัƒัŽ
                $f3->$f3->reroute('/');
            }

        }
);

เดคเดฏเตเดฏเดพเดฑเดพเดฃเต! เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ, เด…เดคเต เดฒเดณเดฟเดคเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต.

เดคเดฟเดฐเดฟเดšเตเดšเตเดตเดฟเดŸเตเด•

เดšเต†เดฏเตเดฏเดพเตป เด•เตเดฑเดšเตเดšเต เดฎเดพเดคเตเดฐเด‚ เดฌเดพเด•เตเด•เดฟเดฏเตเดฃเตเดŸเต:

  1. URL-เตฝ เดจเดฟเดจเตเดจเต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเตผ เดจเต‡เดŸเตเด•
  2. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เด…เดคเดฟเดจเตเดฑเต† เดธเดพเดจเตเดจเดฟเดงเตเดฏเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•
  3. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เดจเตเดฌเดจเตเดง เดฒเดฟเด™เตเด•เต เดจเต‡เดŸเตเด•
  4. เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต† เดตเดดเดฟเดคเดฟเดฐเดฟเดšเตเดšเตเดตเดฟเดŸเตเด•
  5. เดฒเดพเดญเด‚!

เด…เดตเดธเดพเดจ เดฑเต‚เดŸเตเดŸเดฟเดจเต เดถเต‡เดทเด‚ เดžเด™เตเด™เตพ เด•เต‹เดกเต เดŽเดดเตเดคเตเดจเตเดจเดคเต เดคเตเดŸเดฐเตเดจเตเดจเต.

$f3->route('GET /@code', //ัƒะบะฐะทั‹ะฒะฐะตะผ ะฟะฐั€ะฐะผะตั‚ั€ ะฟะพัะปะต "@", ะพะฝ ะฟะพะฟะฐะดะตั‚ ะฒ PARAMS
    function($f3) {

        //ัะฝะพะฒะฐ ะพะฟั€ะตะดะตะปัะตะผ $db
        $db = new DBSQL(
            'mysql:host=localhost;port=3306;dbname=linker',
            'root',
            ''
        );

        $code = $f3->get('PARAMS.code'); //ะฟะพะปัƒั‡ะฐะตะผ ะฟะฐั€ะฐะผะตั‚ั€

        $link = new DBSQLMapper($db,'links'); 

        //ะตัะปะธ ะฟะพะปัƒั‡ะฐะตั‚ัั ะฟะพะปัƒั‡ะธั‚ัŒ ััั‹ะปะบัƒ ะธะท ะ‘ะ” - ะฟะพะปัƒั‡ะฐะตะผ, ัƒะฒะตะปะธั‡ะธะฒะฐะตะผ ะบะพะปะธั‡ะตัั‚ะฒะพ ะฟะตั€ะตั…ะพะดะพะฒ ะธ ะฟะตั€ะตะฝะฐะฟั€ะฐะฒะปัะตะผ
        if ($link->load(array('code="'.$code.'"', 'link=?'))) {
            $link->hits++;
            $link->save();

            $f3->reroute($link->link);
        } else {
            $f3->reroute('/'); //ะฐ ะตัะปะธ ั‚ะฐะบะพะน ััั‹ะปะบะธ ะฝะตั‚ - ะผะธะปะพัั‚ะธ ะฟั€ะพัะธะผ ะฝะฐ ะณะปะฐะฒะฝัƒัŽ
        }
    }
);

เดฑเต‚เดŸเตเดŸเดฟเดฒเตเด‚ เดฑเต‚เดŸเตเดŸเดฟเดฒเตเด‚ เดจเดฟเด™เตเด™เตพ เด…เดคเต เดถเตเดฐเดฆเตเดงเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เดพเด‚ เดชเตเดคเดฟเดฏ เดฒเดฟเด™เตเด•เต, เดฎเตเด•เดณเดฟเดฒเตเดณเตเดณ เดฑเต‚เดŸเตเดŸเดฟเตฝ เด’เดฐเต‡ เด•เดพเดฐเตเดฏเด‚ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเด‚ - เดŽเดฒเตเดฒเดพเดคเตเดคเดฟเดจเตเดฎเตเดชเดฐเดฟ เด•เต‡เดพเดกเต "newLink" เดŽเดจเตเดจเดคเตเดฎเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเดพเด‚ (เด…เดคเดฟเดจเต เด•เดดเดฟเดฏเดฟเดฒเตเดฒ, เดœเดจเดฑเต‡เดฑเตเดฑเดฑเดฟเตฝ เดตเดฒเดฟเดฏเด•เตเดทเดฐเด™เตเด™เตพ เดฎเดพเดคเตเดฐเดฎเต‡ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดŸเตเดŸเตเดณเตเดณเต‚), เดŽเดจเตเดจเดพเตฝ เด‡เดคเต เด†เดฆเตเดฏเด‚ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เด…เดคเต เด†เดฆเตเดฏเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเด‚.

$f3โ†’run()!

เดตเดพเดฏเดฟเดšเตเดšเดคเดฟเดจเต เดจเดจเตเดฆเดฟ!
เดจเดฟเด™เตเด™เตพ เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดŽเดดเตเดคเตเด•เดฏเตเด‚ เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดคเต†เดฑเตเดฑเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ เดŽเดจเตเดจเต† เดคเดฟเดฐเตเดคเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดคเดพเตฝ เดžเดพเตป เดธเดจเตเดคเต‹เดทเดฟเด•เตเด•เตเด‚.

เด•เต‚เดŸเดพเดคเต† เด—เตƒเดนเดชเดพเด เด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฐเดšเดฏเดฟเดคเดพเดตเดฟเดจเตเดฑเต† (เดžเดพเตป) เด…เดฒเดธเดคเดฏเตเดŸเต† เดคเต†เดณเดฟเดตเดพเดฏเดฟ, เดŽเดจเตเดคเตเดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเดฎเต†เดจเตเดจเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เดžเดพเตป เด‰เดชเต‡เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต. เดšเต†เดฏเตเดคเตเด•เตŠเดฃเตเดŸเต เดชเด เดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฃเต เดจเดฒเตเดฒเดคเต!

  • เด‡เดคเต เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚ เดธเดพเดงเตเดฏเดคเดฏเดฟเดฒเตเดฒ, เดชเด•เตเดทเต‡ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ $g_code เดตเต€เดฃเตเดŸเตเด‚ เดธเด‚เดญเดตเดฟเด•เตเด•เดพเด‚, เด…เดคเดฟเดจเดพเตฝ เด‡เดคเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดซเด‚เด—เตโ€Œเดทเตป เดŽเดดเตเดคเดพเตป เดžเดพเตป เดจเดฟเตผเดฆเตเดฆเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเต.
  • เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเดพเดงเดพเดฐเดฃ เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเด•เตเด•เดฃเด•เตเด•เตเด•เตพ เด‰เดฃเตเดŸเดพเด•เตเด•เดพเดจเตเด‚ เด…เดคเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเดฟเดฏเดคเดฟเดจเตเดถเต‡เดทเด‚ เด…เดต เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚ /@เด•เต‹เดกเต/ เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเด•เตเด•เดฃเด•เตเด•เตเด•เตพ
  • เดฒเดฟเด™เตเด•เต เดทเต‹เตผเดŸเตเดŸเต เดšเต†เดฏเตเดฏเตฝ เดธเต‡เดตเดจเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดคเดจเตเดจเต† เดฒเดฟเด™เตเด•เตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเต เดจเดฟเดฐเต‹เดงเดฟเด•เตเด•เตเด•, เดšเตเดฐเตเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต โ€œเดธเด‚เดฐเด•เตเดทเดฟเดšเตเดšโ€ เดตเดฟเดญเดตเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•
  • เด‡เดคเตเดฐเดฏเตเด‚ เดšเต†เดฑเดฟเดฏ เด•เดพเดฐเตเดฏเด™เตเด™เดณเดฟเตฝ เดชเต‹เดฒเตเด‚, เดจเดฟเด™เตเด™เตพ เดธเต†เตผเดตเตผ เดตเดถเดคเตเดคเต เด‡เตปเดชเตเดŸเตเดŸเต เดฎเต‚เดฒเตเดฏเดจเดฟเตผเดฃเตเดฃเดฏเด‚ เดจเดŸเดคเตเดคเดฃเดฎเต†เดจเตเดจเต เดžเดพเตป เดถเด•เตเดคเดฎเดพเดฏเดฟ เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด…เดจเตเดฌเดจเตเดง เดชเดฟเดถเด•เตเด•เตพ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเต, เด‡เตปเดชเตเดŸเตเดŸเต เดซเต€เตฝเดกเดฟเดฒเต‡เด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฏ เด†เดŸเตเดฐเดฟเดฌเตเดฏเต‚เดŸเตเดŸเต เดšเต‡เตผเดคเตเดคเต = "url" เดŽเดจเตเดจเต เดŸเตˆเดชเตเดชเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเตฝ เดจเดฟเด™เตเด™เตพ เด†เดถเตเดฐเดฏเดฟเด•เตเด•เดฐเตเดคเต.
    เดฑเต†เดกเตเด•เต‹เดฎเตเดฐเต‡เดกเต

  • เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เดณเดฟเตฝ เดจเดฟเตผเดฆเตเดฆเต‡เดถเดฟเด•เตเด•เตเด•...

    เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต)

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•