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

Форум MySQL

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

 

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

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

тема: Передача картинок через форму HTML в базу MySQL
 
 автор: juliya   (01.03.2006 в 11:55)   письмо автору
 
 

Может все-таки кто-нибудь знает: когда передаются картинки через форму HTML в базу, может какой-нибудь переменной присвоить значение поля input type="file" name="photo", чтобы в базе хранились сами картинки, а не пути к ним? Мне очень нужно

   
 
 автор: Loki   (01.03.2006 в 12:09)   письмо автору
 
   для: juliya   (01.03.2006 в 11:55)
 

я же вам давал ссылку: загрузить файл на сервер, считать его в переменную и поместить в БД с типом поля blob

   
 
 автор: cheops   (01.03.2006 в 14:24)   письмо автору
 
   для: juliya   (01.03.2006 в 11:55)
 

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

PS Вопросы, посвящённые базам данных лучше сразу размещать в разделе MySQL

   
 
 автор: juliya   (01.03.2006 в 14:52)   письмо автору
 
   для: cheops   (01.03.2006 в 14:24)
 

Так а без файла то совсем нельзя?

   
 
 автор: juliya   (01.03.2006 в 14:58)   письмо автору
 
   для: juliya   (01.03.2006 в 14:52)
 

Люди добрые!
Второй день мучаюсь - ничего не получается.
У меня через форму картинки попадают в базу данных, а потом выводятся оттуда. Вроде все работает, но проблема в том, что в базе хранятся не сами картинки, а пути к ним. Помогите советом.
В базу кладутся так:


$query = "INSERT INTO vsm_notebook (f_photo) VALUES 
  ('$HTTP_POST_VARS[photo]')"; 


А достаются так:


$id = $_GET["id"]; 
  $query = "SELECT * FROM vsm_notebook where f_id =" .$id; 
  $result = mysql_query($query); 
while ($row = mysql_fetch_array($result)) 

       $id = $row["f_id"]; 
    $photo= $row["f_photo"]; 
    } 


Вывод в браузер:


<?if (!empty($photo)) 
        {  print 
"<img src='".$photo."'></td>"
    </
tr>";}?>     

Никак не пойму. Все про файл какой-то говорят

   
 
 автор: elenaki   (01.03.2006 в 15:28)   письмо автору
 
   для: juliya   (01.03.2006 в 14:58)
 

тот файл (с картинкой), который вы выбираете через форму, надо открыть, прочитать, закрыть, а
то, что прочитали (бинарный код) занести в базу в поле BLOB. но для начала попытаться это
вывести в браузер, чтобы убедиться, что прочитано правильно. сейчас пойду пороюсь, где-то у
меня был такой скрипт. я уже давным-давно отказалась от такого метода хранения картинок.
скажите своим преподам, что вас неправильно учат :)

   
 
 автор: juliya   (01.03.2006 в 15:34)   письмо автору
 
   для: elenaki   (01.03.2006 в 15:28)
 

Я ему пыталась сказать, что так никто уже не делает. Он же настаивает на том, что все данные должны храниться в одном вместе.
Я ведь файл выбираю через форму. Название то у него какое будет?
Самое главное, что у меня и так все работает, только в базе лежат пути.

   
 
 автор: elenaki   (01.03.2006 в 15:48)   письмо автору
 
   для: juliya   (01.03.2006 в 15:34)
 

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


<? include "config.inc.php";
ini_set("max_execution_time",999999);

  
  
// otkrivaem
  
$file fopen($filename"r"); ////тут имя поля с типом file, в котором выбирается картинка
  // chitaem
  
$buffer fread($filefilesize($filename)); 
  
// zakrivaem
  
fclose($file); 
?>


а так вставляем в базу:

$buffer = addslashes($buffer);
$query = "INSERT INTO vsm_notebook (f_photo) VALUES  ('$buffer')"; 


поле f_photo должно быть типа BLOB

   
 
 автор: Trianon   (01.03.2006 в 15:51)   письмо автору
 
   для: juliya   (01.03.2006 в 15:34)
 

Не всё у Вас работает...
Если обычные значения обычных полей формы доступны через $_POST['поле'], то загружаемые на сервер файлы, доступны через $_FILES['поле']. Причем каждый элемент этого массива - это целая структура, описывающая файл, который пытаются загрузить.

$_FILES['userfile']['name']  - Оригинальное имя файла на компьютере клиента. 
$_FILES['userfile']['type']  - Mime-тип файла, в случае, если браузер предоставил такую информацию. Пример: "image/gif". 
$_FILES['userfile']['size'] - Размер в байтах принятого файла. 
$_FILES['userfile']['tmp_name'] - Временное имя, с которым принятый файл был сохранен на сервере. 
$_FILES['userfile']['error'] - Код ошибки, которая может возникнуть при загрузке файла. Ключ ['error'] был добавлен в PHP 4.2.0 

