Веб-программирование

Полезные сниппеты и функции PHP

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

Полезные сниппеты и функции PHP
Поделиться в соцсетях:

Конвертация PDF-файлов в JPG с помощью PHP и Image Magick

Этот простой фрагмент PHP-кода конвертирует PDF-файл в изображение JPG. Это очень полезно, если вам нужно создать изображение для предварительного просмотра ваших файлов в формате PDF. Пожалуйста, обратите внимание, что у вас должно быть установлено расширение Image Magick на вашем сервере, чтобы использовать этот код.

$pdf_file   = './pdf/demo.pdf';
$save_to    = './jpg/demo.jpg'; //Убедитесь, что Apache имеет разрешения на запись в эту папку! (частая проблема)

//выполните ImageMagick коммандой 'convert' и конвертируйте PDF в JPG с указанными настройками
exec('convert "'.$pdf_file.'" -colorspace RGB -resize 800 "'.$save_to.'"', $output, $return_var);
if ($return_var == 0) {
    //если конвертация прошла успешно
    print "Conversion OK";
} else print "Ошибка конвертации.<br />" . $output;

Источник: https://snipplr.com/view/48513

Проверка записываемой информации в базу данных

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

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;
}

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;
}

// Использование:
$bad_string = "Привет! <script src='http://www.evilsite.com/bad_script.js'></script> Какой хороший сегодня день!";
$good_string = sanitize($bad_string);
// $good_string вернет "Привет! Какой хороший сегодня день!"

// Также используйте для проверки POST/GET данных
$_POST = sanitize($_POST);
$_GET  = sanitize($_GET);

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

Создание data URI изображения при помощи PHP

Вместо предоставления традиционного адреса изображения, вы можете использовать данные изображения в кодировке base64 и добавить их в атрибут src. Это экономит сетевые запросы для каждого изображения, и предотвращает попытки несанкционированного доступа к каталогам с изображениями. Обратите внимание, что в IE7 и ниже, это работать не будет.

// имя изображения
$image = 'cricci.jpg';

// кодируем изображение в base64
$imageData = base64_encode(file_get_contents($image));

// формат пути к изображению:  data:{mime};base64,{data};
$src = 'data: '.mime_content_type($image).';base64,'.$imageData;

//Вывод изображения
echo '<img src="',$src,'">';

Источник: https://davidwalsh.name/data-uri-php

Создание CSV-файла из массива PHP

Это простая, но эффективная функция для генерации CSV-файла из массива PHP. Функция принимает 3 параметра: данные, разделители полей CSV (по умолчанию это запятая) и ограничители полей CSV (по умолчанию - двойные кавычки).

function generateCsv($data, $delimiter = ',', $enclosure = '"') {
    $handle = fopen('php://temp', 'r+');
    foreach ($data as $line) {
        fputcsv($handle, $line, $delimiter, $enclosure);
    }
    rewind($handle);
    while (!feof($handle)) {
        $contents .= fread($handle, 8192);
    }
    fclose($handle);
    return $contents;
}

Источник: https://snipplr.com/view/66856/generate-csv-file-from-array-using-php/

Разархивирование файлов при помощи PHP

Эта функция принимает два параметра: zip-архив и папку, в которую нужно архив распаковать.

function unzip_file($file, $destination){
    // создаем объект
    $zip = new ZipArchive() ;
    // открываем архив
    if ($zip->open($file) !== TRUE) {
        die ('Невозможно открыть архив');
    }
    // распаковываем содержимое в указанную директорию
    $zip->extractTo($destination);
    // закрываем архив
    $zip->close();
    echo 'Архив распакован';
}

Источник: https://www.catswhocode.com/blog/snippets/unzip-zip-files

Определить местонахождение по IP

Этот полезный фрагмент кода поможет вам определить местоположения конкретного IP. Функция принимает один IP в качестве параметра, и возвращает местоположение. Если местоположение не найдено, возвращается UNKNOWN.

function detect_city($ip) {
    
    $default = 'UNKNOWN';
    
    if (!is_string($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost')
    $ip = '8.8.8.8';
    
    $curlopt_useragent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)';
    
    $url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
    $ch = curl_init();
    
    $curl_opt = array(
        CURLOPT_FOLLOWLOCATION => 1,
        CURLOPT_HEADER => 0,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_USERAGENT => $curlopt_useragent,
        CURLOPT_URL => $url,
        CURLOPT_TIMEOUT => 1,
        CURLOPT_REFERER         => '<a href="http:// ."" rel="nofollow" target="_blank" >http://' .</a> $_SERVER['HTTP_HOST'],
    );
    
    curl_setopt_array($ch, $curl_opt);
    
    $content = curl_exec($ch);
    
    if (!is_null($curl_info)) {
        $curl_info = curl_getinfo($ch);
    }
    
    curl_close($ch);
    
    if ( preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs) )  {
        $city = $regs[1];
    }
    if ( preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs) )  {
        $state = $regs[1];
    }
    
    if ( $city!='' &amp;&amp; $state!='' ) {
        $location = $city . ', ' . $state;
        return $location;
    } else {
        return $default;
    }
    
}

Источник: https://www.catswhocode.com/blog/snippets/detect-location-by-ip

Отсылаем логи ошибок себе на email

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

Эта функция будет отсылать вам по электронной почте логи, как только ошибка произойдет на вашем сайте. Очень удобно, чтобы быть всегда в курсе проблем вашего сайта.

