Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP+MySQL] Проблемы с кодировкой или что-то другое? / 19 сообщений из 19, страница 1 из 1
29.05.2013, 16:25
    #38278806
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
Передаю в скрипт через POST-запрос данные для добавления в базу на base64. В скрипте декодирую, распарсиваю и добавляю в БД.

$param_mas = explode("\r\n",$param);
$file_name = $param_mas[0];

и потом если выполнять запрос:
$query = "INSERT INTO files (f_first_letter, f_filename) VALUES('".strtoupper($file_name[0])."','".$file_name."')";

то запись не добавляется, а если перед выполнением запроса написать
$file_name = 'µрёрµҐ ±іАы°ьё® Б¦°Е234.LNK';
то всё нормально работает - такая строка добавляется в базу

Что интересно, если вызвать echo $file_name (в случае с $file_name = $param_mas[0];), то имя файла выводится такое - как я передал µрёрµҐ ±іАы°ьё® Б¦°Е234.LNK.


Даже не знаю приблизительно в чем именно проблема - в php или в чем-то другом?

Модератор:
Random2 , не забываем про существование кнопок "SRC" и "Предварительный просмотр"!
...
Рейтинг: 0 / 0
29.05.2013, 21:02
    #38279285
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
Random2то запись не добавляетсяНу не просто же так она не добавляется. Откройте для себя mysql_error(), чтоли...

Сама по себе строка кажется весьма странной, если только это не банальный бардак в кодировках. Да, функция mysql_real_escape_string() пропущена здесь случайно или она реально не использована?

Random2если вызвать echoА echo не всю правду говорит. Вместо echo удобнее использовать var_dump(). Все же, оно более информативно.
...
Рейтинг: 0 / 0
30.05.2013, 11:48
    #38279893
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
МодераторRandom2, не забываем про существование кнопок "SRC" и "Предварительный просмотр"!
Думал, что исходный код в 1-2 строки можно без SRC вставлять. На будущее учту.

vkle ,
Прошу прощения что сразу не уточнил. Дело в том, что MySQL или PHP (незнаю кто виноват) думает почему-то что строка пустая. А поле f_filename в базе уникально, поэтому после вызова mysql_errno() получаю текст ошибки
авторERROR 1062 - Duplicate entry '' for key 'f_filename'

Имя файла в такой кодировке мне досталось от предыдущей базы, которую заполнял не я, но мне нужно ее использовать "как есть". Так что здесь не моя заслуга абракадабры, но тем не менее хотелось бы и такое имя файла обработать нормально, чтобы запись добавилась в базу.

Попробовал функцию mysql_real_escape_string - результат не изменился. Думаю, тут дело все же в кодировке.

Попробую подробней описать, что у меня есть, используя также var_dump.

1. В самом начале получаю и обрабатываю параметр.
Код: php
1.
2.
3.
$param = base64_decode($_REQUEST['param']);	
$param_mas = explode("\r\n",$param);
var_dump($param_mas);


