แž”แž„แŸ’แžšแžฝแž˜แžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹แžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แžแŸ’แž›แžถแž‰แŸ‹ (F3)

แž”แž„แŸ’แžšแžฝแž˜แžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹แžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แžแŸ’แž›แžถแž‰แŸ‹ (F3)

แž‚แŸ’แž˜แžถแž“แž€แžถแžšแžแŸ’แž˜แžถแžŸแŸ‹แžขแŸ€แž“แž€แŸ’แž“แžปแž„แž€แžถแžšแž€แžถแžแŸ‹แžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹แž“แŸ…แžขแžถแž™แžป แŸกแŸฃ แž˜แŸ‚แž“แž‘แŸ? แžขแŸ’แž“แž€แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžŠแŸ†แž”แžผแž„ แž“แžทแž„แž˜แžทแž“แžแŸ’แžšแžนแž˜แžแŸ‚แž‡แžถแžขแŸ’แž“แž€แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžŠแŸ†แž”แžผแž„แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡แž‘แŸ แž‚แžฝแžšแžแŸ‚แž–แŸ’แž™แžถแž™แžถแž˜แžŸแžšแžŸแŸแžš Link Tamer แž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“แžšแž”แžŸแŸ‹แž‚แžถแžแŸ‹ แžแžŽแŸˆแž–แŸแž›แžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŸแžทแž€แŸ’แžŸแžถแž€แŸ’แžšแž”แžแŸแžŽแŸ’แžŒแžแŸ’แž˜แžธแž˜แžฝแž™แž…แŸ†แž“แžฝแž“แŸ” แžŠแŸ‚แž›แž‡แžถแžขแŸ’แžœแžธแžŠแŸ‚แž›แžแŸ’แž‰แžปแŸ†แž”แžถแž“แž’แŸ’แžœแžพแŸ” แžแžพแžแŸ’แž‰แžปแŸ†แžขแžถแž…แž“แžทแž™แžถแž™แžขแŸ’แžœแžธแž”แžถแž“ - แžŸแŸ’แž”แŸ‚แž€แž‡แžพแž„แž€แžœแŸ‚แž„แž‘แžธแž”แŸ’แžšแžถแŸ† แž€แŸ’แžšแž”แžแŸแžŽแŸ’แžŒแž‡แžถแžแžทแžแŸ’แž›แžถแž‰แŸ‹แž‘แžถแž” แž“แžทแž„แž”แŸ†แžŽแŸ‚แž€แž“แŸƒแž–แŸ’แžšแž›แžนแž„แŸ”

แž“แŸ…แž‘แžธแž“แŸแŸ‡ แž€แžถแžšแž”แž„แŸ’แž แžถแž‰แž แžพแž™แž“แŸ…แž‘แžธแž“แŸแŸ‡ แž€แžผแžŠ. แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แžขแžถแž“แžŠแžผแž…แžแŸ’แž‰แžปแŸ† ๐Ÿ˜‰

Framework แž˜แŸ‚แž“แž‘แŸ?

แž‡แžถแž€แžถแžšแž–แžทแžแžŽแžถแžŸแŸ‹แž˜แžทแž“แž˜แŸ‚แž“ Laravel แž“แžทแž„แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแž‘แŸ - แžแŸ’แž„แŸƒแž“แŸแŸ‡แž™แžพแž„แž“แžนแž„แž’แŸ’แžœแžพแž‡แžถแž˜แžฝแž™ 65 แž‚แžธแžกแžผแž”แŸƒ FatFreeFramework. แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แžŸแŸ’แž‚แžถแž›แŸ‹ Python Flask แžขแŸ’แž“แž€แž“แžนแž„แž‘แž‘แžฝแž›แž”แžถแž“แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแžแžถแžœแžถแžแŸ’แžšแžผแžœแž”แžถแž“แž’แŸ’แžœแžพแžšแžฝแž…แž แžพแž™แž“แŸ…แž€แž“แŸ’แž›แŸ‚แž„แžŽแžถแž˜แžฝแž™แŸ–

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

