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

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']))) . "'");
}
при вводе на латинице все нормально обрабатываеться и попадает в базу данных, но если прописать кирилице... в базу попадает пустая стока...
Так вот вопрос подскажите в чем может быть проблема? Ссылки решил формировать по загаловку товара и не извесно на каком языке клиент будет вводить название.
 
1 вариант - неверная кодировка базы данных
2 вариант метод escape компонента db обрабатывает строку так, чо вырезает из нее всю кириллицу.
 
1 вариант - неверная кодировка базы данных
2 вариант метод escape компонента db обрабатывает строку так, чо вырезает из нее всю кириллицу.
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();
  	}	
}
?>
 
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();
  	}	
}
?>

Ну а дальше? Метод 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'] содержит то, что нужно.
 
вот функция 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($data, ENT_COMPAT);
		}

		return $data;
	}
}
?>

а вот функция clean и здесь тоже вроде бы все нормально... так что непонятно вообще почему так происходит
 
вот функция escape
а вот функция clean и здесь тоже вроде бы все нормально... так что непонятно вообще почему так происходит

Вот так сделайте
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'] - что выводится на экран?
 
string(12) "ээпплл" вот что выводит если кирилицей прописать.... независимо обрабатывать функциями регистра и replace или нет... латиница все ок ) не это и понятно

Кажысь я понял в чем дело... если этот текст еще и обработать strtolower то это будет совсем другое... того чего просто нет... поэтому и попадает пустая строка... только вот как в этом случае быть ?
 
mb_convert_encoding функция такая
$str = mb_convert_encoding($str, "UTF-8", "cp1251");

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

ну,мне по крайней мере так кажется.
 
если этот текст еще и обработать strtolower то это будет совсем другое... того чего просто нет... поэтому и попадает пустая строка... только вот как в этом случае быть ?
для мультибайтовой кодировки есть 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.
 
кстати скорее всего в htmlspecialchars() и решение проблемы.
была подобная проблемка с кодировкой,решал ею.
 
Назад
Сверху