Вижу, что первый параметр (имя файла) - здесь правильный, т.е. здесь всё ОК:
array(14) { [0]=> string(24) "µрёрµҐ ±іАы°ьё® Б¦°Е.LNK"

2. Далее идет вот такой код
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
$file_name = mysql_real_escape_string($param_mas[0]);
$file_id;
echo "<br>checking filename...: ".$file_name;
	
$query = "SELECT f_id FROM files WHERE f_filename='".$file_name."'";		
$query_result = mysql_query($query);	
if (mysql_num_rows($query_result) == 0)
{
    echo "<br>inserting new file...: ".$file_name;
    $query = "INSERT INTO files (f_first_letter, f_filename, f_text) VALUES('".strtoupper($file_name[0])."','".mysql_real_escape_string($file_name)."','')";
		
    if (mysql_query($query))
    {
        $query = "SELECT LAST_INSERT_ID()";		
	$query_result = mysql_query($query);
	$file_id = mysql_result($query_result, 0, 0);
    }
    else
        echo "<br>SQL-ERROR: ".mysql_errno()." - ".mysql_error();
}


Вывод в браузере такой:
checking filename...: µрёрµҐ ±іАы°ьё® Б¦°Е.LNK
inserting new file...: µрёрµҐ ±іАы°ьё® Б¦°Е.LNK
SQL-ERROR: 1062 - Duplicate entry '' for key 'f_filename'
То есть видно, что как только я передаю переменную file_name в запрос, то почему-то в запросе после этого переменная пустая. Но такая ситуация только, если я использую в 1м пункте код, который я указал выше. Если же написать явно, к примеру:
Код: php
1.
2.
$param = 'µрёрµҐ ±іАы°ьё® Б¦°Е911.LNK*new';
$param_mas = explode("*",$param);



То такой вариант отрабатывает нормально - в базу добавляется такая запись. Правда тут уже другой момент - strtoupper($file_name[0]) добавляет пустое значение, а должен быть символ µ. Но это уже следующий этап. Есть еще какие-нибудь соображения по этой проблеме?
...
Рейтинг: 0 / 0
30.05.2013, 12:06
    #38279934
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
Random2Думал, что исходный код в 1-2 строки можно без SRC вставлять.Да можно и сто, но читать уж больно утомительно.


Random2текст ошибки
авторERROR 1062 - Duplicate entry '' for key 'f_filename'Вероятно, такая запись уже существует в базе. Или индекс как-то скозявило что он думает что запись существует.
...
Рейтинг: 0 / 0
30.05.2013, 12:09
    #38279941
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
Random2Правда тут уже другой момент - strtoupper($file_name[0]) добавляет пустое значение, а должен быть символ µ. Но это уже следующий этап.Эммм... А какие тип данных в таблице и какие кодировки выставлены в соединении и в поле?
ИМХО: Вообще, для такой абракадабрицы лучше в таблицах использовать бинарный тип данных.
...
Рейтинг: 0 / 0
30.05.2013, 12:13
    #38279949
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
Хотя... еще фиг знает что там скрывается за $file_name[0] и какая кодировка преобразования используется для strtoupper.
...
Рейтинг: 0 / 0
30.05.2013, 12:43
    #38280026
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
vkleВероятно, такая запись уже существует в базе. Или индекс как-то скозявило что он думает что запись существует.
Смотрю в базе - такой записи нету, но есть пустая запись, а при добавлении в базу переменная $file_name почему-то пустая, отсюда и такая ошибка.

vkleЭммм... А какие тип данных в таблице и какие кодировки выставлены в соединении и в поле?
Character set: utf8
Collation: utf8_general_ci

При соединении кодировку не указываю, соединяюсь так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
if (!mysql_connect('localhost','test','')) 
{
    echo "Ошибка подключения к серверу MySQL\n";
    exit;
}
		
if (!mysql_select_db('test'))
...
...
Рейтинг: 0 / 0
30.05.2013, 13:29
    #38280121
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
Random2при добавлении в базу переменная $file_name почему-то пустая, отсюда и такая ошибка.А, ну знач проблема раньше чем переменная используется в запросе и пока нет смысла его рассматривать. Отслеживайте по шагам и найдете то место, где значение теряется.
...
Рейтинг: 0 / 0
30.05.2013, 15:04
    #38280292
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
Исходя из кода ниже (в $file_name содержится нужная строка), получается, что проблема в функции mysql_query? Т.к. она в упор не видит то, что в $query занесена не пустая строка, а текст?
Код: php
1.
2.
3.
4.
5.
$query = "INSERT INTO files (f_first_letter, f_filename, f_text) VALUES('".strtoupper($file_name[0])."','".$file_name."','')";		
echo "<br>".$query;
		
if (!mysql_query($query))
echo "<br>".mysql_error();



INSERT INTO files (f_first_letter, f_filename, f_text) VALUES('µ','µрёрµҐ ±іАы°ьё® Б¦°Е.LNK','')
Duplicate entry '' for key 'f_filename'
...
Рейтинг: 0 / 0
30.05.2013, 15:09
    #38280302
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
Еще интересное наблюдение. Пишу теперь так:
Код: php
1.
2.
3.
4.
5.
6.
$file_name = 'µрёрµҐ ±іАы°ьё® Б¦°Е001.LNK';
$query = "INSERT INTO files (f_first_letter, f_filename, f_text) VALUES('".strtoupper($file_name[0])."','".$file_name."','')";		
echo "<br>".$query;
		
if (!mysql_query($query))
echo "<br>".mysql_error();



Теперь всё ОК - mysql_query отрабатывает без проблем. Интересно, в чем разница, если я напрямую присваиваю эту абракадабру переменной и если получаю ее вот так
Код: php
1.
$file_name = $param_mas[0];



Что получается. Вот так проблем нету:
Код: php
1.
$file_name = 'µрёрµҐ ±іАы°ьё® Б¦°Е001.LNK';


А вот так есть:
Код: php
1.
$file_name = $param_mas[0];
...
Рейтинг: 0 / 0
30.05.2013, 15:11
    #38280309
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
бардак. вот как получишь вот это в нормальном виде, так поймешь.
...
Рейтинг: 0 / 0
30.05.2013, 15:13
    #38280316
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
Все-таки тут какая-то проблема с кодировкой.

Код: php
1.
2.
3.
4.
5.
6.
7.
$file_name = $param_mas[0];
var_dump($file_name);
//string(24) "µрёрµҐ ±іАы°ьё® Б¦°Е.LNK"

$file_name = 'µрёрµҐ ±іАы°ьё® Б¦°Е002.LNK';
var_dump($file_name);
//string(45) "µрёрµҐ ±іАы°ьё® Б¦°Е002.LNK" 


Длинна строки увеличивается вдвое и добавляются какие-то символы, когда я присваиваю напрямую. Что это значит?
...
Рейтинг: 0 / 0
30.05.2013, 15:15
    #38280321
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
ScareCrowбардак. вот как получишь вот это в нормальном виде, так поймешь.
Согласен, выглядит не очень красиво. Но у меня только два варианта - либо пропускать эти строки с абракадаброй, либо научится их добавлять в базу вместе со всеми остальными нормальными. Пропустить я всегда успею, а все же попытаться найти причину - было бы неплохо.
...
Рейтинг: 0 / 0
30.05.2013, 15:20
    #38280330
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
автора все же попытаться найти причину - было бы неплохо.
кодировка.
...
Рейтинг: 0 / 0
30.05.2013, 15:31
    #38280344
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
Предположу что где то выполнилось одно или несколько преобразований из многобайтовой по факту кодировки, которую считали однобайтовой, в многобайтовую. Если так, то придется разбираться с кодировками на абсолютно всех этапах, включая веб-браузер.

Random2Длинна строки увеличивается вдвое и добавляются какие-то символы, когда я присваиваю напрямую. Что это значит?Чудеса в наше время весьма редки. Предположу что при прямом присваивании используете многобайтовую, а смотрите в однобайтовой кодировке.
...
Рейтинг: 0 / 0
04.06.2013, 12:30
    #38284984
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
vkle, ScareCrow, спасибо за помощь. Все решилось так, что на сервере всё нормально добавляется в базу (на локалхосте под денвером - нет, причину выяснить не удалось). С выводом тоже были проблемы - вместо юникодовых и спецсимволов были знаки вопроса. Решил эту проблему вызовом команды:
Код: php
1.
mysql_set_charset('utf8');
...
Рейтинг: 0 / 0
04.06.2013, 12:48
    #38285012
phpz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
Random2,

Код: php
1.
mysql_set_charset()

вот она голая правда
...
Рейтинг: 0 / 0
04.06.2013, 12:49
    #38285019
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
SET NAMES ?
...
Рейтинг: 0 / 0
04.06.2013, 15:57
    #38285395
Random2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP+MySQL] Проблемы с кодировкой или что-то другое?
ScareCrow,

Там же, где нашел это решение написано:
авторЭта функция, кстати, заменяет все эти запросы:
Код: php
1.
2.
3.
4.
mysql_query ("set_client='utf8'");
mysql_query ("set character_set_results='utf8'");
mysql_query ("set collation_connection='utf8_general_ci'");
mysql_query ("SET NAMES utf8");



И работает значительно быстрее. Но появилась она только в PHP 5.2.3 и поддерживается MySQL сервером с версией >= 5.0.7. Если используете эту функцию, то подобные запросы можно не отправлять.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP+MySQL] Проблемы с кодировкой или что-то другое? / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]