10 классных PHP функций и сниппетов

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

Фильтрация данных перед вставкой в базу

Когда речь идёт о работе с БД, вы должны быть готовы отбиваться от SQL инъекций и прочих попыток вставить вредоносные данные. Функция, приведённая ниже, фильтрует данные, предотвращая от целого ряда опасностей:

function cleanInput($input) {

  $search = array(
    '@<script[^>]*?>.*?</script>@si',   // javascript
    '@<[\/\!]*?[^<>]*?>@si',            // HTML теги
    '@<style[^>]*?>.*?</style>@siU',    // теги style
    '@<![\s\S]*?--[ \t\n\r]*>@'         // многоуровневые комментарии
  );

    $output = preg_replace($search, '', $input);
    return $output;
  }
?>
<?php
function sanitize($input) {
    if (is_array($input)) {
        foreach($input as $var=>$val) {
            $output[$var] = sanitize($val);
        }
    }
    else {
        if (get_magic_quotes_gpc()) {
            $input = stripslashes($input);
        }
        $input  = cleanInput($input);
        $output = mysql_real_escape_string($input);
    }
    return $output;
}

Пример использования:

<?php
  $bad_string = "Hi! <script src='http://www.evilsite.com/bad_script.js'></script> It's a good day!";
  $good_string = sanitize($bad_string);
  // $good_string returns "Hi! It\'s a good day!"

  // Also use for getting POST/GET variables
  $_POST = sanitize($_POST);
  $_GET  = sanitize($_GET);
?>

Источник: http://css-tricks.com/snippets/php/sanitize-database-inputs/

Вычисляем расстояние между двумя точками

Следующая функция предназначена для вычисления расстояния между двумя точками, в зависимости от их координат.

function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2) {
    $theta = $longitude1 - $longitude2;
    $miles = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
    $miles = acos($miles);
    $miles = rad2deg($miles);
    $miles = $miles * 60 * 1.1515;
    $feet = $miles * 5280;
    $yards = $feet / 3;
    $kilometers = $miles * 1.609344;
    $meters = $kilometers * 1000;
    return compact('miles','feet','yards','kilometers','meters');
}

Пример:

$point1 = array('lat' => 40.770623, 'long' => -73.964367);
$point2 = array('lat' => 40.758224, 'long' => -73.917404);
$distance = getDistanceBetweenPointsNew($point1['lat'], $point1['long'], $point2['lat'], $point2['long']);
foreach ($distance as $unit => $value) {
    echo $unit.': '.number_format($value,4).'<br />';
}

Источник: http://www.inkplant.com/code/calculate-the-distance-between-two-points.php

Извлечение всех твитов по специальному хэштегу

Лёгкий способ извлечения твитов по хэштегу с помощью расширения cURL. В следующем примере используем хэштег #cat:

function getTweets($hash_tag) {

    $url = 'http://search.twitter.com/search.atom?q='.urlencode($hash_tag) ;
    echo "<p>Connecting to <strong>$url</strong> ...</p>";
    $ch = curl_init($url);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $xml = curl_exec ($ch);
    curl_close ($ch);

    $affected = 0;
    $twelement = new SimpleXMLElement($xml);
    foreach ($twelement->entry as $entry) {
        $text = trim($entry->title);
        $author = trim($entry->author->name);
        $time = strtotime($entry->published);
        $id = $entry->id;
        echo "<p>Tweet from ".$author.": <strong>".$text."</strong>  <em>Posted ".date('n/j/y g:i a',$time)."</em></p>";
    }

    return true ;
}

getTweets('#cats');

Источник: http://www.inkplant.com/code/get-twitter-posts-by-hashtag.php

Применяем классы для чётных и нечётных элементов

При генерации различного рода списков и таблиц при помощи PHP, иногда возникает необходимость задавать специальный класс чётным и нечётным элементам для их оформления через CSS.

В следующем примере, элементам будут заданы классы .example-class0 и .example-class1:

<div class="example-class<?php echo ($xyz++%2); ?>">

Источник: http://css-tricks.com/snippets/php/applying-evenodd-classes/

Отправка логов ошибок себе на email

Почему бы не написать свой собственный обработчик ошибок и отправлять их текст, в случае возникновения, себе на email:

<?php

