Вывод из БД изображений по типу. Как?

S
На сайте с 06.08.2008
Offline
130
831

БД mysql в таблице banner в поле image хранятся данные с именами файлов.

Типы файлов разные: gif/jpg/jpeg/png

Например:
1-5-b6c.gif
1-5-b4c.png
2-10-23e.jpeg
135-b6c.gif

Выводятся примерно таким запросом:

$banner = $base->exec('select id, user_id, image, url from banner limit '.$limit);

Как проверить тип файла и вывести, например, все файлы кроме gif?

slaveofmoney
На сайте с 18.08.2008
Offline
131
#1

$banner = $base->exec("select id, user_id, image, url from banner where image like '%gif%' limit ".$limit); - выведет все gif

$banner = $base->exec("select id, user_id, image, url from banner where image NOT like '%gif%' limit ".$limit); - выведет все кроме gif

подвоные камни если баннер называется gif-2-2-3.jpg

то он попадет в первую выборку но не попадет во вторую, но можно юзать regexp

mts снизу точнее указал %.gif ))

пусто )
mts
На сайте с 10.06.2006
Offline
108
mts
#2

image NOT LIKE '%.gif'

Разработка и поддержка сайтов (http://webmaster24.ru/)
SandyMan
На сайте с 13.06.2004
Offline
129
#3
spiderbuber:
БД mysql в таблице banner в поле image хранятся данные с именами файлов.
Типы файлов разные: gif/jpg/jpeg/png


Выводятся примерно таким запросом:
$banner = $base->exec('select id, user_id, image, url from banner limit '.$limit);

Как проверить тип файла и вывести, например, все файлы кроме gif?

$banner = $base->exec('select id, user_id, image, url from banner

WHERE image not like '%.gif'

limit '.$limit);

А если таблица очень большая, то для увеличении производительности, можно добавить ещё одну колонку (image_type) с типом INT, в которой будет согхранятся цифра в соответствии с типом файла. И сделать индекс на это поле.

Например, если для gif будет цифра 1, то запрос будет:

$banner = $base->exec('select id, user_id, image, url from banner

WHERE image_type != 1

limit '.$limit);

P.S. :) пока писал, другие опередили

S
На сайте с 06.08.2008
Offline
130
#4
А если таблица очень большая, то для увеличении производительности, можно добавить ещё одну колонку (image_type) с типом INT, в которой будет согхранятся цифра в соответствии с типом файла. И сделать индекс на это поле.

Да, таблица очень большая и постоянно растёт..

Как тогда сделать простановку в зависимости от типа?

Нужно просто разделение: анимированное\не анимированное изображение. Или типа гиф и всё остальное. Как автоматически помечать gif файлы? И что в таком случае делать с уже огромной базой - проставлять ручками?

slaveofmoney
На сайте с 18.08.2008
Offline
131
#5
spiderbuber:
Да, таблица очень большая и постоянно растёт..
Как тогда сделать простановку в зависимости от типа?
Нужно просто разделение: анимированное\не анимированное изображение. Или типа гиф и всё остальное. Как автоматически помечать gif файлы? И что в таком случае делать с уже огромной базой - проставлять ручками?

сначала добавить через phpmyadmin или прочее еще одну колонку в таблицу например type тип tinyint

или enum

сделать скрипт php который причешет всю таблицу

если сами не можете, напишите в pm я вам бесплатно сделаю

S
На сайте с 06.08.2008
Offline
130
#6
сначала добавить через phpmyadmin или прочее еще одну колонку

с этим понятно..

Мне нужен пример кода именно - проверка на тип файл, с остальным справлюсь.

напишите в pm я вам бесплатно сделаю

Чирканите тут, может еще кому полезно будет.

---------- Добавлено 28.06.2012 в 12:07 ----------

Еще посоветовали такое определения анимации..

//http://stackoverflow.com/questions/280658/can-i-detect-animated-gifs-using-php-and-gd
function is_ani($filename) {
if(!($fh = @fopen($filename, 'rb')))
return false;
$count = 0;
//an animated gif contains multiple "frames", with each frame having a
//header made up of:
// * a static 4-byte sequence (\x00\x21\xF9\x04)
// * 4 variable bytes
// * a static 2-byte sequence (\x00\x2C)

// We read through the file til we reach the end of the file, or we've found
// at least 2 frame headers
while(!feof($fh) && $count < 2) {
$chunk = fread($fh, 1024 * 100); //read 100kb at a time
$count += preg_match_all('#\x00\x21\xF9\x04.{4}\x00\x2C#s', $chunk, $matches);
}

fclose($fh);
return $count > 1;
}

Но что-то не соображу как встроить в свой код. Варианты выше более понятны..

slaveofmoney
На сайте с 18.08.2008
Offline
131
#7

добавьте поле type тип tinyint, значение по умолчанию 0


if ($ res =mysql_query("select id from banner where image like '%.gif'")){
while ($row = mysql_fetch_assoc($res)){
mysql_query("update image set type=1 where id=$row[id]");
}
}

блин парсер портит код where id=$row [ id ] только уберите пробелы

как то так, ну и когда добавляете изображение в базу сделайте проверку на тип файла и ставьте соответствующее значение в базу

S
На сайте с 06.08.2008
Offline
130
#8
ну и когда добавляете изображение в базу сделайте проверку на тип файла

не до конца понял - отписал в ЛС..

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий