Search

Romua1d.ru
Категории: Скрипты

PHP скрипт для создания SLUG в базе данных

Всем привет! Вот только закончил создание ссылок SLUG в базе данных.
Была необходимость создать слуг в третьем поле, взяв ид и название статьи из двух других полей.

Сейчас подробно расскажу.

Так как мы работаем с русскими заголовками, нам нужны локали, подключаем их в шапку таким образом.

<?php
header('Content-type: text/html; charset=UTF-8');
// Set locale in UTF-8 Not supported in Windows
$locales = array("ru_RU.UTF8",
                    "Russian_Russia.65001",
                    "Russian_Russia.UTF8",
                    "ru_RU.UTF-8");
if (false === setlocale(LC_ALL, $locales)) {
// failed to set locale
}
?>

Настраиваем подключение к БД:

$link = mysql_connect('localhost', 'root', '')
    or die('Не удалось соединиться: ' . mysql_error());
echo 'Соединение успешно установлено';
mysql_select_db('123') or die('Не удалось выбрать базу данных');

Нам нужна функция для конвертации слуга:

function url_slug($str, $options = array()) {
 // Make sure string is in UTF-8 and strip invalid UTF-8 characters
 $str = mb_convert_encoding((string)$str, 'UTF-8', mb_list_encodings());
 
 $defaults = array(
  'delimiter' => '-',
  'limit' => null,
  'lowercase' => true,
  'replacements' => array(),
  'transliterate' => false,
 );
 
 // Merge options
 $options = array_merge($defaults, $options);
 
 $char_map = array(
  // Latin
  'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'AE', 'Ç' => 'C', 
  'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 
  'Ð' => 'D', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ő' => 'O', 
  'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ű' => 'U', 'Ý' => 'Y', 'Þ' => 'TH', 
  'ß' => 'ss', 
  'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'ae', 'ç' => 'c', 
  'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 
  'ð' => 'd', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ő' => 'o', 
  'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ű' => 'u', 'ý' => 'y', 'þ' => 'th', 
  'ÿ' => 'y',
  // Latin symbols
  '©' => '(c)',
  // Greek
  'Α' => 'A', 'Β' => 'B', 'Γ' => 'G', 'Δ' => 'D', 'Ε' => 'E', 'Ζ' => 'Z', 'Η' => 'H', 'Θ' => '8',
  'Ι' => 'I', 'Κ' => 'K', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Ξ' => '3', 'Ο' => 'O', 'Π' => 'P',
  'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Υ' => 'Y', 'Φ' => 'F', 'Χ' => 'X', 'Ψ' => 'PS', 'Ω' => 'W',
  'Ά' => 'A', 'Έ' => 'E', 'Ί' => 'I', 'Ό' => 'O', 'Ύ' => 'Y', 'Ή' => 'H', 'Ώ' => 'W', 'Ϊ' => 'I',
  'Ϋ' => 'Y',
  'α' => 'a', 'β' => 'b', 'γ' => 'g', 'δ' => 'd', 'ε' => 'e', 'ζ' => 'z', 'η' => 'h', 'θ' => '8',
  'ι' => 'i', 'κ' => 'k', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ξ' => '3', 'ο' => 'o', 'π' => 'p',
  'ρ' => 'r', 'σ' => 's', 'τ' => 't', 'υ' => 'y', 'φ' => 'f', 'χ' => 'x', 'ψ' => 'ps', 'ω' => 'w',
  'ά' => 'a', 'έ' => 'e', 'ί' => 'i', 'ό' => 'o', 'ύ' => 'y', 'ή' => 'h', 'ώ' => 'w', 'ς' => 's',
  'ϊ' => 'i', 'ΰ' => 'y', 'ϋ' => 'y', 'ΐ' => 'i',
  // Turkish
  'Ş' => 'S', 'İ' => 'I', 'Ç' => 'C', 'Ü' => 'U', 'Ö' => 'O', 'Ğ' => 'G',
  'ş' => 's', 'ı' => 'i', 'ç' => 'c', 'ü' => 'u', 'ö' => 'o', 'ğ' => 'g', 
  // Russian
  'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'Yo', 'Ж' => 'Zh',
  'З' => 'Z', 'И' => 'I', 'Й' => 'J', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O',
  'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
  'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sh', 'Ъ' => '', 'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'Yu',
  'Я' => 'Ya',
  'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'zh',
  'з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o',
  'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c',
  'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sh', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu',
  'я' => 'ya',
  // Ukrainian
  'Є' => 'Ye', 'І' => 'I', 'Ї' => 'Yi', 'Ґ' => 'G',
  'є' => 'ye', 'і' => 'i', 'ї' => 'yi', 'ґ' => 'g',
  // Czech
  'Č' => 'C', 'Ď' => 'D', 'Ě' => 'E', 'Ň' => 'N', 'Ř' => 'R', 'Š' => 'S', 'Ť' => 'T', 'Ů' => 'U', 
  'Ž' => 'Z', 
  'č' => 'c', 'ď' => 'd', 'ě' => 'e', 'ň' => 'n', 'ř' => 'r', 'š' => 's', 'ť' => 't', 'ů' => 'u',
  'ž' => 'z', 
  // Polish
  'Ą' => 'A', 'Ć' => 'C', 'Ę' => 'e', 'Ł' => 'L', 'Ń' => 'N', 'Ó' => 'o', 'Ś' => 'S', 'Ź' => 'Z', 
  'Ż' => 'Z', 
  'ą' => 'a', 'ć' => 'c', 'ę' => 'e', 'ł' => 'l', 'ń' => 'n', 'ó' => 'o', 'ś' => 's', 'ź' => 'z',
  'ż' => 'z',
  // Latvian
  'Ā' => 'A', 'Č' => 'C', 'Ē' => 'E', 'Ģ' => 'G', 'Ī' => 'i', 'Ķ' => 'k', 'Ļ' => 'L', 'Ņ' => 'N', 
  'Š' => 'S', 'Ū' => 'u', 'Ž' => 'Z',
  'ā' => 'a', 'č' => 'c', 'ē' => 'e', 'ģ' => 'g', 'ī' => 'i', 'ķ' => 'k', 'ļ' => 'l', 'ņ' => 'n',
  'š' => 's', 'ū' => 'u', 'ž' => 'z'
 );
 
 // Make custom replacements
 $str = preg_replace(array_keys($options['replacements']), $options['replacements'], $str);
 
 // Transliterate characters to ASCII
 if ($options['transliterate']) {
  $str = str_replace(array_keys($char_map), $char_map, $str);
 }
 
 // Replace non-alphanumeric characters with our delimiter
 $str = preg_replace('/[^\p{L}\p{Nd}]+/u', $options['delimiter'], $str);
 
 // Remove duplicate delimiters
 $str = preg_replace('/(' . preg_quote($options['delimiter'], '/') . '){2,}/', '$1', $str);
 
 // Truncate slug to max. characters
 $str = mb_substr($str, 0, ($options['limit'] ? $options['limit'] : mb_strlen($str, 'UTF-8')), 'UTF-8');
 
 // Remove delimiter from ends
 $str = trim($str, $options['delimiter']);
 
 return $options['lowercase'] ? mb_strtolower($str, 'UTF-8') : $str;
}

