[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Open Server чудит
Страницы: 1, 2, 3, 4
FatCat
Решил и я перебраться на локалке под Open Server И в первый же день 2 странных глюка:

1. Кодировка 1251 из БД. Из MySQL приходит нормально, из MySQLi знаками вопроса.

2. Не понимает серверные пути:
Так пишет ошибку "не найден файл"
$ibforums->vars['base_dir'] = "D:/OSPanel/domains/localhost";
$fh = fopen($ibforums->vars['base_dir']."/sources/file.php", "w");
Так работает
$ibforums->vars['base_dir'] = dirname(__FILE__);
$fh = fopen($ibforums->vars['base_dir']."/sources/file.php", "w");
При этом:
die(dirname(__FILE__));
// D:/OSPanel/domains/localhost


_____________
Бесплатному сыру в дырки не заглядывают...
inpost
1. Mysqli используешь? Указываешь кодировку через mysqli_set_charset после соединения ?
Сюда же, посмотри переменные MySQL, какая там кодировка выставлена:
user posted image

2. Попробуй в одинарных кавычках. Попробуй 2 строки сравнить:
'D:/OSPanel/domains/localhost' === __DIR__
Тут, увы, не подскажу вот так, чтобы сразу знал ответ (по второму пункту).

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
FatCat
Цитата (inpost @ 6.04.2018 - 13:47)
Mysqli используешь? Указываешь кодировку через mysqli_set_charset после соединения ?

    function connect() {

$this->connection_id = new mysqli( $this->obj['sql_host'],
$this->obj['sql_user'],
$this->obj['sql_pass'],
$this->obj['sql_database']
);

if($this->connection_id->connect_errno) {
$this->fatal_error($this->connection_id->connect_error);
}
$this->connection_id->set_charset('cp1251');
return 1;
}



Цитата (inpost @ 6.04.2018 - 13:47)
Сюда же, посмотри переменные MySQL

Не понял где ты это смотришь.
Но сомневаюсь, что проблема в настройках: эта же БД беспроблемно работает под MySQLi и под денвером, и на сервере (наш форум).


Цитата (inpost @ 6.04.2018 - 13:47)
Попробуй в одинарных кавычках. Попробуй 2 строки сравнить

Спасибо, попробую.
Под денвером код работает корректно. На сервере путь другой, но тоже без проблем работает строка.

_____________
Бесплатному сыру в дырки не заглядывают...
killer8080
Цитата (FatCat @ 6.04.2018 - 10:21)
Не понимает серверные пути:
Так пишет ошибку "не найден файл"
$ibforums->vars['base_dir'] = "D:/OSPanel/domains/localhost";
$fh = fopen($ibforums->vars['base_dir']."/sources/file.php", "w");
Так работает
$ibforums->vars['base_dir'] = dirname(__FILE__);
$fh = fopen($ibforums->vars['base_dir']."/sources/file.php", "w");

такого не может быть. Между этими двумя строчками есть ещё какой то код? Возможно есть что то, что модифицирует значение $ibforums->vars['base_dir']?
inpost
FatCat
Если PMA используешь, то сверху вкладка есть "Переменные", там в поиск вбиваешь charset и получишь список.

Ещё можно обойтись PMA, достаточно запрос show variables запустить.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
killer8080
Цитата (FatCat @ 7.04.2018 - 09:18)
$this->connection_id->set_charset('cp1251');

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

Цитата (FatCat @ 7.04.2018 - 09:18)
Не понял где ты это смотришь.

SHOW VARIABLES LIKE '%char%';
FatCat
Цитата (killer8080 @ 7.04.2018 - 14:01)
кодировка базы character_set_database не соответствует реальной кодировке данных в ней

MySQLi не сообтветствует, а в MySQL соответствует одна и та же БД? Так может быть?

Цитата (inpost @ 7.04.2018 - 12:19)
запрос show variables запустить

character_set_client	utf8
character_set_connection cp1251
character_set_database cp1251
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8

На сервере то же самое, и при этом на сервере MySQLi отдает нормальный текст - мы это видим на форуме.

_____________
Бесплатному сыру в дырки не заглядывают...
killer8080
Цитата (FatCat @ 7.04.2018 - 20:52)
MySQLi не сообтветствует, а в MySQL соответствует одна и та же БД? Так может быть?

Нет, не может. Очевидно БД всё таки разные. Когда кодировка клиента и базы совпадает - субд отдаёт данные как есть, если нет, то конвертирует налету. Символы, которые не удаётся корректно конвертировать, подменяются на "?". В коде ты задал cp1251, раз субд пытается конвертировать кодировку, значит у бд|таблицы|поля другой чарсет, по другому и быть не может. Тот факт, что конвертация фейлится говорит что данные не в той кодировке на самом деле, что задана для бд|таблицы|поля.
На счёт разного поведения этих двух апи, думаю эксперимент был не чистым и сервера мускула всё таки были разными. Возможно денвер не был корректно закрыт, субд от опенсервера вообще не стартанула, и конект был к серверу денвера, ну как возможный вариант rolleyes.gif
Ну это в общем легко проверить повторным экспериментом.
FatCat
Цитата (killer8080 @ 7.04.2018 - 21:53)
Очевидно БД всё таки разные.

Это исключено.
Я установил опен-сервер на новый ноутбук, сипекс-дампером снял дамп базы с сервера и развернул в ноутбуке. То есть, в этом ноутбуке есть только одна БД, других нет.

В движке форума можно переключаться между драйверами MySQLi и MySQL, ничего не меняя в настройках опен-сервера.


Цитата (killer8080 @ 7.04.2018 - 21:53)
Когда кодировка клиента и базы совпадает - субд отдаёт данные как есть

Если посмотреть в текстовом режиме сами файлы БД, они в кодировке utf8. Но все настройки сделаны на 1251: и сама БД, и все таблицы, и set_charset('cp1251') при установке соединения с БД.

_____________
Бесплатному сыру в дырки не заглядывают...
inpost
Где-то пол года назад как раз видел таблицу кракозябр :) Загуглил и нашел:
http://cyclowiki.org/wiki/%D0%9A%D1%80%D0%...%B1%D1%80%D1%8B