function nettuts_error_handler($number, $message, $file, $line, $vars){
    $email = "
    <p>Ошибка ($number) произошла в строке
    <strong>$line</strong> в <strong>файле: $file.</strong>
    <p> $message </p>";
    
    $email .= "<pre>" . print_r($vars, 1) . "</pre>";
    
    $headers = 'Content-type: text/html; charset=UTF-8' . "\r\n";
    
    // Кому отсылаем email...
    error_log($email, 1, <span id="cloak80e8eace320bb1b97f99c988d200306f">Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.</span><script type='text/javascript'>
    document.getElementById('cloak80e8eace320bb1b97f99c988d200306f').innerHTML = '';
    var prefix = '&#109;a' + 'i&#108;' + '&#116;o';
    var path = 'hr' + 'ef' + '=';
    var addy80e8eace320bb1b97f99c988d200306f = '&#039;y&#111;&#117;' + '&#64;';
    addy80e8eace320bb1b97f99c988d200306f = addy80e8eace320bb1b97f99c988d200306f + 'y&#111;&#117;r&#101;m&#97;&#105;l' + '&#46;' + 'c&#111;m';
    var addy_text80e8eace320bb1b97f99c988d200306f = '&#039;y&#111;&#117;' + '&#64;' + 'y&#111;&#117;r&#101;m&#97;&#105;l' + '&#46;' + 'c&#111;m';document.getElementById('cloak80e8eace320bb1b97f99c988d200306f').innerHTML += '<a ' + path + '\'' + prefix + ':' + addy80e8eace320bb1b97f99c988d200306f + '\'>'+addy_text80e8eace320bb1b97f99c988d200306f+'<\/a>';
    </script>', $headers);
    
    // Определитесь как реагировать на ошибки (на стороне пользователя)
    // Либо это сообщение об ошибке, или завершить работу скрипта ...
    // Этот код прекращает работу скрипта, если ошибка была более чем просто уведомление.
    if ( ($number !== E_NOTICE) &amp;&amp; ($number < 2048) ) {
        die("Произошла ошибка. Попробуйте зайти позже");
    }
}

// Мы должны использовать нашу пользовательскую функцию для обработки ошибок.
set_error_handler('nettuts_error_handler');

// Trigger an error... (var doesn't exist)
echo $somevarthatdoesnotexist;

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

Удаляем HTML-теги добавленные Microsoft Word

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

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

function cleanHTML($html) {
    $html = ereg_replace("<(/)?(font|span|del|ins)[^>]*>","",$html);
    $html = ereg_replace("<([^>]*)(class|lang|style|size|face)=("[^"]*"|'[^']*'|[^>]+)([^>]*)>","<\1>",$html);
    $html = ereg_replace("<([^>]*)(class|lang|style|size|face)=("[^"]*"|'[^']*'|[^>]+)([^>]*)>","<\1>",$html);
    return $html
}

Источник: https://tim.mackey.ie/CommentView,guid,2ece42de-a334-4fd0-8f94-53c6602d5718.aspx

Автоматическое добавление водяных знаков на изображение

Если вы выкладываете ваши собственные изображения на веб-сайтах, то есть вероятность, что вы не захотите видеть их везде в интернете на следующий день. Для предотвращения кражи изображений необходимо заявить о себе как создателе изображений, и добавление водяных знаков на них, как правило, хорошая идея. Эта функция позволяет автоматически добавлять водяные знаки на ваши изображения.

function watermarkImage ($SourceFile, $WaterMarkText, $DestinationFile) {
    list($width, $height) = getimagesize($SourceFile);
    $image_p = imagecreatetruecolor($width, $height);
    $image = imagecreatefromjpeg($SourceFile);
    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width, $height);
    $black = imagecolorallocate($image_p, 0, 0, 0);
    $font = 'arial.ttf';
    $font_size = 10;
    imagettftext($image_p, $font_size, 0, 10, 20, $black, $font, $WaterMarkText);
    if ($DestinationFile<>'') {
        imagejpeg ($image_p, $DestinationFile, 100);
    } else {
        header('Content-Type: image/jpeg');
        imagejpeg($image_p, null, 100);
    }
    imagedestroy($image);
    imagedestroy($image_p);
}

/******** использование **********/
$SourceFile = '/home/user/www/images/image1.jpg';
$DestinationFile = '/home/user/www/images/image1-watermark.jpg';
$WaterMarkText = 'Ваш копирайт';
watermarkImage ($SourceFile, $WaterMarkText, $DestinationFile);

Источник: https://www.phpjabbers.com/put-watermark-on-images-using-php-php20.html

Автоматическое добавление ссылки для email-адресов

Следующий код ищет адреса электронной почты в строке, и заменяет их на ссылку mailto. Довольно полезно на приватных приложений, но из-за спамеров я не рекомендую использовать это на сайте, в блоге или на форуме.

$stringa = "This should format my email address <span id="cloakdb1348ee3bd7f41b78f7c17140d8bf22">Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.</span><script type='text/javascript'>
document.getElementById('cloakdb1348ee3bd7f41b78f7c17140d8bf22').innerHTML = '';
var prefix = '&#109;a' + 'i&#108;' + '&#116;o';
var path = 'hr' + 'ef' + '=';
var addydb1348ee3bd7f41b78f7c17140d8bf22 = '&#101;x&#97;mpl&#101;' + '&#64;';
addydb1348ee3bd7f41b78f7c17140d8bf22 = addydb1348ee3bd7f41b78f7c17140d8bf22 + 'd&#111;m&#97;&#105;n' + '&#46;' + 'c&#111;m';
var addy_textdb1348ee3bd7f41b78f7c17140d8bf22 = '&#101;x&#97;mpl&#101;' + '&#64;' + 'd&#111;m&#97;&#105;n' + '&#46;' + 'c&#111;m';document.getElementById('cloakdb1348ee3bd7f41b78f7c17140d8bf22').innerHTML += '<a ' + path + '\'' + prefix + ':' + addydb1348ee3bd7f41b78f7c17140d8bf22 + '\'>'+addy_textdb1348ee3bd7f41b78f7c17140d8bf22+'<\/a>';
</script>";

$pattern = "/([a-z0-9][_a-z0-9.-]+@([0-9a-z][_0-9a-z-]+\.)+[a-z]{2,6})/i";
$replace = "\\1";
$text = preg_replace($pattern, $replace, $stringa);
echo htmlspecialchars($text);

Источник: https://css-tricks.com/snippets/php/automatic-mailto-links/

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