Создаем запрос и выполняем его,  здесь выбираем столбцы, с таблицы, в которой значение slug ничего не содержит:

$query2 = 'SELECT id, title, slug FROM nodes-news WHERE slug IS NULL';
$result2 = mysql_query($query2) or die('Запрос не удался: ' . mysql_error());

Выводим на экран таблицу, необязательно, она помогает видеть все результаты изменений, кроме тех, которые будут заноситься в таблицу:

echo 'Результат запроса содержит '.mysql_num_rows($result2).' строк<br/>';
echo "<table border='1'>";
echo "<tr><th>ID</th><th>TITLE</th><th>SLUG</th><th>NEW_SLUG</th>";
while ($row = mysql_fetch_array($result2))  
{
  $id = $row["id"];
  echo "<tr><th>".$row["id"]."</th><th>".$row["title"]."</th><th>".$row["slug"]."</th><th>".$row["id"]."-".url_slug($row["title"])."</th></tr>";
  $b_slug = $row["id"]."-".url_slug($row["title"]);
  mysql_query("UPDATE books SET slug = '$slug' WHERE ID='$id'");
}
echo "</table>";

Можно обрезать ее так, тогда просто надо ждать когда, файл полностью загрузится:

while ($row = mysql_fetch_array($result2))  
{
  $id = $row["id"];
  $b_slug = $row["id"]."-".url_slug($row["title"]);
  mysql_query("UPDATE books SET slug = '$slug' WHERE ID='$id'");
}

Скрипт использовался для замены 500.000 слугов. и вот я его предоставляю:

[sociallocker]
<?php
header('Content-type: text/html; charset=UTF-8');
// Set locale in UTF-8 Not supported in Windows
$locales = array("ru_RU.UTF8",
                    "Russian_Russia.65001",
                    "Russian_Russia.UTF8",
                    "ru_RU.UTF-8");
