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

Форум PHP

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

 

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

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

тема: Вывод картнки из БД
 
 автор: kronck   (01.10.2010 в 11:20)   письмо автору
 
 

Есть простая табличка , поле content обозначенно типом longblob

CREATE TABLE IF NOT EXISTS `images` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `content` longblob NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;


Также есть форма и обработчик который посылает картинку в базу.

<form  enctype="multipart/form-data"  method="post" action="putimage.php">
Изображение: <input type="file" name="image" />
<input type="submit" value="Загрузить" />
</form>


Код обработчика putimage.php

<?php
// Проверяем пришел ли файл
if( !empty( $_FILES['image']['name'] ) ) {
  
// Проверяем, что при загрузке не произошло ошибок
  
if ( $_FILES['image']['error'] == ) {
    
// Если файл загружен успешно, то проверяем - графический ли он
    
if( substr($_FILES['image']['type'], 05)=='image' ) {
      
// Читаем содержимое файла
      
$image file_get_contents$_FILES['image']['tmp_name'] );
      
// Экранируем специальные символы в содержимом файла
      
$image mysql_escape_string$image );
      
// Формируем запрос на добавление файла в базу данных
      
$query="INSERT INTO `images` VALUES(NULL, '".$image."')";
      
// После чего остается только выполнить данный запрос к базе данных
      
mysql_query$query );
    }
  }
}
?>

На этом месте картинка заносится в базу, причем в базе в поле content - написано следующее: [BLOB - 390B]


Ну и сам файл вывода:
<?php
if ( isset( $_GET['id'] ) ) {
  
// Здесь $id номер изображения
  
$id = (int)$_GET['id'];
  if ( 
$id ) {
    
$query "SELECT `content` FROM `images` WHERE `id`=".$id;
    
// Выполняем запрос и получаем файл
    
$res mysql_query($query);
    if ( 
mysql_num_rows$res ) == ) {
      
$image mysql_fetch_array($res);
      
// Отсылаем браузеру заголовок, сообщающий о том, что сейчас будет передаваться файл изображения
      
header("Content-type: image/*");
      
// И  передаем сам файл
      
echo $image['content'];
    }
  }
}
?>


При выводе картинки , например ../../image.php?id=1 , вместо картники выводятся
каракули типа :
GIF89aE&#65533; &#65533;і&#65533;&#65533;ллжЮЮЫ!%u«

И выдает обшибку в 25 строке, хотя там указанно, что выводить нужно изображение
header("Content-type: image/*");

  Ответить  
 
 автор: RuslanMRP   (01.10.2010 в 11:49)   письмо автору
 
   для: kronck   (01.10.2010 в 11:20)
 

Делайте проще! В БД вместо `content` longblob NOT NULL, ставите например `content` varchar(50) NOT NULL,

Создаете папку где у вас будут находиться картинки - images и вставляете туда картинки. В БД в поле content пишите название картинки например sdfdsf.jpg которая имееться в выше указаной папке.
Пишите это:

$result=mysql_query('select * from название_таблицы'); 
if(mysql_num_rows($result)) { // выводим таблицу 
  echo "<td valign='right width='12%' height='15px' align='center' bgcolor=#FFFFFF>картинка</td>
        
  while($row = mysql_fetch_assoc($result)) { 
      echo "</tr>";
        echo "<tr>";
    echo '<td width=5% align=left bgcolor=#FFFFFF height=5px><img src="images/' . $row['content'] .'" width=75px height=75px></td>'; 



И ВСЕ!

  Ответить  
 
 автор: kronck   (01.10.2010 в 13:01)   письмо автору
 
   для: RuslanMRP   (01.10.2010 в 11:49)
 

Не знаю, что то у меня php матом ругается
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
.
Сперва хотел сделать , что бы картинки хранились допустим в файле на сервере, но встатала проблема вывода этой картинки из папки.
Теперь же хотел сделать место для хранения картинок БД (хоть и понимаю что это плохая затея) и собвственно вывод, опять epic fail :)

  Ответить  
 
 автор: sim5   (01.10.2010 в 12:06)   письмо автору
 
   для: kronck   (01.10.2010 в 11:20)
 

А вот возьмут и подделают тип передаваемый, и закачаете вы в свою базу не изображение, а мусор, что тогда?
Да и не стоит хранить в базе изображения, как вам уже сказали, это слишком накладно.
Ошибка при передаче заголовка потому, что значит уже был вывод в браузер.

  Ответить  
 
 автор: RuslanMRP   (01.10.2010 в 12:10)   письмо автору
 
   для: sim5   (01.10.2010 в 12:06)
 

В БД будет храниться лишь название картинок.

  Ответить  
 
 автор: kronck   (02.10.2010 в 07:39)   письмо автору
 
   для: RuslanMRP   (01.10.2010 в 12:10)
 

перепробовал все только мог
Текстовые импуты заносятся в базу, файловые импуты тоже летят в базу (название картинок).
Суть в том , что пользователь допустим в текстовые импуты заносит информацию и загружает картинку, название картинки летит в бд, а сам файл летит в папку -->
Далее, мы выводим эту информацию из бд (она выводится) и пытаемся вывести картинку (вот тут сложности).
Так как не могу понять как картинку прицепить к id пользователя. Помогите балбесу :)

  Ответить  
 
 автор: sim5   (02.10.2010 в 08:30)   письмо автору
 
   для: kronck   (02.10.2010 в 07:39)
 

Никакие инпуты никуда не летают.

Первое - вы не можете гарантировать, что пользователи А и В не назовут свое изображение одним и тем же именем, поэтому сохранять изображение в каталоге нужно только под сформированным скриптом уникальным именем, и сохранять это имя в базу только в том случае, если сохранение файла произошло успешно. Кроме этого в базе полезно держать и такую информацию об изображении, как его размеры для помещения ее в тег IMG. Реальное же имя картинки можно сохранять в базу только лишь для того, чтобы, например, сделать подпись под выводимым изображением, а обращение к нему по уникальному имени. Сам путь изображения в базе держать можно, если все жестко привязано к одному каталогу, но если это не так, то пути лучше держать в файле/таблице конфигурации.

Запись в базе для некоего пользователя - это во-первых его уникальный id, а далее все что он помещает в базу - текст, загруженное изображение и т.п., поэтому "привязки" при выводе к id никакой не требуется. Запрашивается запись конкретного id, выводите все что есть, включая:
<img src="path/name_img.ext" параметры размеров из базы и другое>,
если только изображение было успешно загружено, и поле имени изображения в базе не пустое. Если же "привязка", это указать в ссылке id пользователя как параметр, то при выводе записи вы знаете этот id, "привязывайте", какие могут быть проблемы.

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

Было бы хорошо, если я ошибаюсь, но пока не похоже.

  Ответить  
 
 автор: gghh   (02.10.2010 в 14:42)   письмо автору
 
   для: sim5   (02.10.2010 в 08:30)
 

Чтоб не плодить сущности, почитайте вот эту тему http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=76192&page=1, возможно в ней будет решение Вашей проблемы.

  Ответить  
 
 автор: sim5   (02.10.2010 в 14:47)   письмо автору
 
   для: gghh   (02.10.2010 в 14:42)
 

Спасибо, но у меня нет проблем.

  Ответить  
 
 автор: gghh   (02.10.2010 в 16:37)   письмо автору
 
   для: sim5   (02.10.2010 в 14:47)
 

Извините, я по ошибке ответил не автору, а Вам.

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

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