This Might Be Useful

Archive for the ‘PHP’ Category

Изменяем размеры картинки с сохранением прозрачности (PHP+GD)

Friday, January 30th, 2009 | PHP | 1 Comment »

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

  • imagecolorallocatealpha
    int imagecolorallocatealpha ( resource $image, int $red, int $green, int $blue, int $alpha)
  • imagealphablending
    bool imagealphablending ( resource $image, bool $blendmode)
  • imagesavealpha
    bool imagesavealpha ( resource $image, bool $saveflag)

Код в результате выглядит примерно так:

PHP:
  1. $imgInfo = getimagesize($img);
  2. $im = imagecreatefrompng($img);
  3. $newImg = imagecreatetruecolor($nWidth, $nHeight);
  4. imagealphablending($newImg, false);
  5. imagesavealpha($newImg,true);
  6. $transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
  7. imagefilledrectangle($newImg, 0, 0, $nWidth, $nHeight, $transparent);
  8. imagecopyresampled($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight, $imgInfo[0], $imgInfo[1]);

Так что мою старую функцию можно доработать так, чтобы она сохраняла прозрачность картинок. Заодно и тип файла можно проверять не по расширению, а по тому, что вернет getimagesize (исходя из приведенного выше примера - это элемент $imgInfo[2]).

Постовой: Даже ребенок знает, что сделать сайт недостаточно, надо еще и найти качественный хостинг.

Автоматически создаем вложенные папки

Tuesday, September 2nd, 2008 | PHP | 3 Comments »

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

PHP:
  1. function mkpath($path, $mode=0777) {
  2.   $path = rtrim($path, '/');
  3.   $top = substr($path, 0, strrpos($path, '/'));
  4.  
  5.   if (!file_exists($top)) {
  6.     mkpath($top);
  7.   }
  8.  
  9.   $dir = substr($path, (strrpos($path, '/') + 1));
  10.  
  11.   if (!file_exists($top.'/'.$dir)) {
  12.     $r = mkdir($top.'/'.$dir);
  13.     chmod($top.'/'.$dir, $mode);
  14.   }
  15. } // mkpath

Автор: dreg
Tuning: Filosoff

Двигаем при выводе строчки в таблице друг относительно друга

Thursday, August 14th, 2008 | PHP, SQL | No Comments »

Часто встречается ситуация, когда необходимо вручную устанавливать порядок вывода записей в некоем списке. То есть клиент должен иметь возможность двигать строчки вверх-вниз друг относительно друга. Некоторые "программисты" изобретают для этого сложнейшие велосипеды. На самом же деле сделать это очень просто. Просто создаем дополнительное поле `customorder`, которое по умолчанию равно `id` (в случае, усли `id` не auto_increment, можно его ставить в (MAX(`customorder`) + 1)). Затем используем вот такую простую функцию:

PHP:
  1. function move_line($id, $up) {
  2.   $rez = mysql_query('SELECT `customorder`
  3.       FROM `thetable`
  4.       WHERE `id` = '.intval($id));
  5.   list($o) = mysql_fetch_row($rez);
  6.   $rez = mysql_query('SELECT `id`, `customorder`
  7.       FROM `thetable`
  8.       WHERE `customorder` '.($up ? '<' : '>').' '.$o.'
  9.       ORDER BY `order` '.($up ? 'DESC' : 'ASC').'
  10.       LIMIT 1');
  11.   if (mysql_num_rows($rez) > 0) {
  12.     list($nid, $no) = mysql_fetch_row($rez);
  13.     mysql_query('UPDATE `content`
  14.       SET `customorder` = '.$no.'
  15.       WHERE `id` = '.$id);
  16.     mysql_query('UPDATE `content`
  17.       SET `customorder` = '.$o.'
  18.       WHERE `id` = '.$nid);
  19.   }
  20. } // move_line

И да, я знаю, что это можно сделать меньшим количеством запросов. Но так нагляднее :).

Уменьшаем нагрузку на сервер - кэширование данных для ускорения генерации страницы

Wednesday, July 2nd, 2008 | PHP | 2 Comments »

Представьте себе проект, в котором достаточно сложная структура базы данных. Да и собственно данных много. И для генерации страницы постоянно необходимо примерно одним и тем же образом вытягивать и обрабатывать массу информации. В моем случае это дело занимало до 25 секунд на весьма неслабой машине. Для оптимизации процесса было принято решение кэшировать данные. Само собой, это снимает только часть проблем. Но ведь кэш можно еще и генерировать автоматически, верно? :).
В общем, ниже я приведу небольшой класс, сделанный за несколько минут. Кэширует массив, в котором хранится основной dataset. По умолчанию считается, что данного REQUEST_URI dataset постоянен. Но есть параметры для изменения такого поведения.
(more...)

Полноценная функция для получения IP-адреса клиента

Friday, May 9th, 2008 | PHP | 10 Comments »

Небольшая, но очень полезная функция для получения IP-адреса клиента. Основной плюс - в отличии от большинства решений учитывает не только REMOTE_ADDR.
Собственно публикую чтобы не потерять. А то регулярно ищу это дело по старому коду :).

PHP:
  1. function GetIP() {
  2.   if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
  3.      $ip = getenv("HTTP_CLIENT_IP");
  4.   else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
  5.      $ip = getenv("HTTP_X_FORWARDED_FOR");
  6.   else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
  7.      $ip = getenv("REMOTE_ADDR");
  8.   else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
  9.      $ip = $_SERVER['REMOTE_ADDR'];
  10.   else
  11.      $ip = "unknown";
  12.   return $ip;
  13. } // GetIP

 Страница: 1 (всего: 4)  1  2  3  4 »