کوتاه کننده لینک با پی اچ پی و MYSQL

کوتاه کننده لینک با پی اچ پی و MYSQLکوتاه کننده لینک با PHP ، مای اس کیو ال و Javascript – ساخت یک انتقال دهنده لینک نیازمند این است که راه حلی را داشته باشیم که بتوانیم یک آدرس طولانی را به یک آدرس کوتاه تبدیل کنیم .در این آموزش یک URL Shortener نیمه حرفه ای را خواهیم ساخت که از تکنولوژی Ajax پشتیبانی می کند .فایل index.phpخط 18 : از اونجایی که فرم ajax خواهد بود زمانی که آدرس وارد شد و کاربر ENTER زد نمی خواهیم هدایت بشیم بنابراین با مقدار false برمی گردانیم کــــه ریدایرکت نشیم .خط 19 : pattern را برای ورودی http و https تنظیم می کنیم که با یکی از این 2 شروع شود .<?php require_once &quotfunctions.php" require_once &quotfunc.actions.php" if(!empty($_GET['u']))require_once &quotredirect.php" ?> <!DOCTYPE html> <html lang=&quotfa&quot> <head> <meta charset=&quotUTF-8&quot> <title>Rapidcode.iR - سورس کد</title> <link rel=&quotstylesheet&quot href=&quotstatic/css/main.css&quot> </head> <body> <div class=&quotcontainer&quot> <a id=&quotintroduce&quot href=&quothttps://rapidcode.ir&quot target=&quot_blank&quot>رپید کد • کتابخانه مجازی برنامه نویسان</a> <form =&quotreturn false;&quot> <input autofocus pattern=&quothttps:\/\/.*|http:\/\/.*&quot type=&quoturl&quot name=&quoturl-inp&quot id=&quoturl-inp&quot placeholder=&quotلینک مورد نظر برای کوتاه شدن&quot><br><br> <input type=&quotbutton&quot id=&quotsubmit&quot value=&quotکوتاه کن&quot> </form> <?php if(isset($GLOBALS['is_url_correct']) && !$GLOBALS['is_url_correct']) echo generate_html_message(&quotآدرس مورد نظر در پایگاه داده یافت نشد .&quot , &quotwarning&quot) ?> <?php if(!empty($GLOBALS['info_msg'])) echo $GLOBALS['info_msg'] ?> <div class=&quotshort-link-wrapper&quot> <button id=&quotcopy-short-link&quot data-clipboard-target=&quot#short-link-copy&quot> <img src=&quotstatic/img/clippy.svg&quot alt=&quotcopy text&quot> </button> <input id=&quotshort-link-copy&quot type=&quoturl&quot readonly placeholder=&quotshort link goes here (;&quot dir=&quotltr&quot> </div> </div> <script src=static/js/lib/clipboard.min.js> <script src=&quotstatic/js/app.js&quot> </body> </html>فایل contants.php برای اطلاعات ثابت مثل دیتابیس<?php define(&quotHOST&quot , &quotlocalhost&quot); define(&quotUSERNAME&quot , &quotroot&quot); define(&quotPASSWORD&quot , &quot&quot); define(&quotDB&quot , &quotlink_db&quot); define(&quotCURRENT_TIME&quot , date(&quotY/m/d H:i:s&quot)); ?>فایل functions.php برای تابع های دیتابیس<?php require_once &quotconstants.php" $table = &quotlink_tbl" function validate_url(string $url) { $url_list = parse_url($url); $host = $url_list['host']; $path = $url_list['path']; $url = str_ireplace($path , urlencode($path) , $url); $url = str_ireplace($host . &quot%2f&quot , $host . &quot/&quot , $url); $url = filter_var($url, FILTER_VALIDATE_URL); return $url; } function show_json_message($array_data) { return json_encode($array_data); } function generate_url_token($url) { $crc32_number = crc32($url); $encoded_url = base_convert($crc32_number, 10, 36); $encoded_url_list = str_split($encoded_url, 1); $encoded_url = &quot" for ($i = 0; $i < sizeof($encoded_url_list); $i++) { $current_index = $encoded_url_list[$i]; $letter = is_numeric($current_index) ? $current_index : strtoupper($current_index); $encoded_url .= $letter; } return $encoded_url; } function generate_html_message($message = &quot&quot, $type = &quotnotice&quot) { return &quot<div class=\&quotmsg {$type}\&quot><p>{$message}</p></div>" } function remove_end_slash($url) { $url = strrev($url); $url = str_split($url, 1); if ($url[0] == &quot/&quot) unset($url[0]); $url = join($url); $url = strrev($url); return $url; } function update_views($column, $short_url) { $mysqli = new mysqli(HOST, USERNAME, PASSWORD, DB); $current_time = CURRENT_TIME; $row_updated = 0; $mysqli->set_charset(&quotutf8&quot); $stmt = $mysqli->stmt_init(); $query = &quotUPDATE `{$GLOBALS['table']}` SET `views` = views + 1 , `date_last_view` = ? WHERE {$column} = ?" $stmt->prepare($query); $stmt->bind_param('ss', $current_time, $short_url); if ($stmt->execute()) { $row_updated = $stmt->affected_rows ? $stmt->insert_id : 0; } $stmt->close(); $mysqli->close(); return $row_updated; } function row_select($user_query, $column, $select = &quot*&quot) { $mysqli = new mysqli(HOST, USERNAME, PASSWORD, DB); $row = 0; $mysqli->set_charset(&quotutf8&quot); $stmt = $mysqli->stmt_init(); $query = &quotSELECT {$select} FROM `{$GLOBALS['table']}` WHERE {$column}=?" $stmt->prepare($query); $stmt->bind_param(&quots&quot, $user_query); if ($stmt->execute() && $res = $stmt->get_result()) { if ($stmt->affected_rows || $res->num_rows) { $row = $res->fetch_assoc(); } } $stmt->close(); $mysqli->close(); return $row; } function row_insert($url) { $mysqli = new mysqli(HOST, USERNAME, PASSWORD, DB); $views = 0; $token_url = generate_url_token($url); $inserted_id = 0; $current_time = CURRENT_TIME; $mysqli->set_charset(&quotutf8&quot); $stmt = $mysqli->stmt_init(); $query = &quotINSERT INTO `{$GLOBALS['table']}` (link_original , link_short , date_submitted , date_last_view , views) VALUES (? , ? , ? , ? , ?)" $stmt->prepare($query); $stmt->bind_param('ssssi', $url, $token_url, $current_time, $current_time, $views); if ($stmt->execute()) { $inserted_id = $stmt->affected_rows ? $stmt->insert_id : 0; } $stmt->close(); $mysqli->close(); return $inserted_id; }فایل func.actions.phpاین فایل شامل 3 تابع است که 3 عمل اصلی را هم انجام می دهد :فانشکن func_action_submit : برای زمانی که لینکی را ثبت می کنیم .فانشکن func_action_redirect : کاربر را با لینک کوتاه به لینک اصلی هدایت می کند .فانشکن func_action_redirect_info : اطلاعاتی از لینک کوتاه ثبت شده به ما می دهد شامل تاریخ ثبت لینک ، تاریخ آخرین ارجاع یا بازدید از لینک ، تعداد بازدید .<?php function func_action_submit($response_list, $user_url) { $row = row_select($user_url, &quotlink_original&quot); if (empty($row)) { $row = row_insert($user_url); if (empty($row)) { $response_list['status'] = 0; $response_list['msg'] = &quotخطایی در هنگام ثبت داده در دیتابیس رخ داده ." die(show_json_message($response_list)); } else { $response_list['status'] = 1; $response_list['msg'] = &quotآدرس مورد نظر با موفقیت ثبت گردید ." $response_list['data'] = json_encode(row_select($row, &quotid&quot, &quotlink_short&quot)); die(show_json_message($response_list)); } } else { $response_list['msg'] = &quotاین آدرس از قبل ثبت شده" $response_list['data'] = json_encode([&quotlink_short&quot => $row['link_short']]); die(show_json_message($response_list)); } } function func_action_redirect($user_url) { $url_data = row_select($user_url, &quotlink_short&quot, &quotlink_original&quot); $GLOBALS['is_url_correct'] = false; if (!empty($url_data)) { update_views(&quotlink_short&quot, $user_url); header(&quotLocation: {$url_data['link_original']}&quot); $GLOBALS['is_url_correct'] = true; } } function func_action_redirect_info($user_url) { $url_data = row_select($user_url, &quotlink_short&quot, &quot*&quot); $url_data['link_original'] = urldecode($url_data['link_original']); $GLOBALS['is_url_correct'] = false; if (!empty($url_data)) { $GLOBALS['info_msg'] = &quot<div style=\&quotdirection: ltr;font-size:25px\&quot class=\&quotmsg success\&quot><p>{$url_data['link_original']}</p></div><table id=\&quotstatistics\&quot><tr><td>تاریخ ثبت لینک : </td><td>{$url_data['date_submitted']}</td></tr><tr><td>تاریخ آخرین ارجاع لینک : </td><td>{$url_data['date_last_view']}</td></tr><tr><td>تعداد ارجاع : </td><td>{$url_data['views']}</td></tr></table>" $GLOBALS['is_url_correct'] = true; } }فایل redirect.phpاین تابع مشخص می کند که کاربر با لینک کوتاهی که وارد کرده است می خواهد به لینک اصلی وارد شود یا آمار لینک را مشاهده کند .<?php if($_GET['u'] && !empty($_GET['info'])){ func_action_redirect_info($_GET['u']); }else if($_GET['u']){ func_action_redirect($_GET['u']); } ?>فایل api.phpاز اسمی که دارد برای endpoint استفاده می شود که درخواست های ajax به این فایل ختم می شود .<?php header(&quotContent-Type: application/json&quot); require_once &quotfunctions.php" require_once &quotfunc.actions.php" $response_list = [ &quotstatus&quot => 0, &quotmsg&quot => &quot&quot, &quotdata&quot => [] ]; $action_list = [ &quotsubmit&quot, ]; $user_url = @$_POST['inp-url']; $action = @$_POST['action']; if(empty($action) || !in_array($action , $action_list)){ $response_list['msg'] = &quotپارامتر action معتبر نمی باشد ." die(show_json_message($response_list)); } $user_url = remove_end_slash($user_url); if(empty($user_url) || !validate_url($user_url)){ $response_list['msg'] = &quotلینک معتبری وارد نشده است ." die(show_json_message($response_list)); } $user_url = urldecode($user_url); call_user_func(&quotfunc_action_&quot . $action , $response_list , $user_url); ?>فایل app.jsconst clipboardJS = new ClipboardJS('#copy-short-link'); const submitDOM = document.getElementById(&quotsubmit&quot); const urlInput = document.getElementById(&quoturl-inp&quot); const shortLinkWrapper = document.getElementsByClassName(&quotshort-link-wrapper&quot)[0]; submitDOM.addEventListener(&quotclick&quot, handlerSubmit); function handlerSubmit() { if (!urlInput.checkValidity()) { alert(&quotآدرس داده شده معتبر نمی باشد .&quot); return false; } submitDOM.setAttribute(&quotdisabled&quot, &quotdisabled&quot); submitDOM.value = &quotدر حال دریافت لینک ..." funcPostRequest(function (xhr) { const response = xhr.currentTarget.response; let data = response.data; if(typeof data == &quotstring&quot) data = JSON.parse(data); window.alert(response.msg); if (data['link_short']) { shortLinkWrapper.classList.add(&quotactive&quot); submitDOM.removeAttribute(&quotdisabled&quot); submitDOM.value = &quotکوتاه کن" shortLinkWrapper.querySelector(&quot#short-link-copy&quot).value = location.origin + &quot?u=&quot+ data['link_short']; } }, function () { alert(&quotخطایی رخ داده برای جزئیات بیشتر تب console را باز کنید&quot) console.warn(&quot[XHR Error]&quot); submitDOM.removeAttribute(&quotdisabled&quot); submitDOM.value = &quotکوتاه کن" }); } function funcPostRequest(cbOnload, cbOnerror) { const xhr = new XMLHttpRequest(); xhr.responseType = &quotjson" const params = new FormData; params.append(&quotaction&quot, &quotsubmit&quot); params.append(&quotinp-url&quot, urlInput.value); xhr.open(&quotPOST&quot, location.origin + &quot/api.php&quot); xhr. = cbOnload; xhr. = cbOnerror; xhr.send(params); }فایل main.cssbody{ background-image: url(../img/sea.jpg); background-size: cover; } .active{ display: block !important; } #url-inp{ transition: 0.3s all; width: 40%; border: none; outline: none; padding: 10px; border-radius: 25px; text-align: center; font-weight: bold; } #url-inp:focus{ width: 50%; border: 1px solid #000; } #submit{ border: none; background-color: #2196f3; color: white; font-weight: bold; font-size: 25px; padding: 10px 50px; border-radius: 25px; cursor: pointer; } #submit:hover{ background-color: #137dd3; } .msg{ background-color: silver; color: #000; border-radius: 15px; display: inline-block; padding: 5px 35px; margin: 15px auto; font-weight: bold; } .msg.warning{ background-color: #ffa500; } .msg.success{ background-color: #3f51b5; color: white; } #statistics{ font-weight: bold; background-color: rgb(255 255 255 / 79%); border-radius: 4px; width: 50%; margin: 0 25%; } #statistics td{ padding: 12px; } .short-link-wrapper{ display: none; } #short-link-copy{ margin-top: 50px; font-size: 24px; background-color: #4caf50; border: 3px #fff solid; outline: none; color: white; padding: 3px 10px; border-radius: 15px; } .short-link-wrapper button{ height: 25px; } .short-link-wrapper button img{ width: 15px; }لینک دانلود برنامه