(из документации к php http://www.php.net/manual/ru/features.file-upload.php )

   
 
 автор: juliya   (01.03.2006 в 16:05)   письмо автору
 
   для: Trianon   (01.03.2006 в 15:51)
 

Я делаю так. У меня поле type="file" name="photo", т.е. имя photo

$file = fopen($photo, "r"); 
$buffer = fread($file, filesize($photo)); 
 fclose($file); 


А он мне пишет

Warning: fread(): supplied argument is not a valid stream resource in ...
Warning: fclose(): supplied argument is not a valid stream resource in ...


Что ж не так то?

   
 
 автор: Loki   (01.03.2006 в 16:15)   письмо автору
 
   для: juliya   (01.03.2006 в 16:05)
 

то что открывать надо загруженный файл, а не поле из формы:

$file = fopen($_FILES['photo']['tmp_name'], "r"); 

   
 
 автор: juliya   (01.03.2006 в 16:23)   письмо автору
 
   для: Loki   (01.03.2006 в 16:15)
 

Блин, та же фигня. Как еще можно попробовать?

   
 
 автор: Trianon   (01.03.2006 в 16:27)   письмо автору
 
   для: juliya   (01.03.2006 в 16:05)
 

В форме должно быть что-то вроде
 <form method=post enctype=multipart/form-data >
    Photo:  <input type=file name=photo  />
  <input type=submit />

А в обработчике формы:
   $photo = $_FILES['photo']['tmp_name']);

   //следующие три строки можно заменить на  $buffer = file($photo);
   $file = fopen($photo, "r");
   $buffer = fread($file, filesize($photo));
   fclose($file);


   mysql_connect(...);
   mysql_select_db(...)

   $query =  "INSERT INTO vsm_notebook (f_photo) VALUES('"
           . mysql_escape_string($buffer)                  . "')";

   mysql_query($query);

   
 
 автор: juliya   (01.03.2006 в 16:44)   письмо автору
 
   для: Trianon   (01.03.2006 в 16:27)
 

Теперь моя фотка выводится вот так яШяа\0JFIF\0\0H\0H\0\0яб2Exif\0 И очень долго грузится

   
 
 автор: Trianon   (01.03.2006 в 17:15)   письмо автору
 
   для: juliya   (01.03.2006 в 16:44)
 

Следовательно, в базу попала фотография, а не имя файла. Что и требовалось.
На сервер грузится долго?

   
 
 автор: 10100100   (01.03.2006 в 19:17)   письмо автору
 
   для: Trianon   (01.03.2006 в 17:15)
 

:)) а у мя обратный вопрос! :) как записать путь к файлу в базу - тоетсь чтобы только ссылку выводить а не весь файл.. ну тоесть чтобы выводить картинку но в базе хранить толкьо ссылку на него! :)) я чёт сообразить совсем не могу 6))

   
 
 автор: Trianon   (01.03.2006 в 19:22)   письмо автору
 
   для: 10100100   (01.03.2006 в 19:17)
 

вообще-то это лучше отдельной веткой обсуждать.

BTW, в коментарии к коду я наврал.
Вместо //следующие три строки можно заменить на $buffer = file($photo);
следует читать //следующие три строки можно заменить на $buffer = file_get_contents($photo);

   
 
 автор: star   (10.03.2006 в 22:40)   письмо автору
 
   для: 10100100   (01.03.2006 в 19:17)
 

приблезительно так: (php)
if(stristr($_FILES['fimg']['type'],"image"))
        {

записать в базу t_pic с полем Ident (autoincrement) выдернуть значение Ident ($ImageName) и записать

move_uploaded_file($_FILES['fimg'][tmp_name], DIR_TO_IMG."/".$ImageName)

вот и все

   
 
 автор: star   (10.03.2006 в 22:17)   письмо автору
 
   для: juliya   (01.03.2006 в 16:44)
 

просумировав все выше сказаное у меня кое-что получилось
файл index.php
<?
if(isset($_POST["submit"]))
    {
    if(
stristr($_FILES['fimg']['type'],"image"))
        {
        
$ff $_FILES['fimg']['tmp_name'];
        
$handle fopen($ff"rb");
        
$contents fread($handlefilesize($ff));
        
fclose($handle);
        
$link mysql_connect(SERVER_NAMEDB_USERDB_PASS)
                or die(
"Could not connect : " mysql_error());
        
mysql_select_db("test") or die("Could not select database");

 
$query "INSERT INTO t_pic (b_Data, s_header) VALUES ('".mysql_escape_string($contents)."', '".$_FILES['fimg']['type']."')";

        
$result mysql_query($query) or die("Query failed : " mysql_error());
        }

    }
$res $ChatDB->SelectFromBase("select * from t_pic");
if(!
$res)$RecordCount 0; else $RecordCount mysql_num_rows($res);
$MainText  "<table width=\"90%\"><tr>";
for(
$i 0$i $RecordCount$i++)
    {
    
$id mysql_result($res$i"Ident");
    
$MainText .= "<td><img src=\"test/img.php?id=$id\"></td>";
    
$MainText .= "</tr><tr>";
    }
$MainText .= "</tr></table>";

$MainText .="<form method=post action=\"index.php?Act=test\" enctype=\"multipart/form-data\">
             <input type=\"file\" name=\"fimg\">
             <input type=\"submit\" name=\"submit\" value=\"Послать данные\">
             </form>"
;

echo 
$MainText;

?>


и файл img.php

<?
include ("db.php");

$link mysql_connect(SERVER_NAMEDB_USERDB_PASS)
        or die(
"Could not connect : " mysql_error());
mysql_select_db("test") or die("Could not select database");

$id $_GET["id"];
$query "select * from t_pic where (Ident = $id)";

$result mysql_query($query) or die("Query failed : " mysql_error());

header('Content-type: '.mysql_result($result,0"s_header").' ');

print( 
mysql_result($result,0"b_Data"));

    
/* Освобождаем память от результата */
    
mysql_free_result($result);

    
/* Закрываем соединение */
    
mysql_close($link);

?>


добавить хочу базу майскуеля из таблицы "test"
CREATE TABLE 't_pic' (
  'Ident' int(11) NOT NULL auto_increment,
  'b_Data' longblob NOT NULL,
  's_header' varchar(10) NOT NULL default '',
  PRIMARY KEY  ('Ident')
) TYPE=MyISAM AUTO_INCREMENT=1 ;


и нормально работает (без библиотеки GDI)

   
Rambler's Top100
вверх

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