function nettuts_error_handler($number, $message, $file, $line, $vars){
	$email = "
		<p>An error ($number) occurred on line
		<strong>$line</strong> and in the <strong>file: $file.</strong>
		<p> $message </p>";

	$email .= "<pre>" . print_r($vars, 1) . "</pre>";

	$headers = 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

	// отправка email-а
	error_log($email, 1, 'you@youremail.com', $headers);

	// останавливаем скрипт при возникновении ошибки
	// если она не NOTICE.
	if ( ($number !== E_NOTICE) && ($number < 2048) ) {
		die("There was an error. Please try again later.");
	}
}

// назначаем собственный обработчик.
set_error_handler('nettuts_error_handler');

// генерируем ошибку... (переменной не существует)
echo $somevarthatdoesnotexist;

Источник: http://net.tutsplus.com/tutorials/php/quick-tip-email-error-logs-to-yourself-with-php/

Автоматическое создание переменных, имя которых совпадает с ключами в $_POST

Данный сниппет очень полезен, если вы часто работаете с POST данными. Всё что от вас требуется, в этом случае, - массив с именами ключей, которые вы хотите извлечь. В результате работы сниппета, переменные будут созданы автоматически. Если ключ не будет найден в POST, то значение переменной будет NULL. Обычно мы пишем так:

$username=$_POST["username"];
$age=$_POST["age"];
…

С помощью данного сниппета, можем сделать так:

<?php
$expected=array('username','age','city','street');
foreach($expected as $key){
    if(!empty($_POST[$key])){
        ${key}=$_POST[$key];
    }
    else{
        ${key}=NULL;
    }
}
?>

Источник: http://www.catswhocode.com/blog/snippets/automatically-creates-variables-with-the-same-name-as-the-key-in-the-post-array

Загрузка и сохранение изображения на ваш сервер

Вот простой, но очень полезный сниппет, который поможет вам загрузить изображение по его URL и сохранить его на вашем сервере:

$image = file_get_contents('http://www.url.com/image.jpg');
file_put_contents('/images/image.jpg', $image); //сохраняем изображение на вашем сервере

Источник: http://www.catswhocode.com/blog/snippets/download-save-a-remote-image-on-your-server-using-php

Создание data uri

Через data uri мы можем преобразовывать такие элементы, как html/css/js, для уменьшения http запросов к сторонним ресурсам. Вот, как мы можем это сделать через PHP:

function data_uri($file, $mime) {
  $contents=file_get_contents($file);
  $base64=base64_encode($contents);
  echo "data:$mime;base64,$base64";
}

Источник: http://css-tricks.com/snippets/php/create-data-uris/

Определяем язык браузера

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

function get_client_language($availableLanguages, $default='en'){
	if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
		$langs=explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']);

		foreach ($langs as $value){
			$choice=substr($value,0,2);
			if(in_array($choice, $availableLanguages)){
				return $choice;
			}
		}
	}
	return $default;
}

Источник: http://snipplr.com/view/12631/detect-browser-language/php-detect-browser-language

Получаем размер файла

Для получения размера файла можете воспользоваться следующей функцией:

<?php
function file_size($url){
    $size = filesize($url);
    if($size >= 1073741824){
        $fileSize = round($size/1024/1024/1024,1) . 'GB';
    }elseif($size >= 1048576){
        $fileSize = round($size/1024/1024,1) . 'MB';
    }elseif($size >= 1024){
        $fileSize = round($size/1024,1) . 'KB';
    }else{
        $fileSize = $size . ' bytes';
    }
    return $fileSize;
}
echo file_size('/myfile/image.jpg');
?>

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: http://www.catswhocode.com/blog/10-awesome-php-functions-and-snippets
Перевел: Станислав Протасевич
Урок создан: 6 Июня 2013
Просмотров: 26869
Правила перепечатки


5 последних уроков рубрики "PHP"

  • Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.

  • Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

  • Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

  • Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

  • Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