if (false === setlocale(LC_ALL, $locales)) {
// failed to set locale
}
?>

<?php
$link = mysql_connect('localhost', 'root', '')
    or die('Не удалось соединиться: ' . mysql_error());
echo 'Соединение успешно установлено';
mysql_select_db('123') or die('Не удалось выбрать базу данных');


function url_slug($str, $options = array()) {
 // Make sure string is in UTF-8 and strip invalid UTF-8 characters
 $str = mb_convert_encoding((string)$str, 'UTF-8', mb_list_encodings());
 
 $defaults = array(
  'delimiter' => '-',
  'limit' => null,
  'lowercase' => true,
  'replacements' => array(),
  'transliterate' => false,
 );
 
 // Merge options
 $options = array_merge($defaults, $options);
 
 $char_map = array(
  // Latin
  'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'AE', 'Ç' => 'C', 
  'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 
  'Ð' => 'D', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ő' => 'O', 
  'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ű' => 'U', 'Ý' => 'Y', 'Þ' => 'TH', 
  'ß' => 'ss', 
  'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'ae', 'ç' => 'c', 
  'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 
  'ð' => 'd', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ő' => 'o', 
  'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ű' => 'u', 'ý' => 'y', 'þ' => 'th', 
  'ÿ' => 'y',
  // Latin symbols
  '©' => '(c)',
  // Greek
  'Α' => 'A', 'Β' => 'B', 'Γ' => 'G', 'Δ' => 'D', 'Ε' => 'E', 'Ζ' => 'Z', 'Η' => 'H', 'Θ' => '8',
  'Ι' => 'I', 'Κ' => 'K', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Ξ' => '3', 'Ο' => 'O', 'Π' => 'P',
  'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Υ' => 'Y', 'Φ' => 'F', 'Χ' => 'X', 'Ψ' => 'PS', 'Ω' => 'W',
  'Ά' => 'A', 'Έ' => 'E', 'Ί' => 'I', 'Ό' => 'O', 'Ύ' => 'Y', 'Ή' => 'H', 'Ώ' => 'W', 'Ϊ' => 'I',
  'Ϋ' => 'Y',
  'α' => 'a', 'β' => 'b', 'γ' => 'g', 'δ' => 'd', 'ε' => 'e', 'ζ' => 'z', 'η' => 'h', 'θ' => '8',
  'ι' => 'i', 'κ' => 'k', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ξ' => '3', 'ο' => 'o', 'π' => 'p',
  'ρ' => 'r', 'σ' => 's', 'τ' => 't', 'υ' => 'y', 'φ' => 'f', 'χ' => 'x', 'ψ' => 'ps', 'ω' => 'w',
  'ά' => 'a', 'έ' => 'e', 'ί' => 'i', 'ό' => 'o', 'ύ' => 'y', 'ή' => 'h', 'ώ' => 'w', 'ς' => 's',
  'ϊ' => 'i', 'ΰ' => 'y', 'ϋ' => 'y', 'ΐ' => 'i',
  // Turkish
  'Ş' => 'S', 'İ' => 'I', 'Ç' => 'C', 'Ü' => 'U', 'Ö' => 'O', 'Ğ' => 'G',
  'ş' => 's', 'ı' => 'i', 'ç' => 'c', 'ü' => 'u', 'ö' => 'o', 'ğ' => 'g', 
  // Russian
  'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'Yo', 'Ж' => 'Zh',
  'З' => 'Z', 'И' => 'I', 'Й' => 'J', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O',
  'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
  'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sh', 'Ъ' => '', 'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'Yu',
  'Я' => 'Ya',
  'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'zh',
  'з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o',
  'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c',
  'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sh', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu',
  'я' => 'ya',
  // Ukrainian
  'Є' => 'Ye', 'І' => 'I', 'Ї' => 'Yi', 'Ґ' => 'G',
  'є' => 'ye', 'і' => 'i', 'ї' => 'yi', 'ґ' => 'g',
  // Czech
  'Č' => 'C', 'Ď' => 'D', 'Ě' => 'E', 'Ň' => 'N', 'Ř' => 'R', 'Š' => 'S', 'Ť' => 'T', 'Ů' => 'U', 
  'Ž' => 'Z', 
  'č' => 'c', 'ď' => 'd', 'ě' => 'e', 'ň' => 'n', 'ř' => 'r', 'š' => 's', 'ť' => 't', 'ů' => 'u',
  'ž' => 'z', 
  // Polish
  'Ą' => 'A', 'Ć' => 'C', 'Ę' => 'e', 'Ł' => 'L', 'Ń' => 'N', 'Ó' => 'o', 'Ś' => 'S', 'Ź' => 'Z', 
  'Ż' => 'Z', 
  'ą' => 'a', 'ć' => 'c', 'ę' => 'e', 'ł' => 'l', 'ń' => 'n', 'ó' => 'o', 'ś' => 's', 'ź' => 'z',
  'ż' => 'z',
  // Latvian
  'Ā' => 'A', 'Č' => 'C', 'Ē' => 'E', 'Ģ' => 'G', 'Ī' => 'i', 'Ķ' => 'k', 'Ļ' => 'L', 'Ņ' => 'N', 
  'Š' => 'S', 'Ū' => 'u', 'Ž' => 'Z',
  'ā' => 'a', 'č' => 'c', 'ē' => 'e', 'ģ' => 'g', 'ī' => 'i', 'ķ' => 'k', 'ļ' => 'l', 'ņ' => 'n',
  'š' => 's', 'ū' => 'u', 'ž' => 'z'
 );
 
 // Make custom replacements
 $str = preg_replace(array_keys($options['replacements']), $options['replacements'], $str);
 
 // Transliterate characters to ASCII
 if ($options['transliterate']) {
  $str = str_replace(array_keys($char_map), $char_map, $str);
 }
 
 // Replace non-alphanumeric characters with our delimiter
 $str = preg_replace('/[^\p{L}\p{Nd}]+/u', $options['delimiter'], $str);
 
 // Remove duplicate delimiters
 $str = preg_replace('/(' . preg_quote($options['delimiter'], '/') . '){2,}/', '$1', $str);
 
 // Truncate slug to max. characters
 $str = mb_substr($str, 0, ($options['limit'] ? $options['limit'] : mb_strlen($str, 'UTF-8')), 'UTF-8');
 
 // Remove delimiter from ends
 $str = trim($str, $options['delimiter']);
 
 return $options['lowercase'] ? mb_strtolower($str, 'UTF-8') : $str;
}

