เจšเจฐเจฌเฉ€ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจฒเจฟเฉฐเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจ›เฉ‹เจŸเจพ เจ•เจฐเจจเจพ (F3)

เจšเจฐเจฌเฉ€ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจฒเจฟเฉฐเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจ›เฉ‹เจŸเจพ เจ•เจฐเจจเจพ (F3)

13 'เจคเฉ‡ เจฒเจฟเฉฐเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจ›เฉ‹เจŸเจพ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจธเจผเจฐเจฎ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ เฉ€เจ• เจนเฉˆ? เจ‡เฉฑเจ• เจธเจผเฉเจฐเฉ‚เจ†เจค เจ•เจฐเจจ เจตเจพเจฒเฉ‡, เจ…เจคเฉ‡ เจจเจพ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจธเจผเฉเจฐเฉ‚เจ†เจค เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจจเฉ‚เฉฐ, เจ•เฉเจ เจจเจตเจพเจ‚ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจธเจฟเฉฑเจ–เจฆเฉ‡ เจนเฉ‹เจ เจ†เจชเจฃเจพ เจฒเจฟเฉฐเจ• เจŸเฉˆเจฎเจฐ เจฒเจฟเจ–เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจจเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆเฅค เจœเฉ‹ เจฎเฉˆเจ‚ เจ•เฉ€เจคเจพเฅค เจฎเฉˆเจ‚ เจ•เฉ€ เจ•เจนเจฟ เจธเจ•เจฆเจพ เจนเจพเจ‚ - เจชเฉฐเจœเจตเจพเจ‚ เจฌเฉ‚เจŸเจธเจŸเจฐเฉˆเจช, เจ‡เฉฑเจ• เจ˜เฉฑเจŸ เจšเจฐเจฌเฉ€ เจตเจพเจฒเจพ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจ…เจคเฉ‡ เจ†เจคเจฎเจพ เจฆเจพ เจ‡เฉฑเจ• เจŸเฉเจ•เฉœเจพ.

เจ‡เฉฑเจฅเฉ‡ เจกเฉˆเจฎเฉ‹, เจ…เจคเฉ‡ เจ‡เฉฑเจฅเฉ‡ เจ•เฉ‹เจก. เจฎเฉ‡เจฐเฉ‡ เจตเจฐเจ—เฉ‡ เจชเจพเจ เจ•เจพเจ‚ เจฒเจˆ ๐Ÿ˜‰

เจซเจฐเฉ‡เจฎเจตเจฐเจ•, เจ เฉ€เจ• เจนเฉˆ?

เจฌเฉ‡เจธเจผเจ• เจฒเจพเจฐเจตเฉ‡เจฒ เจ…เจคเฉ‡ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ‡ เจจเจนเฉ€เจ‚ - เจ…เฉฑเจœ เจ…เจธเฉ€เจ‚ 65 เจ•เจฟเจฒเฉ‹เจฌเจพเจˆเจŸ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจซเฉˆเจŸเจซเฉเจฐเฉ€เจซเจฐเฉ‡เจฎเจตเจฐเจ•. เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจชเจพเจˆเจฅเจจ เจซเจฒเจพเจธเจ• เจคเฉ‹เจ‚ เจœเจพเจฃเฉ‚ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจน เจฎเจนเจฟเจธเฉ‚เจธ เจนเฉ‹เจตเฉ‡เจ—เจพ เจ•เจฟ เจ‡เจน เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ•เจฟเจคเฉ‡ เจ•เฉ€เจคเจพ เจœเจพ เจšเฉเฉฑเจ•เจพ เจนเฉˆ:

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

เจ เฉ€เจ• เจนเฉˆ, เจ‡เจธ เจจเฉ‚เฉฐ เจญเฉเฉฑเจฒ เจœเจพเจ“. เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเฉ‹ เจ†เจซเจธเจพเจˆเจŸ เจคเฉ‹เจ‚ เจœเจผเจฟเจช, เจ‡เจธเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš เจ…เจจเจชเฉˆเจ• เจ•เจฐเฉ‹, เจœเฉ‹ เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚ เจคเฉเจนเจพเจกเฉ‡ เจฎเจจเจชเจธเฉฐเจฆ เจ•เฉ‹เจก เจธเฉฐเจชเจพเจฆเจ• เจตเจฟเฉฑเจš เจ–เฉเฉฑเจฒเฉเจนเจฆเจพ เจนเฉˆเฅค เจธเจพเจซเจผ index.php เจ…เจคเฉ‡ เจธเจญ เจ•เฉเจ เจนเจŸเจพเจ“ /ui.

