Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Загрузка фотографий в MySQL
 
 автор: danga   (25.10.2013 в 19:56)   письмо автору
 
 

Здравствуйте, дорогие форумчане!
Мне очень стыдно что я не могу справится с такой простой задачей, но я еще совсем "чайник" в вопросах WEB программирования. С фотографиями наверное вы уже все умеете работать. А я бьюсь уже третий день, и ничего нее получается. Задача простая: пользователь из HTML формы должен загрузить фотки (3 штуки) и они должны храниться в базе данных MySQL.
Пока я пытаюсь загрузить хотя бы одну фотку. Из формы фото грузится на сервер нормально и в качестве проверки я вывожу его на экран. HTML+PHP работает, фотка загружается на сервер и выводится на экран. Но в базу записываться не хочет, по-моему MySQL не понимает, что я передаю изображение, потому что в некоторых вариантах переменная $photo в базу записывалась, но как бинарный тип размером 10 байтов всего.
В тестовой базе таблице photo всего два столбца id (int 11) и photo (BLOB). Если я ввожу фотку прямо а phpMyAdmin вручную, то она нормально записывается в поле photo всем своим размером.
А через INSERT-ни в какаю.
Вот какие у меня тестовые скрипты
HTML form

<HTML>
<head>
</head>
<body>
<form action=ins32.php method=post enctype=multipart/form-data>
<input type=file name=photo  multiple accept="image/*,image/jpeg">
<input type=submit value=Загрузить></form>
</body>
</html>


PHP обработчик ins32.php

<?php
include ('connect.php');
$photo = ($_FILES['photo']['name']);

// Копируем файл из каталога для временного хранения файлов:
if (copy($_FILES['photo']['tmp_name'], $photo))
{
echo 
"<h3>Файл успешно загружен на сервер</h3>"//!!! Загружается!!!
}
else { echo 
"<h3>Ошибка! Не удалось загрузить файл на сервер!</h3>"; exit; }

echo 
"<img src='".$photo."'>"//!!!! выводится на эран!!!!

$sql 'INSERT INTO photo(photo) VALUES("'.$photo.'" )'// !!! это не работает!!!!

if(!mysql_query($sql))
{echo 
'<center><p><b>Ошибка при добавлении данных!</b></p></center>';} // вот именно -(((
else 
{echo 
'<center><p><b>Данные добавлены!</b></p></center>';}
?>


Наверное, надо как-то сообщить MySQL, что в переменной $photo изображение. Но как это сделать?
С уважением
danga

  Ответить  
 
 автор: confirm   (25.10.2013 в 20:19)   письмо автору
 
   для: danga   (25.10.2013 в 19:56)
 

Фото да еще больших размеров хранить в базе нецелесообразно. Храните их в каталогах, но только не пользуйтесь для перемещения временного файла в каталог функцией copy(), а используйте move_uploaded_file.
В базе же храните сформированное имя для загруженного файла (хотя это и не всегда выгодно тоже), его реальное имя, если надо, и прочую сопутствующую ему информацию по необходимости.
Иначе вы быстро превратите свою базу в неповоротливого монстра.

  Ответить  
 
 автор: danga   (26.10.2013 в 01:56)   письмо автору
 
   для: confirm   (25.10.2013 в 20:19)
 

Здравствуйте, Confirm.
А вот в другом месте я вычитала как раз наоборот, что лучше хранить фотки в базе, чем в папке. Папка же тоже будет на сервере место занимать- такой же объем, как и в базе, да еще к ней надо будет из базы обращаться при выборе по определенным критериям- это дополнительное время и дополнительные ссылки. А ведь можно же сделать в базе отдельную таблицу для фоток, и обращаться по мере надобности внутри одной базы. Так что это спорный вопрос. Вобщем, мне больше нравится вариант с базой.
А по поводу того, копировать или перемещать временный файл я тоже вычитала такое мнение:
на сайте http://www.php.su/phphttp/?uploads

********
После завершения работы скрипта, временный файл будет удален. Это означает, что мы должны его скопировать в другое место до завершения работы скрипта. То есть алгоритм работы сценария загрузки файла на сервер такой:

Если кнопка "Submit" нажата, то файл уже будет загружен на сервер и его имя будут в переменной $_FILES['uploadfile']['name']. В этом случае скрипт должен сразу скопировать файл с именем $_FILES['uploadfile']['tmp_name'] в какой-нибудь каталог (необходимы права на запись в этот каталог).

Копирование файла производится функцией copy():

Используйте только функцию копирования copy(), а не перемещения, поскольку:

-Временный файл будет удален автоматически;
-Если временный каталог находится на другом носителе, будет выведено сообщение об ошибке.
*******************
Словом, у каждого свой рецепт самый лучший.:)))
Но все-таки, как же мне фотку в базу загрузить? Я уже накачала целую кучу скриптов, но они все не работают. Мне кажется, что должно быть какое-то совсем простое решение.

  Ответить  
 
 автор: confirm   (26.10.2013 в 05:39)   письмо автору
 
   для: danga   (26.10.2013 в 01:56)
 

Дело не во вкусах, а в объемах и способе выдачи, и в хорошо организованных каталогах не сложно будет работать с файлами. Именовать файлы можно так, чтобы при удалении записей за именем файла связанным с ней обращения в базу не было бы необходимости.
Чтобы скормить файл браузеру, который в базе, его надо еще извлечь, приготовить к выдаче и только потом отдать, так как браузеру по обычной ссылке он не доступен, и то что бы браузер сделал сам, вы взваливаете на MySQL. А это операции, и учитывая, что в динамических страницах обращение к базам, это основной момент, можете поразмыслить есть ли в таком подходе выгода. Хранить в базе картинки можно, но ваш случай, это не этот случай.
Впрочем, если нравится, делайте, достаточно считать бинарные данные, например, file_get_contents($_FILES['uploadfile']['tmp_name']), и поместить их в BLOB, только не пришлось бы потом все это выкорчевывать.

Применять при загрузке файлов функцию move_uploaded_file() вместо copy() нужно не потому, что это мой вкус и я вам его хочу навязать, а потому, что функция copy() не отвечает требованиям, которые нужны для операций с такими файлами, включая и вопросы безопасности. Функция copy() применялась в старых версиях РНР и настоятельно не рекомендуется сейчас не мной, а разработчиками РНР.

Загружая файл на сервер его нужно обязательно проверять по всем условиям, и к MySQL это отношения не имеет.

  Ответить  
 
 автор: Sfinks   (26.10.2013 в 09:33)   письмо автору
 
   для: danga   (26.10.2013 в 01:56)
 

> Я уже накачала целую кучу скриптов, но они все не работают.
Не нужно кучи скриптов. Нужна всего одна функция:

Нет. Сперва хотел дать Вам решение, но потом передумал. Настоятельно рекомендую - прислушайтесь к confirm'у

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования