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

Форум MySQL

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

 

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

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

тема: Хранение файлов в базе данных
 
 автор: Neokortex   (25.06.2010 в 01:47)   письмо автору
 
 

Здравствуйте. Объясните пожалуйста, на пальцах, как хранить, например, картинки, в базе данных.

Я так понимаю это будет просто текст. Как вообще это сдлеать. Чтобы посмотреть что из этого получится.

  Ответить  
 
 автор: Valick   (25.06.2010 в 01:57)   письмо автору
 
   для: Neokortex   (25.06.2010 в 01:47)
 

делайте выводы

  Ответить  
 
 автор: Тень&   (25.06.2010 в 03:39)   письмо автору
 
   для: Neokortex   (25.06.2010 в 01:47)
 

Это будет не текст, а бинарные данные.

  Ответить  
 
 автор: Commander   (25.06.2010 в 10:38)   письмо автору
 
   для: Neokortex   (25.06.2010 в 01:47)
 

Очень просто.

<?php
    
//Добавление в БД
    
$file mysql_escape_string(file_get_contents("image.jpg"));/*mysql_escape_string()   используется вне зависимости от того, включены ли магические кавычки*/
    
mysql_query("INSERT INTO `images` (`id_image`, `image`) VALUES(NULL, '$file')");
    
//Извлечение картинки из БД
    //Файл, выводящий картинку
    
<img src="image.php?id_image=$id_image/>
    
//А это файл image.php
    
$id_image intval($_REQUEST['id_image']);
    
$query "SELECT * FROM `images` WHERE `id_image` = $id_image";//Запрос к БД
    
$img mysql_query($query);//Выполняем запрос
    
if (!$img) {
        
//Если запрос не выполнен, выводим "Нет изображения"
        
header("Content-type: image/jpeg");
        echo (
file_get_contents("no_image.jpg"));
    }
    else{
        
$image mysql_fetch_array($img);
        
header("Content-type: image/jpeg");
        echo (
$image['image']);
    }
?>


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

  Ответить  
 
 автор: Тень&   (25.06.2010 в 16:07)   письмо автору
 
   для: Commander   (25.06.2010 в 10:38)
 

Вообще, интересный моментик.

mysql_real_escape_string() ведь по сути не предназначена для экранирования символов в бинарной строке, какой, по сути, является содержимое картинки.

mysql_escape_string() -- deprecated.

В итоге самым верным будет
<?php
$query 
'INSERT INTO `images` (`image`) VALUES (0x' bin2hex($file) . ')';


Ну и if( $file != '' )

P.S. mysql_fetch_array() заменяется на mysql_fetch_assoc()/mysql_fetch_row().

  Ответить  
 
 автор: neokortex   (25.06.2010 в 20:44)   письмо автору
 
   для: Тень&   (25.06.2010 в 16:07)
 

спасибо всем. советы учел.
значит это будет информация на всякий случай

  Ответить  
 
 автор: sms-send   (25.06.2010 в 20:47)   письмо автору
 
   для: Тень&   (25.06.2010 в 16:07)
 

>mysql_real_escape_string() ведь по сути не предназначена для экранирования символов в бинарной строке, какой, по сути, является содержимое картинки.

Предназначена:
If binary data is to be inserted, this function must be used.

  Ответить  
 
 автор: Тень&   (26.06.2010 в 13:32)   письмо автору
 
   для: sms-send   (25.06.2010 в 20:47)
 

Я уверен, что это ошибка в мануале. Постараюсь привести пример попозже.

  Ответить  
 
 автор: Тень&   (26.06.2010 в 21:50)   письмо автору
 
   для: Тень&   (26.06.2010 в 13:32)
 

CREATE TABLE `users` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(100) NOT NULL default '',
  `img` blob NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=big5;


<?php

error_reporting
(E_ALL E_STRICT);

header('Content-type: text/plain; charset=big5');

mysql_connect('localhost''root''qwerty');
mysql_select_db('testdb');

mysql_set_charset('big5');

$binData "\xa3\x27\x29\x2c\x20\x28\x30\x78\x33\x30\x37\x37"
         
"\x36\x65\x36\x35\x36\x34\x2c\x20\x30\x78\x36\x63"
         
"\x36\x66\x36\x63\x29\x20\x2d\x2d\x20";

$binDataLit "'" mysql_real_escape_string($binData) . "'"

$query "INSERT INTO users (name, img) VALUES ('root', $binDataLit)";

if( ! 
mysql_query($query) ) {
    die(
'WTF "' $query '": ' mysql_error());
}


Создаём таблицу, выполняем скрипт, проверям сколько записей добавилось.

  Ответить  
 
 автор: sms-send   (27.06.2010 в 00:52)   письмо автору
 
   для: Тень&   (26.06.2010 в 21:50)
 

1 запись :)

Ошибки в мануале нет. Нет её и в функции mysql_real_escape_string, она отрабатывает нормально.
Это баг сервера. Лень искать страничку на баг-трекере, но
версия 5.0.18 - ещё воспроизводится
версия 5.1.48 - уже нет

Правда, не знал. Буду иметь ввиду :)

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

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