เจ‡เฉฑเจฅเฉ‡ เจธเจญ เจ•เฉเจ เจฌเจนเฉเจค เจนเฉ€ เจธเจงเจพเจฐเจจ เจนเฉˆ - เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš ui เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจธเจพเจฐเฉ‡ เจตเจฟเจฏเฉ‚เจœเจผ เจนเจจ, เจœเจพเจ‚, เจ‡เจธเจจเฉ‚เฉฐ เจธเจงเจพเจฐเจจ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ•เจนเจฟเจฃ เจฒเจˆ, เจ…เฉฑเจชเจ—เจฐเฉ‡เจก เจ•เฉ€เจคเฉ‡ HTML เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸ เจนเจจ เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจฆเจฟเจ–เจพเจตเจพเจ‚เจ—เฉ‡ เจœเจฆเฉ‹เจ‚ เจ‰เจน เจ•เจฟเจธเฉ‡ เจ–เจพเจธ URL เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจฆเฉ‡ เจนเจจเฅค

เจ‡เฉฑเจฅเฉ‡ เจธเจพเจกเฉ€ "เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ" เจฆเจพ เจชเจฟเฉฐเจœเจฐ เจนเฉˆ:

<?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();

เจธเจผเฉเจฐเฉ‚เจ†เจค เจ•เจฐเจจ เจฒเจˆ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฌเฉฑเจธ เจ‡เจนเฉ€ เจœเจพเจฃเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจ†เจ“ เจ•เฉ‹เจกเจฟเฉฐเจ— เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจ!

