Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!
Пробую загрузить изображение в базу, поле в базе с типом LONGBLOB, файл заливается не до конца. Файлы маленькие - 50...500 Кб. Пробовал загружать через POST запрос и через phpMyAdmin - результат одинаков. Один и тот же файл при загрузке обрывается на том же месте. Разные файлы - на разных местах. Например, файл в 350 кб обрезается до 307 кб, 100 кб - до 90 кб. Символы, на которых идет обрезка данных, у каждого файла разные. Перед загрузкой через POST пробовал различные варианты экранирования - addslashes, mysql_escape_string, mysql_real_escape_string - результат одинаков. Пробовал менять кодировку соединения с базой через mysql_query(«SET NAMES 'utf8'») и mysql_set_charset(«utf8») - не помогает. Естественно, облазил уже все поисковики - похожей проблемы не нашел. Попробовал на другом сервере - эти же скрипты и базы работают без проблем. Значит, проблема не в скриптах, а в настройках сервера. Но вот в каких? Сравнить настройки на удаленном сервере с моими настройками - нет возможности. Помогите советом. Где может быть у меня ошибочка?
Неактивен
Почему нельзя сравнить настройки? Попробуйте
SHOW GLOBAL VARIABLES;
и разместите здесь.
Приведите также SHOW CREATE TABLE `имя_таблицы`;
Неактивен
Благодарю за подсказку. А то я сразу хотел сравнивать файлы my.cnf
Во вложенном файле - вывод SHOW GLOBAL VARIABLES
колонка Remote - настройки удаленного сервера, где запись файла происходит нормально
колонка Local - мой сервер
Файл my.cnf моего сервера:
---------------------
[mysqld]
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M
max_allowed_packet = 2M
query_cache_type=1
query_cache_limit=2M
join_buffer_size=256M
innodb_buffer_pool_instances=1
#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
sql_mode=TRADITIONAL
---------------------
SHOW CREATE TABLE `userdata`;
CREATE TABLE `userdata` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(40) NOT NULL,
`pass` varchar(40) CHARACTER SET utf16 NOT NULL,
`post_id` int(11) NOT NULL,
`photo` mediumblob NOT NULL,
`imgtype` varchar(20) NOT NULL,
PRIMARY KEY (`user_id`), UNIQUE KEY `login` (`login`), KEY `post_id` (`post_id`))
ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
Отредактированно marvitalik (02.12.2015 13:26:58)
Неактивен
Скорее всего проблем все-таки внутри скрипта PHP. Обрезание часто происходит при работе текстовых утилит, типа iconv, которые могут вести себя по-разному на разных версиях при разных настройках PHP. Попробуйте использовать addslashes() вместо mysql_escape_string().
Неактивен
addslashes пробовал (писал об этом в первом сообщении)
да и через добавление строки в таблицу через phpMyAdmin происходит обрезание файла на том же месте.
Нормально вставляются только очень маленькие файлы, примерно до 5 кб
Неактивен
Посмотрите еще на настройки httpd и хватает ли памяти. Попробуйте в скрипте, который обрабатывает POST проверить длину файла - сохранилась ли она?
print_r($_FILES)
После чтения содержимого файла в переменную напечатайте длину этой переменной. Потом сравните с тем, что попало в базу.
Неактивен
httpd гляну, спасибо.
Памяти вроде должно хватать, несколько раз наблюдал, что показывает top - всегда было свободной памяти не менее 70...100 Мб, файл подкачки вообще не использовался (на сервере 2 Гб ОЗУ).
Размер файла в массиве $_FILES отображается правильный, это смотрел уже.
Пробовал загружать файл через POST на сервер, копировать в другую папку а потом уже оттуда считывать - то же самое.
Неактивен
А длину строки после addslashes проверяли? Проверьте также длину итогового sql-запроса. Подозреваю, что где-то строка портится до отправки в базу данных.
> Символы, на которых идет обрезка данных, у каждого файла разные.
а проверялись ли символы, которые идут после последнего загруженного в базу?
Неактивен
rgbeast написал:
А длину строки после addslashes проверяли? Проверьте также длину итогового sql-запроса. Подозреваю, что где-то строка портится до отправки в базу данных.
тоже посмотрю. Но думаю не в строке дело, т.к. на другом сервере срабатывает нормально, те же скрипты и те же базы.
rgbeast написал:
> Символы, на которых идет обрезка данных, у каждого файла разные.
а проверялись ли символы, которые идут после последнего загруженного в базу?
Да, те что после обрезки - тоже разные, смотрел на нескольких файлах.
Только что попробовал вставить текстовый файл с содержимым "test test ..." (500 kb) - вставляется нормально.
А если на русском "тест тест ..." - 502 кб режет до 203 кб
Если такой же на 175 кб загрузить - режет до 71 кб
Отредактированно marvitalik (02.12.2015 15:16:51)
Неактивен
Подскажите, можно ли добавить файл в таблицу с полем BLOB через mysql консоль?
Чтобы попробовать миновать использование php.
Что-то мне начинает казаться, что собака зарыта в PHP, придется перекомпилировать.
вывод phpinfo()
PHP Version 5.5.11
...
Client API version mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $
...
это нормально?
Неактивен
mysqlnd 5.0.11-dev: dev - означает, что это нестабильная версия PHP-MySQL клиента. Попробуйте обновить пакет php-mysql
А какая версия сервера MySQL?
Неактивен
[root@server ~]# mysql -V
mysql Ver 14.14 Distrib 5.6.17, for Linux (i686) using EditLine wrapper
Неактивен
Сервер нормальный, но может быть бага в нестабильной версии коннектора php-mysql. Как из консоли загрузить файл в blob не знаю
Неактивен