или авторизуйтесь, чтобы добавлять комментарии, оценивать уроки и сохранять их в личном кабинете
  • 6 Июня 2013 22:29
    Ygreec
    Good+++
  • 7 Июня 2013 00:34
    Gerrar
    Пригодилось 2 снипа) Большое спасибо!
  • 7 Июня 2013 08:17
    RazorBlood
    Отличный урок, буду ждать следующих снипов=)
  • 7 Июня 2013 10:01
    userseal
    Про фильтрацию данных не понял. Зачем "городить огород" если есть в php конструкция filter_var($var, FILTER_SANITIZE_...)? Основную "пакость" не пропускает и плюс можно задать значение по-умолчанию. Чтобы ловить "пакость" или добавить не пустые данные. Только надо знать-понимать что должно придти. Какого типа данные. Получить переменная-значение можно и так reset ($_POST/_REQUEST); while (list ($key, $val) = each ($_POST)) { $$key = htmlspecialchars(stripslashes($val)); } Только надо проверять, а вдруг $val массив. Бывает и такое.
    • 13 Июня 2013 11:30
      djArf
      Уточнение: filter_var() доступно с версии php 5.2.0
  • 7 Июня 2013 10:25
    Arat_Kiev
    "Автоматическое создание переменных, имя которых совпадает с ключами в $_POST" Зачем? Если есть банальная функция? extract($_POST), extract($_GET)...
    • 13 Июня 2013 11:27
      djArf
      Из мануала php: Не используйте функцию extract() для непроверенных данных, таких как пользовательский ввод ($_GET, ...). Если вы сделаете это, например, для того, что бы временно запустить старый код, использующий register_globals, используйте соответствующий флаг extract_type для того, что бы не переназначить уже установленные переменные, такой как EXTR_SKIP и удостоверьтесь, что вы извлекаете содержимое массивов $_SERVER, $_SESSION, $_COOKIE, $_POST и $_GET в этом порядке. Иными словами, без напильника и здесь не обойтись.
  • 7 Июня 2013 10:25
    Khimar
    Вот мой вариант получения размера файла в понятном виде:
    function printSize($size){	$c = 0;	while($size > 1023.99){	$c++;	$size = $size / 1024;	}	switch($c){	case 0: $sufix = 'Bytes'; break;	case 1: $sufix = 'Kb'; break;	case 2: $sufix = 'Mb'; break;	case 3: $sufix = 'Gb'; break;	case 4: $sufix = 'Tb'; break;	case 5: $sufix = 'Pb'; break;	case 6: $sufix = 'Eb'; break;	}	return round($size,2). $sufix;
    }
    echo printSize( filesize('/myfile/image.jpg') );
    
    • 7 Июня 2013 10:45
      impcyber
      Можно чуть укоротить саму запись:
      function printSize ($size) {	$c = 0;	$suffix = array('Bytes', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb', 'Eb');	while ($size > 1023.99) {	$c++;	$size = $size / 1024;	}	return round($size, 2) . $suffix[$c];
      }
      echo printSize( filesize('/myfile/image.jpg') );
      
  • 7 Июня 2013 10:29
    Khimar
    Блин.... Ну что это за фигня??? Почините наконец-то коментарии !!!!!
  • 7 Июня 2013 11:05
    impcyber
    Автоматическое создание переменных, имя которых совпадает с ключами в $_POST (В функциональном стиле):
    <?php
    $expected = array('username', 'age', 'city', 'street');
    extract($keys = array_fill_keys($expected, NULL)); // Заполняем массив $keys ключами из $expected значениями NULL и импортируем в текущую таблицу символов
    extract(array_intersect_key($_POST, $keys)); // Импортируем переменные по пересечению ключей
    ?>
    
  • 9 Июня 2013 10:24
    sergogogo
    классы для чётных и нечётных элементов
    - вроде это есть в самом css, зачем лишний обработчик? браузер сам все делает,
    :nth-child
    в помощь! или я что-то не понял, растолкуйте.
  • 14 Июня 2013 16:36
    Doxtor
    "Автоматическое создание переменных, имя которых совпадает с ключами в $_POST" Вместо ${key}, следует писать $$key, иначе не передаютя имена переменных
  • 18 Июня 2013 18:45
    efremoz
    Полезные функции!
  • 20 Июня 2013 21:25
    maxlegostaev0595
    У меня только вопрос а где можно использовать расстояние между 2 точками??? Ответьте пожалуйста!
    • 2 Июля 2013 15:12
      Coder48
      Ну например я как то писал веб часть для игры GTA San Andreas Multi Player, так вот мне там понадобилось сделать вывод карты и всех игроков на ней. И данный пример мне бы пригодился.
^ Наверх ^