|
|
|
| Здравствуйте, дорогие форумчане!
Мне очень стыдно что я не могу справится с такой простой задачей, но я еще совсем "чайник" в вопросах 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 | |
|
|
|
|
|
|
|
для: danga
(25.10.2013 в 19:56)
| | Фото да еще больших размеров хранить в базе нецелесообразно. Храните их в каталогах, но только не пользуйтесь для перемещения временного файла в каталог функцией copy(), а используйте move_uploaded_file.
В базе же храните сформированное имя для загруженного файла (хотя это и не всегда выгодно тоже), его реальное имя, если надо, и прочую сопутствующую ему информацию по необходимости.
Иначе вы быстро превратите свою базу в неповоротливого монстра. | |
|
|
|
|
|
|
|
для: confirm
(25.10.2013 в 20:19)
| | Здравствуйте, Confirm.
А вот в другом месте я вычитала как раз наоборот, что лучше хранить фотки в базе, чем в папке. Папка же тоже будет на сервере место занимать- такой же объем, как и в базе, да еще к ней надо будет из базы обращаться при выборе по определенным критериям- это дополнительное время и дополнительные ссылки. А ведь можно же сделать в базе отдельную таблицу для фоток, и обращаться по мере надобности внутри одной базы. Так что это спорный вопрос. Вобщем, мне больше нравится вариант с базой.
А по поводу того, копировать или перемещать временный файл я тоже вычитала такое мнение:
на сайте http://www.php.su/phphttp/?uploads
********
После завершения работы скрипта, временный файл будет удален. Это означает, что мы должны его скопировать в другое место до завершения работы скрипта. То есть алгоритм работы сценария загрузки файла на сервер такой:
Если кнопка "Submit" нажата, то файл уже будет загружен на сервер и его имя будут в переменной $_FILES['uploadfile']['name']. В этом случае скрипт должен сразу скопировать файл с именем $_FILES['uploadfile']['tmp_name'] в какой-нибудь каталог (необходимы права на запись в этот каталог).
Копирование файла производится функцией copy():
Используйте только функцию копирования copy(), а не перемещения, поскольку:
-Временный файл будет удален автоматически;
-Если временный каталог находится на другом носителе, будет выведено сообщение об ошибке.
*******************
Словом, у каждого свой рецепт самый лучший.:)))
Но все-таки, как же мне фотку в базу загрузить? Я уже накачала целую кучу скриптов, но они все не работают. Мне кажется, что должно быть какое-то совсем простое решение. | |
|
|
|
|
|
|
|
для: danga
(26.10.2013 в 01:56)
| | Дело не во вкусах, а в объемах и способе выдачи, и в хорошо организованных каталогах не сложно будет работать с файлами. Именовать файлы можно так, чтобы при удалении записей за именем файла связанным с ней обращения в базу не было бы необходимости.
Чтобы скормить файл браузеру, который в базе, его надо еще извлечь, приготовить к выдаче и только потом отдать, так как браузеру по обычной ссылке он не доступен, и то что бы браузер сделал сам, вы взваливаете на MySQL. А это операции, и учитывая, что в динамических страницах обращение к базам, это основной момент, можете поразмыслить есть ли в таком подходе выгода. Хранить в базе картинки можно, но ваш случай, это не этот случай.
Впрочем, если нравится, делайте, достаточно считать бинарные данные, например, file_get_contents($_FILES['uploadfile']['tmp_name']), и поместить их в BLOB, только не пришлось бы потом все это выкорчевывать.
Применять при загрузке файлов функцию move_uploaded_file() вместо copy() нужно не потому, что это мой вкус и я вам его хочу навязать, а потому, что функция copy() не отвечает требованиям, которые нужны для операций с такими файлами, включая и вопросы безопасности. Функция copy() применялась в старых версиях РНР и настоятельно не рекомендуется сейчас не мной, а разработчиками РНР.
Загружая файл на сервер его нужно обязательно проверять по всем условиям, и к MySQL это отношения не имеет. | |
|
|
|
|
|
|
|
для: danga
(26.10.2013 в 01:56)
| | > Я уже накачала целую кучу скриптов, но они все не работают.
Не нужно кучи скриптов. Нужна всего одна функция:
Нет. Сперва хотел дать Вам решение, но потом передумал. Настоятельно рекомендую - прислушайтесь к confirm'у | |
|
|
|
|