[เจตเจฟเจ•เจพเจธ เจฒเจˆ เจฎเฉˆเจ‚ เจธเจฅเจพเจจเจ• เจตเจฐเจคเจฟเจ† XAMPP เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจ…เจคเฉ‡ VS เจ•เฉ‹เจก 'เจคเฉ‡, Noushen เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจฒเฉ‡เจ–]

เจฎเฉเฉฑเจ– เจธเจซเจผเจพ

เจ†เจ‰ เจฎเฉเฉฑเจ– เจชเฉฐเจจเฉ‡ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจ. เจฒเจพเจœเจผเฉ€เจ•เจฒ, เจธเฉฑเจœเจพ?

//ะคะฐะนะป: 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="/pa/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 ะะฐัั‚ะพัั‚ะตะปัŒะฝะพ ั€ะตะบะพะผะตะฝะดัƒัŽ ะฟั€ะพั‡ะธั‚ะฐั‚ัŒ, ั…ะพั‚ัะฑั‹ ั ะฟะพะผะพั‰ัŒัŽ ะฟะตั€ะตะฒะพะดั‡ะธะบะฐ, ะฒัั‚ั€ะพะตะฝะฝะพะณะพ ะฒ ะฑั€ะฐัƒะทะตั€.
?>

เจ†เจ‰ เจ›เฉ‹เจŸเจพ เจ•เจฐเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจ.

เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจฒเจฟเฉฐเจ• เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เฉ€เจคเฉ€ เจœเจพ เจฐเจนเฉ€ เจนเฉˆ

เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจฆเฉเจฐเจฟเจธเจผ เจฌเจฃเจพเจ“ เจธเฉ‚เจšเจ•เจพเจ‚เจ•, เจœเฉ‹ เจฎเฉเฉฑเจ– เจชเฉฐเจจเฉ‡ 'เจคเฉ‡ เจซเจพเจฐเจฎ เจคเฉ‹เจ‚ เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฐเฉ‡เจ—เจพเฅค

เจชเจนเจฟเจฒเจพเจ‚, เจ†เจ“ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจฌเจฃเจพเจ“, เจชเจฐ เจชเจนเจฟเจฒเฉ‡ (home.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="/pa/">ะ“ะปะฐะฒะฝะฐั</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="/pa/" 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โ†’เจฐเจจ()!

เจชเฉœเฉเจนเจจ เจฒเจˆ เจงเฉฐเจจเจตเจพเจฆ!
เจฎเฉˆเจจเฉ‚เฉฐ เจ–เฉเจธเจผเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€ เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ•เฉ‹เจˆ เจŸเจฟเฉฑเจชเจฃเฉ€ เจฒเจฟเจ–เฉ‹ เจ…เจคเฉ‡ เจœเฉ‡ เจ•เฉเจ เจ—เจฒเจค เจนเฉˆ เจคเจพเจ‚ เจฎเฉˆเจจเฉ‚เฉฐ เจ เฉ€เจ• เจ•เจฐเฉ‹เฅค

เจ…เจคเฉ‡ เจนเฉ‹เจฎเจตเจฐเจ• เจœเจพเจ‚ เจฒเฉ‡เจ–เจ• (เจฎเฉ‡เจฐเฉ‡) เจฆเฉ€ เจ†เจฒเจธ เจฆเฉ‡ เจธเจฌเฉ‚เจค เจตเจœเฉ‹เจ‚, เจฎเฉˆเจ‚ เจ•เฉ€ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€ เจ›เฉฑเจกเจฆเจพ เจนเจพเจ‚. เจ•เจฐ เจ•เฉ‡ เจธเจฟเฉฑเจ–เจฃเจพ เจฌเจฟเจนเจคเจฐ เจนเฉˆ!

  • เจ‡เจน เจฌเฉ‡เจธเจผเฉฑเจ• เจ…เจธเฉฐเจญเจต เจนเฉˆ, เจชเจฐ เจœเจฆเฉ‹เจ‚ เจชเฉˆเจฆเจพ เจนเฉเฉฐเจฆเจพ เจนเฉˆ $g_code เจฆเฉเจฌเจพเจฐเจพ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจซเฉฐเจ•เจธเจผเจจ เจฒเจฟเจ–เจฃ เจฆเจพ เจธเฉเจเจพเจ… เจฆเจฟเฉฐเจฆเจพ เจนเจพเจ‚ เจœเฉ‹ เจ‡เจธเจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ‡เจ—เจพเฅค
  • เจคเฉเจธเฉ€เจ‚ เจ†เจฎ เจ…เฉฐเจ•เฉœเฉ‡ เจตเฉ€ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ /@เจ•เฉ‹เจก/เจ…เฉฐเจ•เฉœเฉ‡
  • เจฒเจฟเฉฐเจ• เจธเจผเจพเจฐเจŸเจจเจฟเฉฐเจ— เจธเฉ‡เจตเจพ เจฒเจˆ เจฒเจฟเฉฐเจ• เจฌเจฃเจพเจ‰เจฃ 'เจคเฉ‡ เจชเจพเจฌเฉฐเจฆเฉ€ เจฒเจ—เจพเจ“, เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€ เจฌเจฃเจพเจ“ "เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค" เจจเฉ‚เฉฐ เจ›เฉ‹เจŸเจพ เจ•เจฐเจจ เจคเฉ‹เจ‚
  • เจฎเฉˆเจ‚ เจœเจผเฉ‹เจฐเจฆเจพเจฐ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจ…เจœเจฟเจนเฉ‡ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ‡ เจœเจฟเจนเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš เจตเฉ€, เจคเฉเจธเฉ€เจ‚ เจธเจฐเจตเจฐ เจธเจพเจˆเจก 'เจคเฉ‡ เจ‡เจจเจชเฉเจŸ เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจธเฉฐเจฌเฉฐเจงเจฟเจค เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจฆเฉ‡ เจจเจพเจฒ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจจเจชเฉเจŸ เจ–เฉ‡เจคเจฐ เจตเจฟเฉฑเจš เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจ…เจคเฉ‡ เจŸเจพเจˆเจช = "url" เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจจ 'เจคเฉ‡ เจญเจฐเฉ‹เจธเจพ เจจเจนเฉ€เจ‚ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค
    เจฐเฉˆเฉฑเจก เจ•เจพเจฎเจฐเฉ‡เจก

  • เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจธเฉเจเจพเจ… เจฆเจฟเจ“ ...

    เจธเฉฐเจชเจฐเจ• 'เจš)

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