Проблемы с добавление в базу данных

Тема в разделе "PHP", создана пользователем Uglik, 1 ноя 2011.

Модераторы: latteo
  1. Uglik

    Uglik

    Регистр.:
    8 окт 2008
    Сообщения:
    350
    Симпатии:
    14
    Здравствуйте
    Подскажите в чем может быть проблема
    Есть двиг opencart в нем вручную прописываюсть алисы ссылок решил автоматизировать это процесс но столкнулся с проблемой.
    нужно было алис который получаем из формы мотодом post перевести в нижний регистор и заменить пробелы на _
    вот контралер который получает данные
    PHP:
    if (isset($this->request->post['keyword'])) {
    $this->data['keyword'] = $this->request->post['keyword'];
    } elseif (!empty(
    $manufacturer_info)) {
    $this->data['keyword'] = $manufacturer_info['keyword'];
    } else {
    $this->data['keyword'] = '';
    }
    после этого данные попадают в модель где и происходит добавление в базу данных
    PHP:
    if ($data['keyword']) {
    $this->db->query("INSERT INTO " DB_PREFIX "url_alias SET query = 'manufacturer_id=" . (int)$manufacturer_id "', keyword = '" $this->db->escape($data['keyword']) . "'");
    }
    ПРИЧЕМ! Независимо латиницей или кирилицей прописать алис все нормально добавляеться а базу данных
    После изменения модели
    PHP:
    if ($data['keyword']) {
    $this->db->query("INSERT INTO " DB_PREFIX "url_alias SET query = 'manufacturer_id=" . (int)$manufacturer_id "', keyword = '" $this->db->escape(str_replace(" ","_",strtolower($data['keyword']))) . "'");
    }
    при вводе на латинице все нормально обрабатываеться и попадает в базу данных, но если прописать кирилице... в базу попадает пустая стока...
    Так вот вопрос подскажите в чем может быть проблема? Ссылки решил формировать по загаловку товара и не извесно на каком языке клиент будет вводить название.
     
  2. Nafania

    Nafania

    Регистр.:
    24 мар 2007
    Сообщения:
    167
    Симпатии:
    46
    1 вариант - неверная кодировка базы данных
    2 вариант метод escape компонента db обрабатывает строку так, чо вырезает из нее всю кириллицу.
     
  3. Uglik

    Uglik

    Регистр.:
    8 окт 2008
    Сообщения:
    350
    Симпатии:
    14
    1 Если бы с кадировкой базы данных были проблемы он бы кирилицу вообще не обробатывал... а так в оригинале все норма работает. перстает работать после обработки функциями
    2
    PHP:
    <?php
    final class DB {
        private 
    $driver;
        public function 
    __construct($driver$hostname$username$password$database) {
            if (
    file_exists(DIR_DATABASE $driver '.php')) {
                require_once(
    DIR_DATABASE $driver '.php');
            } else {
                exit(
    'Error: Could not load database file ' $driver '!');
            }
            
    $this->driver = new $driver($hostname$username$password$database);
        }
          public function 
    query($sql) {
            return 
    $this->driver->query($sql);
          }
        public function 
    escape($value) {
            return 
    $this->driver->escape($value);
        }
          public function 
    countAffected() {
            return 
    $this->driver->countAffected();
          }
          public function 
    getLastId() {
            return 
    $this->driver->getLastId();
          }    
    }
    ?>
     
  4. Nafania

    Nafania

    Регистр.:
    24 мар 2007
    Сообщения:
    167
    Симпатии:
    46
    Ну а дальше? Метод escape обращается к driver->escape - надо туда смотреть.

    Добавлено через 3 минуты
    А вообще это конечно вряд ли, что escape выкидывает что-то, но проверить не помешает.

    Здесь надо проверять вот это место
    PHP:
    if (isset($this->request->post['keyword'])) {
    $this->data['keyword'] = $this->request->post['keyword'];
    } elseif (!empty(
    $manufacturer_info)) {
    $this->data['keyword'] = $manufacturer_info['keyword'];
    } else {
    $this->data['keyword'] = '';
    }  
    и удостоверится, что $this->data['keyword'] содержит то, что нужно.
     
    Uglik нравится это.
  5. Uglik

    Uglik

    Регистр.:
    8 окт 2008
    Сообщения:
    350
    Симпатии:
    14
    вот функция escape
    PHP:
    public function escape($value) {
    return 
    mysql_real_escape_string($value$this->connection);
    }
    и удостоверится, что $this->data['keyword'] содержит то, что нужно.

    сюда все нормально попадает... если с обработкай тех фануций что я дописал то в латинице все good, а вот в кирилице нет. Хотя в оригинаде кирилица нормально проходит

    PHP:
    <?php
    final class Request {
        public 
    $get = array();
        public 
    $post = array();
        public 
    $cookie = array();
        public 
    $files = array();
        public 
    $server = array();
        
          public function 
    __construct() {
            
    $_GET $this->clean($_GET);
            
    $_POST $this->clean($_POST);
            
    $_REQUEST $this->clean($_REQUEST);
            
    $_COOKIE $this->clean($_COOKIE);
            
    $_FILES $this->clean($_FILES);
            
    $_SERVER $this->clean($_SERVER);
            
            
    $this->get $_GET;
            
    $this->post $_POST;
            
    $this->request $_REQUEST;
            
    $this->cookie $_COOKIE;
            
    $this->files $_FILES;
            
    $this->server $_SERVER;
        }
        
          public function 
    clean($data) {
            if (
    is_array($data)) {
                  foreach (
    $data as $key => $value) {
                    unset(
    $data[$key]);
                    
                    
    $data[$this->clean($key)] = $this->clean($value);
                  }
            } else { 
                  
    $data htmlspecialchars($dataENT_COMPAT);
            }

            return 
    $data;
        }
    }
    ?>
    а вот функция clean и здесь тоже вроде бы все нормально... так что непонятно вообще почему так происходит
     
  6. Nafania

    Nafania

    Регистр.:
    24 мар 2007
    Сообщения:
    167
    Симпатии:
    46
    Вот так сделайте
    PHP:
    if ($data['keyword']) {
    var_dump($data['keyword']);exit();
    $this->db->query("INSERT INTO " DB_PREFIX "url_alias SET query = 'manufacturer_id=" . (int)$manufacturer_id "', keyword = '" $this->db->escape(str_replace(" ","_",strtolower($data['keyword']))) . "'");
    }  
    Вместо запроса все должно преваться и будет выведено содержимое $data['keyword'] - что выводится на экран?
     
  7. Uglik

    Uglik

    Регистр.:
    8 окт 2008
    Сообщения:
    350
    Симпатии:
    14
    string(12) "ээпплл" вот что выводит если кирилицей прописать.... независимо обрабатывать функциями регистра и replace или нет... латиница все ок ) не это и понятно

    Кажысь я понял в чем дело... если этот текст еще и обработать strtolower то это будет совсем другое... того чего просто нет... поэтому и попадает пустая строка... только вот как в этом случае быть ?
     
  8. bajun

    bajun Постоялец

    Регистр.:
    26 окт 2011
    Сообщения:
    67
    Симпатии:
    3
    mb_convert_encoding функция такая
    $str = mb_convert_encoding($str, "UTF-8", "cp1251");

    но для начала тебе надо убедится что это именно в UTF кодировке все.

    ну,мне по крайней мере так кажется.
     
  9. thoth777

    thoth777

    Регистр.:
    28 ноя 2008
    Сообщения:
    314
    Симпатии:
    98
    для мультибайтовой кодировки есть mb_convert_case

    mb_convert_case ($str ,MB_CASE_LOWER,'UTF-8');
    и еще
    string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $charset [, bool $double_encode = true ]]] )
    принимает в качестве параметра кодировку. было бы нелишним указать ее.
    там кстати есть еще ништяки вроде double_encode
    если не хотите получить после всех редактирований строки вида &amp;amp; и т.п. double_encode ставьте в false.
     
    Uglik нравится это.
  10. bajun

    bajun Постоялец

    Регистр.:
    26 окт 2011
    Сообщения:
    67
    Симпатии:
    3
    кстати скорее всего в htmlspecialchars() и решение проблемы.
    была подобная проблемка с кодировкой,решал ею.
     
    Uglik нравится это.