$query2 = 'SELECT id, title, slug FROM nodes-news WHERE b_slug IS NULL';
$result2 = mysql_query($query2) or die('Запрос не удался: ' . mysql_error());

echo 'Результат запроса содержит '.mysql_num_rows($result2).' строк<br/>';
echo "<table border='1'>";
echo "<tr><th>ID</th><th>TITLE</th><th>SLUG</th><th>NEW_SLUG</th>";
while ($row = mysql_fetch_array($result2))  
{
  $id = $row["id"];
  echo "<tr><th>".$row["id"]."</th><th>".$row["title"]."</th><th>".$row["slug"]."</th><th>".$row["id"]."-".url_slug($row["title"])."</th></tr>";
  $b_slug = $row["id"]."-".url_slug($row["title"]);
  mysql_query("UPDATE books SET slug = '$slug' WHERE ID='$id'");
}
echo "</table>";
    
mysql_close($link);
?>
[/sociallocker]
Плагин рейтинга создан автором этого блога. Буду очень признателен, если вы сможете его поддержать (ссылка)

p.s. Если статья была полезной и вас переполняет чувство благодарности, можете поддержать меня долларом на патреоне

Romuald Shmidtelson

Web Developer. I have expirience in FrontEnd, Backend, Devops. PHP, Python, Javascript (Vue.js, React.js)

Смотреть комментарии

  • Нет ли случаем другие языки?
    Китайский, арабский, хинди и другие?

    • На другие нет. Суть то вообще только русский транслитерировать

Недавние Посты

Как получить первый заказ на фрилансе

Получение первого заказа на фрилансе может быть вызовом, особенно для новичков, которые еще не имеют…

1 год назад

Топ 7 css фреймворков 2021 года

Разработка сайтов и веб-приложений стала в наше время неизбежной потребностью. Тем не менее, существует несколько способов…

2 года назад

Что такое семантическое ядро и как его использовать для продвижения сайта?

Компании и специалисты по маркетингу тратят много времени и денег на изучение языка поисковых систем,…

2 года назад

Что такое адаптивные изображения? Как правильно использовать srcset.

Адаптивные изображения - это набор методов, используемых для загрузки правильного изображения в зависимости от разрешения…

3 года назад

Что такое Политика конфиденциальности для сайта и для чего она нужна?

Политика конфиденциальности - это документ, в котором подробно описывается, как компания или организация обрабатывает любую…

3 года назад

Кто такой вебмастер?

В современном мире много специалистов занятых поддержанием работы сайтов, и довольно часто многих из них…

3 года назад