Не совсем корректное поведение, при добавление ссылки, которой ещё нет в БД. Поясню – в input вставляю ссылку, которую необходимо сократить. Нажимаю submit и все :) происходит перезагрузка страницы, ссылка сокращается и добавляется в БД.
Что бы увидеть полученную ссылку, нужно спровоцировать ошибку, то есть попробовать эту ссылку сократить второй раз. Для более наглядного отображения залил на хостинг
P.S. ссылку убрал, как оказалось этот ресурс посещают психически не стабильные люди :\ (если требуется, напишите – скину)
foreach ($sth as $existLink) {
echo '<h1>...</h1>';
echo '<ul>';
echo '<li>...</li>';
echo '</ul>';
}
<?php
include_once(__DIR__ . '/libraries/database.php');
$externalLink = $_POST['external_link'] ?? null;
function prepareExternalLink($link)
{
$result = trim($link);
$result = htmlspecialchars($result);
return $result;
}
$preparedLink = prepareExternalLink($externalLink);
$sth = db_query("SELECT url, short_key FROM short WHERE url= '" . $preparedLink . "'");
if (empty($_POST['external_link'])) {
echo 'Введите в поле ссылку, которую требуется сократь:';
} elseif (isset(db_query("SELECT url FROM short WHERE url= '" . $preparedLink . "'")->fetch()['url'])) {
// Должна подгружаться ajax
foreach ($sth as $existLink) {
echo '<h1>Такая ссылка уже есть в БД</h1>';
echo '<ul>';
echo '<li><strong>Внешняя ссылка</strong>: <a href="' . $existLink['url'] . '" target="_blank">' . $existLink['url'] . '</a></li>';
echo '<li><strong>Сокращенная ссылка</strong>: <a href="//' . $_SERVER['HTTP_HOST'] . '/&' . $existLink['short_key'] . '" target="_blank">http://' . $_SERVER['HTTP_HOST'] . '/&' . $existLink['short_key'] . '</a></li>';
echo '</ul>';
}
} else {
/*---- Генерация уникального id----*/
$letters = 'qwertyuiopasdfghjklzxcvbnm1234567890';
$count = strlen($letters);
$intval = time();
$result = '';
for ($i = 0; $i < 4; $i++) {
$last = $intval % $count;
$intval = ($intval - $last) / $count;
$result .= $letters[$last];
}
/*---- INSERT link in db---*/
$sthInsert = db_query("INSERT INTO short (url,short_key) VALUE (:original_link, :short_key)", [
'original_link' => $preparedLink,
'short_key' => $result . $intval
]);
// Ajax – появляется информация о добавленной ссылке
}
?>
<form style="margin-top: 10px;" method="post">
<input type="text" name="external_link">
<input type="submit" name="submit">
</form>
example.com/&8hde935
. Как сделать, что бы сокращенная ссылка была без спец.символа (в моем случае амперсанд), то есть example.com/8hde935
.DirectoryIndex index.php
Options -Indexes
Options +FollowSymLinks
php_flag register_globals off
RewriteEngine on
RewriteRule ^&(.*) /redirect.php?key=$1 [L]
<?php
include_once(__DIR__ . '/libraries/database.php');
$key = htmlspecialchars($_GET['key']) ?? null;
if (isset(db_query("SELECT url, short_key FROM short WHERE short_key= '" . $key . "'")->fetch()['url'])) {
$sthSelectSingle = db_query("SELECT url, short_key FROM short WHERE short_key= '" . $key . "'");
header('HTTP/1.1 301 Moved Permanently');
header('Location:' . $sthSelectSingle->fetch(PDO::FETCH_OBJ)->url);
} else {
exit('Ошибка при переадресации');
}
RewriteRule ^&(.*) /redirect.php?key=$1 [L]
, но переписать правило не смог :(.<?php
// Connecting database
function db_connect()
{
// Connections settings
$db_host = 'localhost';
$db_name = 'test';
$db_charset = 'utf8';
$db_user = 'root';
$db_password = '';
static $pdh;
if ($pdh === null) {
$dns = sprintf("mysql:host=%s;dbname=%s;charset=%s", $db_host, $db_name, $db_charset);
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdh = new PDO($dns, $db_user, $db_password, $options);
} catch (PDOException $exception) {
echo "Technical troubles in the site. Soon all fix.";
file_put_contents('Errors_Log.txt', date(DATE_RFC822) . ': ' . $exception->getMessage() . PHP_EOL, FILE_APPEND);
}
}
return $pdh;
}
// Request processing
function db_query(string $sql_query, array $params_execute = [])
{
$pdh = db_connect();
$sth = $pdh->prepare($sql_query);
$verifiedParams = [];
foreach ($params_execute as $placeholder => $item) {
if (is_int($item)) {
$sth->bindParam(count($params_execute), $placeholder, PDO::PARAM_INT);
$verifiedParams[] = $item;
} elseif (is_string($item)) {
$sth->bindParam(count($params_execute), $placeholder, PDO::PARAM_STR);
$verifiedParams[] = $item;
}
}
$sth->execute($verifiedParams);
return $sth;
}
echo '<li><strong>Сокращенная ссылка</strong>: <a href="//' . $_SERVER['HTTP_HOST'] . '/&' . $existLink['short_key'] . '" target="_blank">http://' . $_SERVER['HTTP_HOST'] . '/&' . $existLink['short_key'] . '</a></li>';
RewriteRule ^&(.*) /redirect.php?key=$1 [L]
echo '<li><strong>Сокращенная ссылка</strong>: <a href="//' . $_SERVER['HTTP_HOST'] . '/&' . $existLink['short_key'] . '" target="_blank">http://' . $_SERVER['HTTP_HOST'] . '/&' . $existLink['short_key'] . '</a></li>';
RewriteRule ^(.*)/redirect.php?key= [L]
Не пишите так. Никогда!
DirectoryIndex index.php
Options All -Indexes
php_flag register_globals off
RewriteEngine on
RewriteRule ^(.*)$ /redirect.php?key=$1 [QSA,L]
<?php
include_once(__DIR__ . '/libraries/database.php');
$key = htmlspecialchars($_GET['key']) ?? null;
if (isset(db_query("SELECT url, short_key FROM short WHERE short_key= '" . $key . "'")->fetch()['url'])) {
$sthSelectSingle = db_query("SELECT url, short_key FROM short WHERE short_key= '" . $key . "'");
header('HTTP/1.1 301 Moved Permanently');
header('Location:' . $sthSelectSingle->fetch(PDO::FETCH_OBJ)->url);
} else {
exit('Ошибка при переадресации');
}
<code>array(1) { ["key"]=> string(0) "" }</code>
$_GET['key']
до ветвления. Значения нет, вот он и валится в ошибку.RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ redirect.php?key=$1 [L]
RewriteRule ^([a-zA-Z0-9]+)$ redirect.php?key=$1
function generateId($string = '', $len = 8)
{
$letters = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
$x = 0;
while ($x < $len) {
$string .= $letters[array_rand($letters)];
$x++;
}
return $string;
}
еще такая штука есть в стандартном наборе https://www.php.net/manual/ru/function.uniqid.php
$intval = time(); // время на текуший момент не сильно меняется если тестить в течении часа
/// выпилил кучу строк
'short_key' => $result . $intval
function generateId($string = '', $len = 8)
{
$letters = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
$x = 0;
while ($x < $len) {
$string .= $letters[array_rand($letters)];
$x++;
}
$db_check = db_query("SELECT short_key FROM short WHERE 1")->fetchAll();
foreach ($db_check as $value) {
if ($value['short_key'] === $string){
exit('Повтор ID');
}
}
return $string;
}
$db_check = db_query("select count(*) from short where short_key = '$key'")->fetchColumn();
if ($db_check) {
exit('Повтор ID'); //на самом деле надо перегенерить
}
uniqid()
$db_check = db_query("select count(*) from short where short_key = '$key'")->fetchColumn();
if ($db_check) {
exit('Повтор ID'); //на самом деле надо перегенерить
}
function generateId($string = '', $len = 8)
{
$letters = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
$x = 0;
while ($x < $len) {
$string .= $letters[array_rand($letters)];
$x++;
}
$db_check = db_query("select count(*) from short where short_key = '$string'")->fetch();
if (array_shift($db_check)) {
exit('Повтор ID');
}
return $string;
}
$string .= $letters[array_rand($letters)];
или может такой вариант (мне он больше нравиться :) ):if (array_shift($db_check)) {
$string = uniqid();
$string = substr($string, 0, $len);
}
function checkExist($string)
{
$db_check = db_query("select count(*) from short where short_key = '$string'")->fetch();
/// бла бла return true или false
/// if (array_shift($db_check)) { что это вообще? =)
}
function stringCheck($string)
{
if (checkExist($string)) {
stringCheck(genegateId());
} else {
return $string;
}
}
/// if (array_shift($db_check)) { что это вообще? =)
->fetchColumn
указал ->fetch
. Поэтому пришлось извлекать первый элемент массива.<?php
function generateId(string $string = '', int $len = 8): string
{
$letters = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
$x = 0;
while ($x < $len) {
$string .= $letters[array_rand($letters)];
$x++;
}
return $string;
}
function checkingCreatedId(string $string): bool
{
$db_check = db_query("select count(*) from short where short_key = '$string'")->fetchColumn();
if ($db_check) {
return true;
}
return false;
}
function getIdShortLink(int $id_length): string
{
$getId = generateId('', $id_length);
if (checkingCreatedId($getId)) {
getIdShortLink($id_length);
}
return $getId;
}
</spoiler>
declare(strict_types=1);
...ну это включает и отключает конверт типов
Строгая типизация
....
Для включения режима строгой типизации используется выражение declare в объявлении strict_types
function test(int $a): string
{
return 1 + $a;
}
RewriteRule
. Сама структура выглядит так:DirectoryIndex index.php
Options All -Indexes
php_flag register_globals off
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ web/ [L]
RewriteRule ((?s).*) web/index.php [L]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^([a-zA-Z0-9]+)$ /app/controllers/redirect.php?key=$1
</IfModule>
RewriteRule ^([a-zA-Z0-9]+)$ /app/controllers/redirect.php?key=$1
и так RewriteRule ^([a-zA-Z0-9]+)$ /redirect.php?key=$1
. Без разницы, не получилось ли из-за того что index.php убрали из корня нужно переписать правило это? Options All -Indexes
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} /web/([^\s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]
RewriteRule ^((?!web/).*)$ web/$1 [L,NC]
echo '<li><strong>Сокращенная ссылка</strong>: <a href="//' . $_SERVER['HTTP_HOST'] . '/' . $existLink['short_key'] . '" target="_blank">http://' . $_SERVER['HTTP_HOST'] . '/' . $existLink['short_key'] . '</a></li>';
echo '<li><strong>Сокращенная ссылка</strong>: <a href="//' . $_SERVER['HTTP_HOST'] . '/web/' . $existLink['short_key'] . '" target="_blank">http://' . $_SERVER['HTTP_HOST'] . '/web/' . $existLink['short_key'] . '</a></li>';
RewriteRule ^([a-zA-Z0-9]+)$ /app/controllers/redirect.php?key=$1
RewriteRule ^/web/([a-zA-Z0-9]+)$ /app/controllers/redirect.php?key=$1
RewriteRule ^web/([a-zA-Z0-9]+)$ /redirect.php?key=$1
и файл redirect.php переместил в web/.RewriteRule ^app/controllers/([a-zA-Z0-9]+)$ /redirect.php?key=$1
, то появляется вышеупомянутая 404, так как он корневой директорией считает теперь web/. ХЗ как побороть это на уровне htaccess (вариант /../app/controllers/ ... тоже не сработал :) ) RewriteCond %{THE_REQUEST} /web/([^\s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]
RewriteRule ^((?!web/).*)$ web/$1 [L,NC]
RewriteCond %{THE_REQUEST} /web/([^\s?]*) [NC]
у меня знакомый так сделал, но что то через пол года работы с кодом ушёл обратно, правда нашёл не совсем то, но тоже код
<?php
// Проверка авторизации
function isAuth()
{
$isAuth = false;
// если в сессии все ок, то access allowed
if (isset($_SESSION['is_auth']) && $_SESSION['is_auth']) {
$isAuth = true;
// если нет, то остается проверить куки
} elseif (isset($_COOKIE['login']) && isset($_COOKIE['pass'])) {
if (
$_POST['login'] == password_hash('1', PASSWORD_DEFAULT) && $_POST['pass'] == password_hash('2', PASSWORD_DEFAULT)) {
//$_SESSION['is_auth'] = true; - такой прием делается для того, что вновь поставить авторизовать по сессии пользователя, если проверку коки он прошел
$_SESSION['is_auth'] = true;
$isAuth = true;
}
}
return $isAuth;
}
//Сбрасываем авторизацию абсолютно любого пользователя – Сессия
if (isset($_SESSION['is_auth'])) {
unset($_SESSION['is_auth']);
}
//Куки
if (isset($_COOKIE['login'])) {
setcookie('login', '', time() - 1, '/');
}
if (isset($_COOKIE['pass'])) {
setcookie('pass', '', time() - 1, '/');
}
if (isset($_SESSION['flash_message'])) {
$information = $_SESSION['flash_message'];
unset($_SESSION['flash_message']);
}
if (count($_POST) > 0) {
if ($_POST['login'] == '1' && $_POST['pass'] == '2') {
$_SESSION['is_auth'] = true;
if (isset($_POST['remember'])) {
$login = password_hash('1', PASSWORD_BCRYPT, algorithmic_cost());
$pass = password_hash('2', PASSWORD_BCRYPT, algorithmic_cost());
setcookie('login', $login, time() + 3600 * 24 * 7, '/');
setcookie('pass', $pass, time() + 3600 * 24 * 7, '/');
}
if (isset($_SESSION['returnUrl'])) {
header('Location: /' . $_SESSION['returnUrl']);
unset($_SESSION['returnUrl']);
exit();
} else {
header('Location: /');
exit();
}
} else
$information = 'Неправильный логин или пароль!';
}
$isAuth = isAuth();
if (!$isAuth) {
$_SESSION['flash_message'] = 'Несанкционированный доступ! Авторизуйтесь.';
redirect_403();
} else {
$_SESSION['returnUrl'] = 'edit/article/' . $id_article;
$_SESSION['flash_message'] = 'Сессия была завершена. Повторите авторизацию.';
}
<?php
include_once('models/articles.php');
include_once('models/system.php');
include_once('models/auth.php');
include_once('functions/functions.php');
session_start();
$err404 = false;
// Подключение требуемого контроллера
$controller = trim($get_cnc[0] ?? 'main');
if ($controller === '' || !file_exists("controllers/{$controller}.php") || check_controller("controllers/{$controller}.php")) {
$err404 = true;
} else {
include("controllers/{$controller}.php");
}
if ($err404) {
redirect_404();
}
// Формирование страницы
echo views_connect('index.php', [
'preloader' => $preloader ?? null,
'title' => $title ?? null,
'navBar' => $navBar ?? null,
'form' => $form ?? null,
'switch_view' => $switch_view ?? null,
'all_articles' => $articles ?? null,
'single_article' => $single_article ?? null,
'infoblock' => $infoblock ?? null,
'get_cnc' => $get_cnc
]);