Транслейт URL товаров

Тема в разделе "Обо всём", создана пользователем optimlab, 25 июл 2015.

  1. optimlab

    optimlab Продвинутый пользователь

    Сообщения:
    924
    Симпатии:
    240
    Привет, всем!
    Сделал скриптик клиенту который делает транслейт URL товаров из названий:
    PHP:
    <?php

    function rus2translit($string) {
        
    $converter = array(
            
    'а' => 'a',
            
    'б' => 'b',
            
    'в' => 'v',
            
    'г' => 'g',
            
    'д' => 'd',
            
    'е' => 'e',
            
    'ё' => 'e',
            
    'ж' => 'zh',
            
    'з' => 'z',
            
    'и' => 'i',
            
    'й' => 'y',
            
    'к' => 'k',
            
    'л' => 'l',
            
    'м' => 'm',
            
    'н' => 'n',
            
    'о' => 'o',
            
    'п' => 'p',
            
    'р' => 'r',
            
    'с' => 's',
            
    'т' => 't',
            
    'у' => 'u',
            
    'ф' => 'f',
            
    'х' => 'h',
            
    'ц' => 'c',
            
    'ч' => 'ch',
            
    'ш' => 'sh',
            
    'щ' => 'sch',
            
    'ь' => '',
            
    'ы' => 'y',
            
    'ъ' => '',
            
    'э' => 'e',
            
    'ю' => 'yu',
            
    'я' => 'ya',
    //      '&' => '-and-',
            
    'А' => 'A',
            
    'Б' => 'B',
            
    'В' => 'V',
            
    'Г' => 'G',
            
    'Д' => 'D',
            
    'Е' => 'E',
            
    'Ё' => 'E',
            
    'Ж' => 'Zh',
            
    'З' => 'Z',
            
    'И' => 'I',
            
    'Й' => 'Y',
            
    'К' => 'K',
            
    'Л' => 'L',
            
    'М' => 'M',
            
    'Н' => 'N',
            
    'О' => 'O',
            
    'П' => 'P',
            
    'Р' => 'R',
            
    'С' => 'S',
            
    'Т' => 'T',
            
    'У' => 'U',
            
    'Ф' => 'F',
            
    'Х' => 'H',
            
    'Ц' => 'C',
            
    'Ч' => 'Ch',
            
    'Ш' => 'Sh',
            
    'Щ' => 'Sch',
            
    'Ь' => '',
            
    'Ы' => 'Y',
            
    'Ъ' => '',
            
    'Э' => 'E',
            
    'Ю' => 'Yu',
            
    'Я' => 'Ya',
            );
        return 
    strtr($string$converter);
    }

    function 
    str2url($str) {
        
    // переводим в транслит
        
    $str rus2translit($str);
        
    // в нижний регистр
        
    $str strtolower($str);
        
    // заменям все ненужное нам на "-"
        
    $str preg_replace('~[^-a-z0-9_]+~u''-'$str);
        
    // удаляем начальные и конечные '-'
        
    $str trim($str"-");
        return 
    $str;
    }

    $localhost "localhost";
    $userDB "user";
    $passUserDB "pass";
    $nameDB "nameDB";


    // Выборка из базы данных в массив
    /* Подключение к серверу MySQL */
    $mysqli = new mysqli($localhost$userDB$passUserDB$nameDB);

    if (
    mysqli_connect_errno()) {
       
    printf("Подключение к серверу MySQL невозможно. Код ошибки: %s\n"mysqli_connect_error());
       exit;
    }

    /* Посылаем запрос серверу и делаем выборку id товаров и их названия*/
    if ($result $mysqli->query('SELECT `product_id`,`name` FROM `oc_product_description`')) {

        
    /* Выбираем результаты запроса в массив $row_mass: */
        
    while( $row $result->fetch_assoc() ){
            
    $row_mass[$row['product_id']] = str2url(html_entity_decode($row['name']));
        }

        
    /* Освобождаем память */
        
    $result->close();
    }

    // Обновляем данные URL товаров
    foreach ($row_mass as $key => $value) {
      
    // Удаляем старую запись URL товара
      
    $result $mysqli->query("DELETE FROM oc_url_alias WHERE query = 'product_id=" . (int)$key "'");

      
    // Вставляем новый URL товара
      
    if ($value) {
      
    $result $mysqli->query("INSERT INTO oc_url_alias SET query = 'product_id=" . (int)$key "', keyword = '" $value "'");
      }

      
    // Визуальная проверка
      
    printf("%s (%s)\n"$key$value );
    }

    /* Закрываем соединение */
    $mysqli->close();
    ?>
    На локалке сработало! Всё отлично! База обновилась..

    Но решил не переносить базу, а запустить скрипт прямо на сайте из корня: http://site.ru/translit.php
    И что я увидел: функция не сработала! WTF!!!!????(((
    Игнор кирилицы!
    Настройки и там и там одинаковые, кодировка таблиц родная по умолчанию одинаковая (MyISAM utf8_general_ci) .
    Голову сломал не понимаю причины.

    Локалка:
    OpenServer
    PHP 5.3
    Сервер баз данных:

    • Сервер: 127.0.0.1 via TCP/IP
    • Тип сервера: MySQL
    • Версия сервера: 5.5.41-log - MySQL Community Server (GPL)
    • Версия протокола: 10
    • Пользователь: root@localhost
    • Кодировка сервера: UTF-8 Unicode (utf8)

    Веб-сервер:

    • Apache/2.2.29 (Win32)
    • Версия клиента базы данных: libmysql - mysqlnd 5.0.8-dev - 20102224 - $Id: 731e5b87ba42146a687c29995d2dfd8b4e40b325 $
    • PHP расширение: mysqli
    Сервер:
    PHP 5.3
    Сервер баз данных:

    • Сервер: Localhost via UNIX socket
    • Программа: Percona Server
    • Версия программы: 5.5.35-33.0 - Percona Server (GPL), Release rel33.0, Revision 611
    • Версия протокола: 10
    • Пользователь: u0088268@localhost
    • Кодировка сервера: UTF-8 Unicode (utf8)

    Веб-сервер:

    • Apache/2.2.15 (CentOS)
    • Версия клиента базы данных: libmysql - 5.5.35
    • PHP расширение: mysqli

    Парни, у кого какие идеи?
     
    Последнее редактирование: 3 дек 2015
  2. Ален

    Ален Эксперт

    Сообщения:
    2.056
    Симпатии:
    640
    может заменить на (но это скорей всего не то)
    Код:
    html_entity_decode($row['name'],'',"UTF-8")
    я конечно не уверен, но дело явно в кодировки. Может сам массив надо еще преобразовать. Да и файл в utf-8 наверно надо сохранить.

    ну а еще попробуйте использовать http://www.php.net/mb_strstr вместо strstr, это на первом месте должно быть в списке проб))
     
    Последнее редактирование: 25 июл 2015