Динамическое формирование where для создания фильтров

Написать этот пост меня побудили вопросы на эту тему на форуме php.ru. Итак, нужно при задании фильтров каких-то объектов (например, товаров) динамически формировать where. Сейчас я покажу, как это делается в построителях запросов известных мне фреймворкоа. Возьмём простой случай, когда все поля для фильтрации в одной таблице, и не требуется join-ов.
Continue reading ‘Динамическое формирование where для создания фильтров’ »

Универсальный обработчик форм на PHP своими руками

Практически во всех фреймворках реализована очень удобная работа с формами, позволяющая легко сделать валидацию вводимых данных. А что, если проект не настолько крупный, чтоб использовать целый фреймворк, но формы для ввода данных все равно хочется проверять. Сегодня я хочу показать, как на php можно написать достаточно универсальный класс валидации данных.
Continue reading ‘Универсальный обработчик форм на PHP своими руками’ »

PHP регулярные выражения: разбиение на слова для любого языка

Достаточно долго в моих проектах разбиение на слова делалось очень простой регуляркой:

preg_match_all("|([A-Za-zА-Яа-я0-9]+)|u", $str, $words);

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

preg_match_all('/([\pL0-9]+)/u', $str, $words);

Русская дата (с месяцами)

Не помню, откуда стащил, но эта функция бывает очень полезна:

function russian_date($d){
    $date=explode(".", date("d.m.Y", $d));
    switch ($date[1]){
        case 1: $m='января'; break;
        case 2: $m='февраля'; break;
        case 3: $m='марта'; break;
        case 4: $m='апреля'; break;
        case 5: $m='мая'; break;
        case 6: $m='июня'; break;
        case 7: $m='июля'; break;
        case 8: $m='августа'; break;
        case 9: $m='сентября'; break;
        case 10: $m='октября'; break;
        case 11: $m='ноября'; break;
        case 12: $m='декабря'; break;
    }
    return $date[0].' '.$m.' '.$date[2] . " г.";
}

Прекрасная функция рекурсивного удаления директорий

Алгоритм не сложный, но так не хочется каждый раз его сочинять 🙂

function RemoveDir($path, $del_root = true)
{
	if(file_exists($path) && is_dir($path))
	{
		$dirHandle = opendir($path);
		while (false !== ($file = readdir($dirHandle))) 
		{
			if ($file!='.' && $file!='..')// исключаем папки с назварием '.' и '..' 
			{
				$tmpPath=$path.'/'.$file;
				chmod($tmpPath, 0777);
				
				if (is_dir($tmpPath))
	  		{  // если папка
					RemoveDir($tmpPath);
			  } 
	  		else 
	  			{ 
	  				if(file_exists($tmpPath))
					  {
						  // удаляем файл 
	  					unlink($tmpPath);
					   }
	  			}
			}
		}
		closedir($dirHandle);
		
		// удаляем текущую папку
		if(file_exists($path) && $del_root)
		{
			rmdir($path);
		}
	}
	else
	{
		return 0;
	}
}

Масштабирование изображения под максимальный размер

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

function getNewSize($size, $maxX, $maxY) {
  $k = $maxX / $maxY;
  $kimage = $size[0] / $size[1];
  if ($kimage > $k) { //resize of maxX
    $ksize = $maxX /$size[0];
  } else { //resize of maxY
    $ksize = $maxY / $size[1];
  }
  $newX = floor($size[0] * $ksize);
  $newY = floor($size[1] * $ksize);

  /* image resize */

  return [$newX, $newY];
}

Спасибо romach с форума php.ru

Когда Kohana ORM может навредить или преимущество группирующих запросов SQL

Итак, после долгого перерыва я снова готов написать статью. Перерыв был по весьма уважительной причине — делал свой первый относительно крупный проект на Kohana Framework. И естественно, для базы данных я использовал ORM. Эта статья — о ловушках, в которые я с ним попал.
Continue reading ‘Когда Kohana ORM может навредить или преимущество группирующих запросов SQL’ »

Получение списка файлов, отсортированных по дате

Ну здесь, я думаю, всё ясно из заголовка. Скрипт стащил отсюда.

function listdir_by_date($path){
    $dir = opendir($path);
    $list = array();
    while($file = readdir($dir)){
        if ($file != '.' and $file != '..'){
            // кроме даты создания файлы добавляем ещё и имя
            // чтобы удостоверится, что мы не заменяем ключ массива
            $ctime = filectime($path . $file) . ',' . $file;
            $list[$ctime] = $file;
        }
    }
    closedir($dir);
    krsort($list);
    return $list;
}