Таким образом можешь определить из какой кодировки в какую идёт.

FatCat
character_set_client	utf8
character_set_connection cp1251
character_set_database cp1251
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8

Это каша, неплохо было бы привести всё к одной кодировке при условии, если все таблицы в этой кодировке. Недавно смотрел старую версию какого-то форума, так у него половина таблиц в utf8, а половина в cp1251. Я бы советовал начать просматривать как раз с просмотра кодировки всех таблиц и полей.

Допустим в PMA:
user posted image
Далее сами таблицы:
user posted image

Так уже привык к интерфейсу, что совсем не помню базовые команды чтобы вывести все таблицы, поля и их кодировки. Но я бы начал именно с этого. Посмотрел какая кодировка указана для колонки, которая отдаёт кракозябру на сервере.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
killer8080
Цитата (FatCat @ 7.04.2018 - 22:48)
Это исключено.
Я установил опен-сервер на новый ноутбук, сипекс-дампером снял дамп базы с сервера и развернул в ноутбуке. То есть, в этом ноутбуке есть только одна БД, других нет.

Странно user posted image
подозреваю сайпекс и накосячил с кодировками, зачем он нужен когда есть штатные средства?


var_dump($this->connection_id->set_charset('cp1251'));

что выводит var_dump ?

Цитата (inpost @ 7.04.2018 - 22:49)
которая отдаёт кракозябру на сервере.

так нет же там крокозябров, там вопросики user posted image
FatCat
Цитата (killer8080 @ 7.04.2018 - 23:13)
что выводит var_dump ?

bool(false)



Цитата (inpost @ 7.04.2018 - 22:49)
Я бы советовал начать просматривать как раз с просмотра кодировки всех таблиц и полей.

Все таблицы и все поля всех таблиц в 1251.


Цитата (killer8080 @ 7.04.2018 - 23:13)
подозреваю сайпекс и накосячил с кодировками, зачем он нужен когда есть штатные средства?

Простым копированием файлов БД с сервера на локалку получается ровно то же самое: знаки вопроса в MySQLi и всё нормально в MySQL.

_____________
Бесплатному сыру в дырки не заглядывают...
killer8080
Цитата (FatCat @ 8.04.2018 - 09:41)
bool(false)

вот мы и докапались до проблемы user posted image
Теперь надо выяснить, почему обламывается set_charset()
    function connect() {

$this->connection_id = new mysqli( $this->obj['sql_host'],
$this->obj['sql_user'],
$this->obj['sql_pass'],
$this->obj['sql_database']
);

if($this->connection_id->connect_errno) {
$this->fatal_error($this->connection_id->connect_error);
}
$this->connection_id->set_charset('cp1251');
var_dump($this->connection_id->error);
return 1;
}

что в error?
walerus
Может я конечно не о том, но сам на таком попался :lol:

mysql_set_charset
bool mysql_set_charset ( string $charset [, resource $link_identifier = NULL ] )


mysqli_set_charset
bool mysqli_set_charset ( mysqli $link , string $charset )

т.е. идентификатор и $charset, стоят наоборот

зы:
Игорь_Vasinsky разул мне глаза в тот раз :rolleyes:
inpost
walerus
Это же ООП подход.

FatCat
http://php.net/manual/ru/mysqli.set-charset.php
Если return false, то глянь в $this->connection_id->error , думаю с этого надо начать, определить что за ошибка у тебя пишется.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.