Обращаюсь к вам за очередной помощь. написал скрипт загрузки файлов в БД, он никаких ошибок не выдает а значит по идее должен работать, но не работает! Коннект с базой есть.
Почему же он тогда не работает?
<?php
// ЗАГРУЗКА ФАЙЛОВ В БД!!!
// Название таблицы
$table="test10";
// выполняем скрипт записи файла в БД
if($_POST['sent'])
{
if(!is_uploaded_file($_FILES['myfile']['tmp_name']))
{$error="<br>Загрузка не выполнена!";}
else
{
if($_FILES['myfile']['size']>100000){$error="<br>Файл слишком велик!";}
if(!$_FILES['myfile']['type']=='image/jpeg'){$error.="<br>Файл имеет неразрешенный тип!";}
if(!$error)
{
$datie=fopen($_FILES['myfile']['tmp_name'], 'rb');
$data=addslashes(fread( $datie, $_FILES['myfile']['size']));
$sql="INSERT INTO ".$table." (linktext, comm, kategorie, datetyp, datum, datie) values ('".$_POST['linktext']."', '".$_POST['comm']."', '".$_POST['kategorie']."', '".$_FILES['myfile']['type']."', now(), '".$data."')";
$link=mysql_connect("mysqlserver", "namebd", "12345");
mysql_select_db("name", $link);
if(!mysql_query($sql, $link))
{
$error.="<br>Попытка записи в БД привела к ошибке!";
}
else{ echo "Записно!"; unset($_POST['linktext']); unset($_POST['comm']); unset($_POST['kategorie']);}
}
else {echo $error;}
}
} // закрываем sent
?>
<html>
<head>
<title>Загрузки файлов на сайт</title>
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<input type="hidden" name="sent" value="1">
<p>Текст гиперссылки</p>
<input type="text" name="linktext" size="50" value="<?php echo $_POST['linktext']; ?>"><br>
<p>Комментарий</p>
<input type="text" name="comm" size="50" value="<?php echo $_POST['comm']; ?>"><br>
<p>Категория</p>
<select name="kategorie" size="3">
<option>Лес
<option>Море
<option>Звезды
<option>Ава
</select>
<p>Выберите файл</p>
<br>
<input type="file" name="myfile"><br>
<input type="submit" value="Закачать"><input type="reset" value="сброс">
</form>
</body>
</html>
Спустя 12 минут, 45 секунд (24.12.2009 - 23:24) VolCh написал(а):
для начала поставь error_reporting в E_ALL
Спустя 8 часов, 37 минут, 40 секунд (25.12.2009 - 08:02) Alex VoDevil написал(а):
А как именно не работает? В чем проблема то?
Я однажды писал галерею которая хранила все фото в БД. Помнится мне, что возникали проблемы до тех пор пока я не стал записывать контент файла в БД отдельным запросом в кодировке utf-8_bin. Какой тип у поля в которое файл пишите? Проблема то как я понимаю в том что писаться в БД пишется, а вот вычитывается уже не то что записывалось, да? =)
Я однажды писал галерею которая хранила все фото в БД. Помнится мне, что возникали проблемы до тех пор пока я не стал записывать контент файла в БД отдельным запросом в кодировке utf-8_bin. Какой тип у поля в которое файл пишите? Проблема то как я понимаю в том что писаться в БД пишется, а вот вычитывается уже не то что записывалось, да? =)
Спустя 1 час, 57 минут, 24 секунды (25.12.2009 - 09:59) vagrand написал(а):
$datie=fopen($_FILES['myfile']['tmp_name'], 'rb');
$data=addslashes(fread( $datie, $_FILES['myfile']['size']));
1. Ты пытаешся читать напрямую из темповой директории апача, что не всегда возможно.
Сделай сперва move_uploaded_file($_FILES['myfile']['tmp_name'], $some_dir);
2. Для вычитки файла в строку юзай file_get_contents() ибо это нам советуют даже на php.net "file_get_contents() is the preferred way to read the contents of a file into a string.";
3. Юзай base64_encode() для энкодинга строки с данными из файл до того как будеш заливать строку в базу;
4. Поле "datie" переделай в тип BLOB если оно уже не этого типа.
5. Хранить картинки в базе ЭТО ЗЛООООООО!!!!!
Спустя 1 час, 7 минут, 40 секунд (25.12.2009 - 11:07) VolCh написал(а):
vagrand
3. Зачем?
5. Неоднозначно, есть плюсы, есть минусы
3. Зачем?
5. Неоднозначно, есть плюсы, есть минусы
Спустя 12 минут, 28 секунд (25.12.2009 - 11:19) vagrand написал(а):
VolCh
Цитата |
3. Зачем? |
Не будет проблем с невалидными символами.
Цитата |
5. Неоднозначно, есть плюсы, есть минусы |
Я написал свое имхо. Для меня плюсов очень мало в этом подходе. Зато минусов я вижу довольно много:
1. Увеличение размера базы, что приведет к усложнению репликации (если используется), увеличению дампов и невозможности их нормального просмотра по F3.
2. Отдавать такие файлы можно только через доп скрипт, что в свою очередь нагружает БД и апачь. В случае с обычными картинками можно поставить какой-нибудь из легких HTTP серверов которые быстрее отдают статический контент, тем самым разгрузив апачь. В случае же с картинками в базе этого не сделаеш.
3. Очень услажняються любые действия с такими картинками, такие как ресайз, нарезка тумбов, добавление ватермарок.
Спустя 10 минут, 49 секунд (25.12.2009 - 11:30) VolCh написал(а):
vagrand
Цитата |
Не будет проблем с невалидными символами. |
mysql_real_escape_string для этого предназначена
![wink.gif](http://phpforum.ru/html/emoticons/wink.gif)
Цитата |
Для меня плюсов очень мало в этом подходе. |
Но всё же они есть:
1. скриптам не нужен доступ на запись к ФС
2. миграция сайта на другой хост - только экспорт/импорт дампа
3. ... бежать надо
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 1 час, 9 минут, 50 секунд (25.12.2009 - 12:40) vagrand написал(а):
VolCh
Цитата |
1. скриптам не нужен доступ на запись к ФС |
Ну и что что им не нужен доступ к ФС? С чего ты взял что это ярко выраженный плюс?
Таблицы БД тоже хранятся на винте, кроме тех таблиц, у которых engine=MEMORY. Но хранить в них файлы 100% ЗЛО
Цитата |
2. миграция сайта на другой хост - только экспорт/импорт дампа |
да, на первый взгляд это проще, вот только я бы поглядел как у тебя это выйдет если будеш пользоваться phpMyAdmin или другой тулзой на php, т.к. обычно на хостинге upload_max_size и post_max_size ставят небольшими, а изменить, если это разрешено, трудно да и несведущий человек будет долго париться.
Ну и последнее, но немаловажное есть хостинги у которых apache и mysql лежат на разных физических серверах, которые соединены хорошим но все же ограниченным каналом связи, по которому ты будеш гонять большие пакеты данных. Не думаю что это им понравиться.
Спустя 25 минут, 44 секунды (25.12.2009 - 13:06) VolCh написал(а):
vagrand
Цитата |
Ну и что что им не нужен доступ к ФС? С чего ты взял что это ярко выраженный плюс? |
Понижение риска наличия уязвимостей - если в скрипте нет fopen($filename, "w") и т. п., то он ничего в ФС не запишет, а если нет, то при наличии дыр в скрипте/софте и кривых настройках сервера можно записать что угодно и, например, в /etc/....
Цитата |
Таблицы БД тоже хранятся на винте, кроме тех таблиц, у которых engine=MEMORY. Но хранить в них файлы 100% ЗЛО |
Что зло, это естественно. Но, как правило, мускул (или другая СУБД) содержит меньше дыр, чем нубские PHP скрипты
Цитата |
если будеш пользоваться phpMyAdmin или другой тулзой на php |
я буду консолью пользоваться
![cool.gif](http://phpforum.ru/html/emoticons/cool.gif)
Цитата |
Не думаю что это им понравиться. |
А вот это меня меньше всего заботит, если я остаюсь в рамках тарифа. Хотя согласен, что оверхид есть. Причем не только трафик, но и повышенный расход памяти (а может и свапование) при передаче даже внутри одной машины.
Но вообще я хотел сказать, что надо взвешивать плюсы и минусы и на основе анализа конкретной задачи выбирать, где хранить картинки/файлы. Может нагрузка на ФС и так бешенная, чтоб юзерские картинки дергать и лучше, как раз, вынести их на отдельный сервер БД. Особенно актуально в случае шаред хостинга с большим оверселлингом, когда соседи сильно грузят ФС, но БД относительно свободна (может и на отдельном сервере).
Спустя 15 минут, 27 секунд (25.12.2009 - 13:21) vagrand написал(а):
VolCh
Цитата |
при наличии дыр в скрипте/софте и кривых настройках сервера можно записать что угодно и, например, в /etc/ |
У /etc вегда права на запись только у root. Я готов поспорить на ящик пива, что ни у одного провайдера не будет иначе. Если же у тебя выделенный сервак и ты сам поменял права на запись для этой директории, то ты сам себе злой буратина.
Так что этот твой пункт имхо нивкоей мере не является положительной стороной хранения картинок в БД.
Цитата |
я буду консолью пользоваться |
Это в том случае если хостер разрешит тебе ею пользоваться. А в подавляющем большинстве случаев этой возможности нет.
Цитата |
Может нагрузка на ФС и так бешенная, чтоб юзерские картинки дергать и лучше, как раз, вынести их на отдельный сервер БД. |
Что тебе мешает каталог в котором хранятся картинки вынести на другой сервер а затем просто примаунтить его? А лучше даже не маунтить а сделать поддомен основного домена, скажем images.example.com и споинтить его на каталог картинок на том серваке где они храняться.
Цитата |
Особенно актуально в случае шаред хостинга с большим оверселлингом, когда соседи сильно грузят ФС, но БД относительно свободна (может и на отдельном сервере) |
Мой опыт говорит о том что все с точностью до наоборот. В 90% случаев самым загруженным является MySQL сервер, если конечно у тебя не видео сервер, но в этом случае есть такие вещи как CDN.
Цитата |
Но вообще я хотел сказать, что надо взвешивать плюсы и минусы и на основе анализа конкретной задачи выбирать, где хранить картинки/файлы. |
Согласен с первой половиной фразы, т.е. о точ что под конкретную задачу нужно выбирать самый подходящий алгоритм или технологию, но ИМХО это не касаеться того где хранить файлы, ибо хранить их всегда нужно на файловой системе.
Спустя 17 часов, 30 минут, 25 секунд (26.12.2009 - 06:52) VolCh написал(а):
Я говорю, прежде всего, о паблик-скриптах, окружение которых разработчик контролировать не может. а там может быть всё что угодно, не раз видел линуксы с правами на все файлы и папки 777, лишь потому что людям так удобнее.
На хостинг без консоли я даже смотреть не буду, да и вообще шаред хостинг большинство использует, по-моему, только по привычке. Серьезному бизнес-сайту нужен выделенный сервер по любому, а VDS для домашних страничек и визиток стоит практически те же самые деньги, что и шаред, при несравнимых возможностях контроля - в тот же php.ini что-нить записать или настроить кодировку по умолчанию в MySQL.
Примаунтить - вариант, но часть плюсов хранения картинок в ФС тут же теряется, трафик будет практически такой же как с БД на отдельном сервере. Отдельный сервер - в скрипте писать пост/пут запросы к апачу на другом сервере при аплоаде?
Ну почему всегда? Простой пример - куча мелких файлов со сложным ACL и кучей атрибутов. При показе каждого файла все равно надо делать выборку из БД (то есть простая статика через nginx или apache не прокатит), зачем делать еще и обращение к ФС, если можно прицепить контент файла к запросу БД, который фактически его не затормозит, а не выполнять после запроса к БД еще и запрос к ФС?
А если нужен поиск по содержимому файлов? find | grep запускать? Или в скрипте все файлы перебирать?
В общем останусь при своем мнении, нужно смотреть задачу и условия, при которых она выполняется, а потом принимать решения. Может оптимальным вариантом окажется хранение в БД, а кеширование на ФС.
На хостинг без консоли я даже смотреть не буду, да и вообще шаред хостинг большинство использует, по-моему, только по привычке. Серьезному бизнес-сайту нужен выделенный сервер по любому, а VDS для домашних страничек и визиток стоит практически те же самые деньги, что и шаред, при несравнимых возможностях контроля - в тот же php.ini что-нить записать или настроить кодировку по умолчанию в MySQL.
Примаунтить - вариант, но часть плюсов хранения картинок в ФС тут же теряется, трафик будет практически такой же как с БД на отдельном сервере. Отдельный сервер - в скрипте писать пост/пут запросы к апачу на другом сервере при аплоаде?
Ну почему всегда? Простой пример - куча мелких файлов со сложным ACL и кучей атрибутов. При показе каждого файла все равно надо делать выборку из БД (то есть простая статика через nginx или apache не прокатит), зачем делать еще и обращение к ФС, если можно прицепить контент файла к запросу БД, который фактически его не затормозит, а не выполнять после запроса к БД еще и запрос к ФС?
А если нужен поиск по содержимому файлов? find | grep запускать? Или в скрипте все файлы перебирать?
В общем останусь при своем мнении, нужно смотреть задачу и условия, при которых она выполняется, а потом принимать решения. Может оптимальным вариантом окажется хранение в БД, а кеширование на ФС.
Спустя 3 часа, 51 минута, 21 секунда (26.12.2009 - 10:43) vagrand написал(а):
Цитата |
Примаунтить - вариант, но часть плюсов хранения картинок в ФС тут же теряется, трафик будет практически такой же как с БД на отдельном сервере. |
При мануте разница не в трафике между сервером который отдает и сервером на котором храняться, а в том что ты не грузиш файлы в ОЗУ. Самым дорогим в серверах являются проц и ОЗУ, HD сейчас дешевые особенно у буржуев.
Цитата |
Отдельный сервер - в скрипте писать пост/пут запросы к апачу на другом сервере при аплоаде? |
Читай внимательнее что я писал. Если на главный сервер направить домен example.com, а на сервак на котором картинки направить images.example.com то в скрипте или шаблонах сайта нужно просто делать линки не на example.com/<sime_image> а на image.example.com/<some_image>. В этом случае отдавать файлы будет именно второй сервак, разгружая при этом первый, а уже на второй сервак можно поставить что-нибудь полегче чем apache.
Цитата |
Ну почему всегда? Простой пример - куча мелких файлов со сложным ACL и кучей атрибутов. При показе каждого файла все равно надо делать выборку из БД (то есть простая статика через nginx или apache не прокатит), зачем делать еще и обращение к ФС, если можно прицепить контент файла к запросу БД, который фактически его не затормозит, а не выполнять после запроса к БД еще и запрос к ФС? |
ACL нормально можно организовать и без записи файла в БД. Читай http://www.qwk.net/opensource/mod_auth_cookie_mysql/
Цитата |
А если нужен поиск по содержимому файлов? find | grep запускать? Или в скрипте все файлы перебирать? |
Вот мне интересно, а что ты собрался искать в файлах изображений? Бинарную последовательность?
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Ладно, допустим ты загрузил в БД контент текстовых файлов. Причем я даже не спрашиваю как ты будеш решать проблему с кодировкой файлов, а именно с определением этой кодировки и конвертацией в кодировку твоей базу, ибо в противном случае ты не сможешь серчить по полю с файловым контентом. Но ладно, закроем на ве это глаза, предположим что у тебя идеальная ситуация, т.е. в поле таблицы загружен контент обычного txt файла в той же кодировке что и твоя БД. Вот и скажи мне каким образом ты будеш серчить слово или фразу в тексте этих файлов? При помощи like '%<some word>%'? Если да то твой запрос будет выполняться ОЧЕНЬ долго. Фулл текст индексы так же не улучшат этой ситуации, т.к. для них текст по которому ведется поиск нужно нормализовывать и даже в этом случае на 1000 записях у тебя будет ОЧЕНЬ БОЛЬШИЕ тормоза.
Так чт0 этот твой довод тоже не довод
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 2 часа, 59 минут, 57 секунд (26.12.2009 - 13:43) ak167 написал(а):
Цитата |
1. Ты пытаешся читать напрямую из темповой директории апача, что не всегда возможно. Сделай сперва move_uploaded_file($_FILES['myfile']['tmp_name'], $some_dir); |
vagrand, спасибо! Попробую.
Цитата |
4. Поле "datie" переделай в тип BLOB если оно уже не этого типа. |
vagrand, оно уже блоб.
А может у меня что-то с полями не так? Проверьте, пожалуйста.
Скрин таблицы:
![user posted image](http://s19.radikal.ru/i192/0912/32/abcd7dcd8cac.jpg)
Цитата |
А как именно не работает? В чем проблема то? |
Alex VoDevil, загружаю фото. По идее после успешной загрузки должна появиться надпись "Записано" либо после неудачно загрузки - "Попытка записи в БД привела к ошибке", но ни того ни другого не выскакивает!
После отправки картинки БД пуста!
Цитата |
Помнится мне, что возникали проблемы до тех пор пока я не стал записывать контент файла в БД отдельным запросом в кодировке utf-8_bin. Какой тип у поля в которое файл пишите? Проблема то как я понимаю в том что писаться в БД пишется, а вот вычитывается уже не то что записывалось, да? =) |
Alex VoDevil, а вот с этого момента можно по-подробнее, плиз!)))
Типы полей см. в этом сообщении чуть выше.