Как проверить наличие картинки в поле blob?

Bboy

Новичок
Как проверить наличие картинки в поле blob?

Сделал upload файла (gif, jpg) в бд.
Теперь надо делать выборку по полю, где есть картинки. Как проверить, есть ли картинка в поле типа blob?
 

Demiurg

Guest
прочитать из блоба в файл, потом натравить на этот файл [m]getimagesize[/m]
 

Bboy

Новичок
а нельзя сделать как-нибудь так:
select * from table_name where photo [существует]

???
 

Demiurg

Guest
select * from table_name where photo is not null, если ты их обнуляешь при отсутствии картинки.
 

Bboy

Новичок
Во! А как их можно обнулять при отсутсвии картинки?
 

Bboy

Новичок
помоему получается замкнутый круг.
update table_name set photo = null where [обнуляем при условии, что мы знаем что оно пустое]
дак как же все таки узнать, пустое ли оно?
 

Demiurg

Guest
У тебя данные случайным образом добавляются ?
 

mmaaxx

Guest
Если картинки добовляет твой скрипт, то наилучший вариант - при добавлении определять тип и записывать в отдельное поле.
Если не ты, то ты можеш проверять блобы на хэдэры картинок, ну или на часли этих хэдэров, например
У jpg с 7 по 10 символы - JFIF
У gif первые 3 - GIF
У png с 2 по 4 - PNG
Для других типов, если нужно, я думаю сам найдёшь :)
И в запросе пишешь:
PHP:
delete from tbl where not(substr(img,6,4)='JFIF' or substr(img,0,3)='GIF' or substr(img,1,3)='PNG')
Это конечно не особо надёжно, в том слуйчае если будет файл который не будет картинкой, но будет содержать нужные символы на нужном месте. Если это тебя не устраивает, то проверяй заголовок файла полностью. Найди где-то описания форматов файлов и разберись какие части заголовка - постоянные, на них и проверяй будет конечно медленно.
 

Demiurg

Guest
mmaaxx, не надо предлогать извращенные решения.
 

mmaaxx

Guest
Автор оригинала: Demiurg
mmaaxx, не надо предлогать извращенные решения.
А чем извращены решения:
1) при добавлении определять тип и записывать в отдельное поле
2) where not(substr(img,6,4)='JFIF' or substr(img,0,3)='GIF' or substr(img,1,3)='PNG')
???
 

Demiurg

Guest
во втором варианте точно. а в первом не хватает еще добавления размеров картинки в ту же база. я бы рекомендовал хранить картинки в файловой системе.
 

mmaaxx

Guest
я бы рекомендовал хранить картинки в файловой системе.
Абсолютно согласен, хранить картинки в файлах - самый верный вариант, подходящий подовляющему большенству проектов.
Но вопрос был всё как определить где картинка, а где другая информация
Автор оригинала: Demiurg
во втором варианте точно.
where not(substr(img,6,4)='JFIF' or substr(img,0,3)='GIF' or substr(img,1,3)='PNG')
IMHO это наиболее простой вариант, если не иметь возможности изменить скрипт добавления или уже существует таблица набитая данными. И явно быстрее и менее извращёнее, чем сохранять на диск, а потом запрашивать getimagesize().
а в первом не хватает еще добавления размеров картинки в ту же база.
Я не против добовления размеров, но помойму задача не в этом.
 

Demiurg

Guest
>а где другая информация
какая другая информация может быть в поле photo ?

> если не иметь возможности изменить скрипт добавления
как это не имеется изменить скрипт добавления ?
>или уже существует таблица набитая данными.
что мешает пройтись один раз по базе и сделать нужные изменения ?

>Я не против добовления размеров, но помойму задача не в этом.
да это я так, на будущее, заренне отвечаю на следующие вопросы.
 

mmaaxx

Guest
>какая другая информация может быть в поле photo ?
Упс, названия поля незаметил :)

>как это не имеется изменить скрипт добавления ?
Куча вариантов (от - прав доступа, до - база реплицируеться с другого сервера)

>что мешает пройтись один раз по базе и сделать нужные изменения ?
Ну не руками ж проходиться

>да это я так, на будущее, заренне отвечаю на следующие вопросы.
:)

А про
where not(substr(img,6,4)='JFIF' or substr(img,0,3)='GIF' or substr(img,1,3)='PNG')
это конечно жэ имелось введу, если есть блоб в котором идет и разные файлы (картинки и некартинки).
 

Bboy

Новичок
после всего сказанного прихожу к выводу, что проще (а видимо и эффективнее) хранить все-таки эти гребанные картинки в файловой системе, а не в бд.
Пошел таким путем:
1) форма для upload'a

<form enctype="multipart/form-data" action="http://localhost/nf/upload.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
Send this file: <input name="userfile" type="file">
<input type="submit" value="Send File">
</form>

2) upload.php
<?php
$uploaddir = 'http://localhost/tmp/';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir .
$_FILES['userfile']['name'])) {
print "File is valid, and was successfully uploaded.";
} else {
print "There some errors!";
}
?>

При выполнении скрипта выдаются след. ошибки:
Warning: move_uploaded_file(http://localhost/tmp/1.gif) [function.move-uploaded-file]: failed to create stream: HTTP wrapper does not support writeable connections. in z:\home\localhost\www\nf\upload.php on line 4

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp\php99.tmp' to 'http://localhost/tmp/1.gif' in z:\home\localhost\www\nf\upload.php on line 4
There some errors!

Что это за


...HTTP wrapper does not support writeable connections... ???
 

Макс

Старожил PHPClub
гениальная строка :
PHP:
$uploaddir = 'http://localhost/tmp/'; /// <<<<
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir .
$_FILES['userfile']['name'])) {
 

Bboy

Новичок
исправил на
$uploaddir = '/tmp/';
и заработало, а почему, не пойму:) ?
 

lucas

Guest
Второй параметр move_uploaded_file() указывает, в какой файл будет скопирован твой загруженный файл.

HTTP wrapper does not support writeable connections
Ты указываешь в запросе http:// -- PHP использует HTTP-wrapper, чтобы запросить/отправить файл. Но писать то по HTTP мы не можем! Поэтому генерируется ошибка.
 

mmaaxx

Guest
Bboy
Не рекомендую сохранять картинки в /tmp :)
Не забывай, что разные картинки могут быть с одинаковыми именами (типа img.gif, ...), а move_uploaded_file - заменит и не пикнет :)
 
Сверху