แž˜แžทแž“แžขแžธแž‘แŸ แž—แŸ’แž›แŸแž…แžœแžถแž‘แŸ…แŸ” แž‘แžถแž‰แž™แž€ .zip แž–แžธแž€แŸ’แžšแŸ…แž”แžŽแŸ’แžแžถแž‰แž–แž“แŸ’แž›แžถแžœแžถแž‘แŸ…แž€แŸ’แž“แžปแž„แžแžแžฏแž€แžŸแžถแžš แžŠแŸ‚แž›แž“แŸ…แž–แŸแž›แžแŸ‚แž˜แžฝแž™แž“แžนแž„แž”แžพแž€แž“แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž“แžทแž–แž“แŸ’แž’แž€แžผแžŠแžŠแŸ‚แž›แžขแŸ’แž“แž€แž…แžผแž›แž…แžทแžแŸ’แžแŸ” แž…แŸ’แž”แžถแžŸแŸ‹ index.php แž แžพแž™แžŠแž€แžขแŸ’แžœแžธแŸ—แž‘แžถแŸ†แž„แžขแžŸแŸ‹แž…แŸแž‰แž–แžธ / แž™แžผแŸ”

แžขแŸ’แžœแžธแž‚แŸ’แžšแž”แŸ‹แž™แŸ‰แžถแž„แž“แŸ…แž‘แžธแž“แŸแŸ‡แž‚แžบแžŸแžถแž˜แž‰แŸ’แž‰แž”แŸ†แž•แžปแž - แž“แŸ…แž€แŸ’แž“แžปแž„แžแž 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 แž“แŸ…แž›แžพ Windows แž“แžทแž„ VS Code, แžขแžแŸ’แžแž”แž‘โ€‹แžŠแŸ‚แž›โ€‹แž”แžถแž“โ€‹แžŸแžšแžŸแŸแžšโ€‹แž“แŸ…โ€‹แž€แŸ’แž“แžปแž„ Noushen]

แž‚แŸโ€‹แž โ€‹แž‘แŸ†แž–แŸแžš

แž…แžผแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž‡แžถแž˜แžฝแž™แž‘แŸ†แž–แŸแžšแž˜แŸแŸ” แžกแžผแž‡แžธแžแž›แž˜แŸ‚แž“แž‘แŸ?

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

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

แžฅแžกแžผแžœแžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแžŸแžšแžŸแŸแžšแž‚แŸ†แžšแžผแž“แŸแŸ‡แŸ” แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž—แžถแž–แžŸแžถแž˜แž‰แŸ’แž‰แžแŸ’แž‰แžปแŸ†แž”แžถแž“แž”แŸ’แžšแžพ bootstrap v5 alpfa แŸ”

แž€แžปแŸ†แž—แŸ’แž›แŸแž…แž”แž„แŸ’แž€แžพแžแž‚แŸ†แžšแžผแž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แŸ…แž€แŸ’แž“แžปแž„แžแžแžฏแž€แžŸแžถแžš แž™แžผ, แž”แžพแž˜แžทแž“แžŠแžผแž…แŸ’แž“แŸแŸ‡แž‘แŸแž–แžฝแž€แž‚แŸแŸ” แž“แžนแž„แž˜แžทแž“ แžขแžถแž…แž˜แžพแž›แžƒแžพแž‰แžŠแŸ„แž™แž€แŸ’แžšแž”แžแŸแžŽแŸ’แžŒ

<!-- ะคะฐะนะป: 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="/km/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. Hits - แž…แŸ†แž“แžฝแž“แž“แŸƒแž€แžถแžšแž…แžปแž…แž“แŸ…แž›แžพแžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹แžแŸ’แž›แžธแŸ”

แžแŸ’แž‰แžปแŸ†แž“แžนแž„แž”แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แžŠแŸ„แž™แžŸแž„แŸ’แžแŸแž”แžขแŸ†แž–แžธแž‚แŸ„แž›แž€แžถแžšแžŽแŸแž“แŸƒแž€แžถแžšแž’แŸ’แžœแžพแž€แžถแžšแž‡แžถแž˜แžฝแž™แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แžแŸ’แž›แžถแž‰แŸ‹แŸ”

