Картинка в БД (php MySQL)
Автор |
|
anonymousСря, 17.10.07, 17:47 |
Как се съхранява картинка в таблица? Намерих някаква информация за БЛОБ, но не ми стана много ясно. Ако някой може да ми даде съвет - за начална скорост :) , ще съм благодарна. | | insecteaterСря, 17.10.07, 18:33 |
Най добрият начин да направиш това, е да не го правиш изобщо. Имай предвид, че слагането съдържанието на картинки в бази данни ще раздуе размера на таблицата и заявките ще се обработват доста по-бавно, ще имаш по-голяма дискова активност и т.н. По-идейно е да съхраняваш в поле само името/пътя до картинката, а не самата картинка. | | darklightСря, 17.10.07, 18:53 |
Правиш полето, в което ще съхраняваш картинката, от тип BLOB След това прочиташ цялото съдържание на файла $fp = fopen( 'пътя-до-файла', 'rb'); $image = fread( $fp, filesize( 'пътя-до-файла'); $fclose( $fp ); После вкарваш в базата данни съдържанието на $image | | anonymousСря, 17.10.07, 18:57 | RE: Картинка в БД (php MySQL)
” Правиш полето, в което ще съхраняваш картинката, от тип BLOB След това прочиташ цялото съдържание на файла $fp = fopen( 'пътя-до-файла', 'rb'); $image = fread( $fp, filesize( 'пътя-до-файла'); $fclose( $fp ); После вкарваш в базата данни съдържанието на $image „ благодаря | | anonymousСря, 17.10.07, 22:37 |
И за да няма грешки от рода на no such file е добра практика да проверим дали има upload- нат такъв. Да го попроменим незабележимо за човешкото око, но за сметка на това спестявайки си доста главоболия със сигурността. И разбира се да направим това с възможно най- малко писане. В два реда: if ($_FILES['ufile']['name'])
$image = addslashes(fread(fopen($_FILES['ufile']['tmp_name'], 'rb'), filesize($_FILES['ufile']['tmp_name']))); |
редактиран от anonymous на 17.10.07 22:38 | | anonymousСря, 17.10.07, 23:45 |
Наскоро и аз нещо такова пробвах с връзка с ajax... тоест вчера :D и аз имам въпрос, като е в базата данни, после как се визуализира с тага img? | | insecteaterЧет, 18.10.07, 06:03 |
src атрибута на img тага сочи към php скрипт Самият php скрипт просто се връзва към базата данни, прочита blob полето и го "изплюва" (например с echo). Единственият трик е, че преди визуализацията, скрипта трябва да изпрати mime type-а например чрез header("Content-type: image/jpeg"); (За jpg файлове) А може и header("Content-type: image/png"); или пък header("Content-type: image/gif"); ... така де, схвана логиката. Коя картинка точно да изскочи, може да се предава чрез параметър ето пример (не съм го тествал): в html кода имаме: <img src="img.php?id=23" alt="image from blob field" /> |
"изображението" img.php съдържа следното: header("Content-type: image/jpeg"); //Казва на браузъра, че данните представляват картинка
mysql_connect("host", "user", "pass"); //Връзка към базата данни
mysql_select_db("database"); //Няма нужда от обяснение
$query = 'SELECT blobfield FROM table_name WHERE id='.($_GET['id']*1).' LIMIT 1' ; //Конструиране на заявката ...
$result = mysql_query($query); //... и нейното изпращане
$row = mysql_fetch($result); //обработване резулататa от заявката
echo $row[0]; //Показване съдържанието на картинката
|
Редакция: пак да повторя, по принцип е лоша идея самите картинки да се съхраняват в базата данни. По-издържано е, в базата данни да се пази само името/пътя до файла. | | anonymousЧет, 18.10.07, 10:32 |
insecteater е прав! BLOB полетата (в Oracle - CLOB) са удобен начин за съхраняване на големи по обем данни, но както се каза, това забавя четенето, както и оскъпява визуализирането на картинките. Самият преход от четене на картинка от базата през конвертирането й към визуализирането й е много ресурсоотнемащ. Забелязал съм в много сайтове и още едно калпаво нещо, а именно използването на библиотеката GD в реално време. Така мисля беше направен сайтът на Топспорт.bg. Самата библиотека е нещо много ценно и който я владее, може чудеса да прави с картинки. НО! Само от гледна точка на администраторската поддръжка. Предварително ъплоудване на картинки, обработката им с GD и разполагането им в реални директории. А не това да става по време на разглеждане на сайта. | | anonymousЧет, 18.10.07, 17:26 | RE: Картинка в БД (php MySQL)
По-издържано е, в базата данни да се пази само името/пътя до файла. Дай няколко реда за пример за товта идея, щом е по-добра. редактиран от anonymous на 18.10.07 17:27 | | insecteaterПет, 19.10.07, 06:29 |
Ами например, ако имаш само една картинка към даден запис от база данни, даже не е и необходимо да слагаш поле за тази картинка. Можеш да запазваш картинката в отделна папка, като по време на upload-а я преименуваш така, че да се свърже с id-то на съответния запис. Например записът в таблицата за потребител InsectEater има id = 654. В папката images има файл 654.jpg който представлява снимката на InsectEater. Така необходимият път за показване в html кода може лесно да се сглоби <?php echo '<img src="images/'.($_GET['UserId']*1).".jpg\" alt=\"$UserName\" />"; ?> |
резултатът от този код ще бъде: <img src="images/654.jpg" alt="InsectEater" /> |
(Зависи откъде взимаш id-то на записа - в случая от $_GET) Видно е, че е необходимо единствено id-то на потребителя, за да се домогнем и до неговата снимка, без допълнителни извличания от базата данни. | | Коментар |