/// 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>
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);
}
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 short_key FROM short WHERE 1")->fetchAll();
foreach ($db_check as $value) {
if ($value['short_key'] === $string){
exit('Повтор ID');
}
}
return $string;
}
еще такая штука есть в стандартном наборе https://www.php.net/manual/ru/function.uniqid.php
$_GET['key']
до ветвления. Значения нет, вот он и валится в ошибку.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>
Не пишите так. Никогда!
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]
Единственное, что я до конца и не понял – вверху скрипта, где планируется использовать строгую типизацию нужно прописывать
declare(strict_types=1);
...Видел и с объявление declare и без :\