<?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="/km/">ะ“ะปะฐะฒะฝะฐั</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="/km/" 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 แžขแžถแž…แž€แžพแžแžกแžพแž„แž˜แŸ’แžแž„แž‘แŸ€แž แžŠแžผแž…แŸ’แž“แŸแŸ‡แžแŸ’แž‰แžปแŸ†แžŸแŸ’แž“แžพแžฑแŸ’แž™แžขแŸ’แž“แž€แžŸแžšแžŸแŸแžšแž˜แžปแžแž„แžถแžšแžŠแŸ‚แž›แž“แžนแž„แž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แžœแžถแŸ”
  • แžขแŸ’แž“แž€แž€แŸแžขแžถแž…แž”แž„แŸ’แž€แžพแžแžŸแŸ’แžแžทแžแžทแž’แž˜แŸ’แž˜แžแžถ แž“แžทแž„แž”แž„แŸ’แž แžถแž‰แž–แžฝแž€แžœแžถแž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž”แŸ’แžแžผแžšแž‘แŸ… /@code/แžŸแŸ’แžแžทแžแžท
  • แž แžถแž˜แžƒแžถแžแŸ‹แž€แžถแžšแž”แž„แŸ’แž€แžพแžแžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ…แž€แžถแž“แŸ‹แžŸแŸแžœแžถแž€แžถแžแŸ‹แž”แž“แŸ’แžแž™แžแŸ†แžŽแžŠแŸ„แž™แžแŸ’แž›แžฝแž“แžฏแž„ แž”แž„แŸ’แž€แžพแžแž”แž‰แŸ’แž‡แžธแž’แž“แž’แžถแž“ "แž€แžถแžšแž–แžถแžš" แž–แžธแž€แžถแžšแž’แŸ’แžœแžพแžฑแŸ’แž™แžแŸ’แž›แžธ
  • แžแŸ’แž‰แžปแŸ†แžŸแžผแž˜แžŽแŸ‚แž“แžถแŸ†แž™แŸ‰แžถแž„แž˜แžปแžแž˜แžถแŸ†แžแžถ แžŸแžผแž˜แŸ’แž”แžธแžแŸ‚แž€แŸ’แž“แžปแž„แžšแžฟแž„แžแžผแž…แžแžถแž…แž”แŸ‚แž”แž“แŸแŸ‡แž€แŸแžŠแŸ„แž™ แžขแŸ’แž“แž€แž’แŸ’แžœแžพแž€แžถแžšแž”แž‰แŸ’แž…แžผแž›แžŸแžปแž–แž›แž—แžถแž–แž“แŸ…แž›แžพแž•แŸ’แž“แŸ‚แž€แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แŸ†แž แžปแžŸแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž‚แŸ’แž“แžถแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž แžถแž‰ แžขแŸ’แž“แž€แž˜แžทแž“แž‚แžฝแžšแž–แžนแž„แž•แŸ’แžขแŸ‚แž€แž›แžพแž€แžถแžšแž”แž“แŸ’แžแŸ‚แž˜แž‚แžปแžŽแž›แž€แŸ’แžแžŽแŸˆแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž€แžถแžš แž แžพแž™แžœแžถแž™ = "url" แž‘แŸ…แžœแžถแž›แž”แž‰แŸ’แž…แžผแž›แž“แŸ„แŸ‡แž‘แŸแŸ”
    RedComrade

  • แž•แŸ’แžแž›แŸ‹แž™แŸ„แž”แž›แŸ‹แž“แŸ…แž€แŸ’แž“แžปแž„แž˜แžแžทแž™แŸ„แž”แž›แŸ‹ ...

    แž‘แŸ†แž“แžถแž€แŸ‹แž‘แŸ†แž“แž„)

แž”แŸ’แžšแž—แž–: www.habr.com

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