Уменьшение количества цветов в изображении

Часто для оптимизацации изображения или достижения плакатного эффекта количество цветов в гамме сокращают. В библиотеке GDLib для этого предназначена функция imagetruecolortopalette(). Напишем небольшой скрипт, который принимает единственный параметр $_GET['color'], равный количеству цветов в конечном изображении.

<?php
if ( !isset( $_GET['color'] ) )
  $color = 256;
else
  $color = (int)$_GET['color'];
// Проверяем корректность параметра $_GET['color']
if( $color < 2 ) $color = 2;
if( $color > 256 ) $color = 256;
// Создаем изображение на основе существующего
$image = imagecreatefromjpeg( 'image.jpg' );
if( $image ) {
  // Уменьшаем количество цветов
  imagetruecolortopalette( $image, true, $color );
  // Отправляем HTTP-заголовок Content-type
  header( 'Content-type: image/gif' );
  // Выводим изображение в браузер
  imagegif( $image );
  // Уничтожаем изображение в памяти
  imagedestroy( $image );
}
?>

Файл index.html демонстрирует работу скрипта:

<img src="image.jpg" alt="" />
<img src="image.php?color=60" alt="" /><br/>
<img src="image.php?color=30" alt="" />
<img src="image.php?color=15" alt="" /><br/>
<img src="image.php?color=5" alt="" />
<img src="image.php?color=2" alt="" />

Полнотекстовой поиск в MySQL

Полнотекстовой поиск в MySQL на сегодняшний день поддерживается только для таблиц типа MyISAM и только для текстовых столбцов переменной длины (TEXT и VARCHAR). Эта возможность активируется созданием индекса FULLTEXT для столбцов, по которым необходимо осуществлять поиск.

Полнотекстовой поиск в MySQL не чувствителен к регистру. Кроме того, при поиске игнорируются так называемые “общеупотребительные” слова. К ним относятся слишком короткие слова (по умолчанию состоящие меньше, чем из четырех символов), а также слова, встречающиеся, по крайней мере, в половине записей. Так если в таблице имеются только две записи, то поиск не даст результатов, поскольку каждое слово будет присутствовать в половине записей.

Для использования возможности полнотекстового поиска в таблице, содержащей текстовые поля, необходимо создать индексы FULLTEXT. Изменить уже существующие таблицы можно при помощи оператора ALTER:

ALTER TABLE mytable ADD FULLTEXT name (name);

Здесь сразу после ключевого слова FULLTEXT следует имя создаваемого индекса, за которым в скобках указано имя текстового столбца.

Индекс FULLTEXT можно создать сразу по нескольким столбцам. Для этого в скобках после имени индекса нужно указать имена двух столбцов через запятую:

ALTER TABLE mytable ADD FULLTEXT name (name, description);

Если индекс создается только по одному столбцу и его имя совпадает с именем столбца, то имя индекса, размещенного после ключевого слова FULLTEXT, можно опустить.

На количество индексов в таблице ограничения также не накладываются, допустимо создание нескольких индексов:

ALTER TABLE mytable ADD FULLTEXT (name),
                    ADD FULLTEXT (description),
                    ADD FULLTEXT together (name, description);

Поиск выполняется при помощи встроенной функции MATCH(), в качестве аргумента которой выступает один или более индексов типа FULLTEXT, а также функции AGAINST(), которая принимает в качестве аргумента искомую строку:

SELECT * FROM mytable WHERE MATCH(name) AGAINST('программирование');

Здесь из таблицы mytable извлекаются все записи, поле name которых содержит слово “программирование”. Синтаксис допускает использование нескольких конструкций MATCH() - AGAINST() после оператора WHERE, разделенных логическими операторами OR или AND:

SELECT * FROM mytable WHERE MATCH(together) AGAINST('программирование')
                         OR MATCH(together) AGAINST('кодирование');

Здесь из таблицы mytable извлекаются все записи, поля name или description которых содержат либо слово “программирование”, либо слово “кодирование”.

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

Начиная с версии 4.0.1 MySQL поддерживает поиск в так называемом логическом режиме, позволяющем задать обязательное отсутствие слова в результатах запроса, изменять величину релевантности для отдельных слов и многое другое.

Ссылки по теме:

Удаление и выборка нескольких записей

В web-программировании, особенно при создании различных панелей администрирования, часто встает задача множественного выбора или удаления сразу нескольких записей из базы данных. Пусть имеется таблица items, содержащая два поля: первичный ключ таблицы id и текстовое поле title.

Для удаления записей обычно создается HTML-форма с набором флажков:

<input type="checkbox" name="item[]" value="5" /><br/>
<input type="checkbox" name="item[]" value="7" /><br/>
<input type="checkbox" name="item[]" value="12" /><br/>
<input type="checkbox" name="item[]" value="25" /><br/>
<input type="checkbox" name="item[]" value="32" /><br/>

Скрипт, формирующий список элементов input формы, и удаляющий выбранные записи может выглядеть так:

<?php
echo '<h2>Список</h2>';
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="POST">';
$query = "SELECT id, title FROM items WHERE 1";
$res = mysql_query( $query );
echo '<table border="1">';;
echo '<tr><th>ID</th><th>Наименование</th><th>Удл.</th></tr>';
while ( $item = mysql_fetch_array( $res ) )
{
  echo '<tr>';
  echo '<td>'.$item['id'].'</td>';
  echo '<td>'.$item['title'].'</td>';
  echo '<td><input type="checkbox" name="item[]" value="'.$item['id'].'" /></td>'
  echo '</tr>';
}
echo '</table>';
echo '<input type="submit" name="submitForm" value="Удалить отмеченные" />';
echo '</form>';

if ( isset ( $_POST['item'] ) )
{
  $ids = implode( ',', $_POST['item'] );
  $query = 'DELETE FROM items WHERE id IN ('.$ids.')';
  mysql_query( $query );
  header( 'Location: '.$_SERVER['PHP_SELF'] );
}
?>

Массив $_POST['item'] содержит ID всех отмеченных checkbox-ов (не отмеченные на сервер не передаются). Запрос к БД на удаление выглядит так

DELETE FROM items WHERE id IN (6,9,11,12);

Если стоит задача не удаления записей, а их выборки, то вместо оператора DELETE следует использовать оператор SELECT.