10 заметок с тегом

функции РСС

15 января 2012, 13:24

Определение IP пользователя

Один из вариантов определения реального IP-адреса пользователя, который я использую и который меня не подводил:
function client_ip()
{
if(isset($_SERVER['HTTP_X_REAL_IP'])) {
return $_SERVER['HTTP_X_REAL_IP'];
} else {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
return $_SERVER['REMOTE_ADDR'];
}
}
}

Вывод на экран:
echo client_ip();
PHP   IP   функции

12 февраля 2011, 22:04

Как подключить Gravatar к себе на сайт

Чтобы комментарии на сайте выглядели не скучно к ним обычно примыкает аватар автора, но что делать если регистрации на сайте нет, а поставить аватар пользователя хочется? На этот случай существует Gravatar.
Gravatar (от англ. globally recognized avatar — глобально распознаваемый аватар) — web 2.0 сервис, позволяющий интернет-пользователям хранить свой аватар на специальном сервере. Пользователь регистрируется на центральном сервере и сохраняет там свой аватар и адрес электронной почты. Когда он оставляет комментарий на сайте или блоге, поддерживающим Gravatar, и указывает свой адрес электронной почты, на стороне сайта вычисляется MD5 хэш от почтового адреса и отправляется на сервер Gravatar, в ответ возвращается аватар пользователя. Таким образом система Gravatar позволяет использовать аватары без регистрации на сайте или блоге. Из Википедии


Пишем функцию
<?php

function getGravatarUrl($email, $size, $rating, $defImg) {
return "http://www.gravatar.com/avatar/".md5(strtolower($email))."?s=".$size."&amp;r=".$rating."&amp;d=".urlencode($defImg);
}

?>
где:
  • $email — электронный ящик автора.
  • $size — размер аватара в пикселях.
  • $rating — рейтинг аватара. Может быть:
    • g — подходит для отображения на всех веб-сайтах с любой аудиторией.
    • pg — может содержать грубые жесты, провокационно одетых людей, нецензурные выражения или легкое насилие.
    • r — может содержать такие вещи, как суровую ненормативную лексику, тяжелое насилие, обнаженную натуру или наркотики.
    • x — может содержать грубые сексуальные образы или крайне тяжелое насилие.
  • $defImg — картинка, которая будет показана если у автора нет граватара. Могут быть следующие варианты: mm, identicon, monsterid, wavatar, retro или любая ваша картинка. Аватары, которые я перечислил, выглядят следующим образом, соответственно:
http://www.gravatar.com/avatar/3dfee0a6f0ed003c03ac895be9526b2b?s=50&r=g&d=mm http://www.gravatar.com/avatar/3dfee0a6f0ed003c03ac895be9526b2b?s=50&r=g&d=identicon http://www.gravatar.com/avatar/3dfee0a6f0ed003c03ac895be9526b2b?s=50&r=g&d=monsterid http://www.gravatar.com/avatar/3dfee0a6f0ed003c03ac895be9526b2b?s=50&r=g&d=wavatar http://www.gravatar.com/avatar/3dfee0a6f0ed003c03ac895be9526b2b?s=50&r=g&d=retro

И, да, у каждого автора генерируются свои аватарки в том же стиле, что и в каждом из вариантов.


Выводим на экран
echo "<img src='".getGravatarUrl('тут_емайл_автора', 40, 'g', 'mm')."' alt=''>";
функции   gravatar   PHP

19 января 2011, 19:59

Скрипт создания сокращенных ссылок, используя сервис bit.ly

Для одного моего проекта, о котором я официально расскажу чуть позже, понадобилась возможность сокращать ссылки при помощи специального сервиса Bit.ly. В данной заметке я приведу PHP-код, который поможет разобраться в работе сервиса и который вы сможете смело использовать на своих сайтах.

Для начала вам нужно зарегистрироваться на сайте и получить API Key.

Далее пишем PHP-код:
<?php

// Функция возвращает короткий url
function get_bitly_short_url($url, $login, $appkey, $format = "txt")
{
$connectURL = "http://api.bit.ly/v3/shorten?login=".$login."&apiKey=".$appkey."&uri=".urlencode($url)."&format=".$format;
return curl_get_result($connectURL);
}

// Функция возвращает длинный url
function get_bitly_long_url($url ,$login ,$appkey ,$format = "txt")
{
$connectURL = "http://api.bit.ly/v3/expand?login=".$login."&apiKey=".$appkey."&shortUrl=".urlencode($url)."&format=".$format;
return curl_get_result($connectURL);
}

// Функция возвращает result form url
function curl_get_result($url)
{
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}

// Пример работы функции короткой url ссылки
$short_url = get_bitly_short_url("http://maxsof.ru/", "maxsof", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

// Пример работы функции длинной url ссылки
$long_url = get_bitly_long_url($short_url, "maxsof", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

?>

В коде нужно заменить maxsof на ваш логин в сервисе, а xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx на API Key.

В принципе, мне хватило и этого кода, но для полного понимания работы сарвиса можно почитать их API.
функции   ссылки   сервисы   PHP

29 сентября 2010, 19:39

Если на хостинге не работает функция iconv()

Недавно работал над сайтом и заметил, что на хостинге не работает функция iconv() (php выдавал: Call to undefined function: iconv()), а мне очень нужно было конвертнуть текст из UTF-8 в windows-1251. Пришлось погуглить инет и вот какой я нашел выход:
<?php

function utf8_to_win($string)
{
for ($c = 0; $c < strlen($string); $c++) {
$i = ord($string[$c]);
if ($i <= 127) @$out .= $string[$c];
if (@$byte2) {
$new_c2 = ($c1&3) * 64 + ($i&63);
$new_c1 = ($c1>>2)&5;
$new_i = $new_c1 * 256 + $new_c2;
if ($new_i == 1025) {
$out_i = 168;
} else {
if ($new_i == 1105) {
$out_i = 184;
} else {
$out_i = $new_i - 848;
}
}
@$out .= chr($out_i);
$byte2 = false;
}
if (($i>>5) == 6) {
$c1 = $i;
$byte2 = true;
}
}
return $out;
}

?>
PHP   кодировка   функции

1 сентября 2010, 15:10

Кодирование электронного ящика

Нежелательная электронная почта (так называемая «спам») является неотъемлемой частью жизни каждого человека, если он когда-либо опубликовывал свой адрес в сети Интернет. Как для администраторов сайтов, так и для обычных пользователей, спам — постоянная проблема.

Кодирование электронного ящика

Если вы хотите указать свой адрес электронной почты на странице и не хотите, чтобы он был собран спам-ботом, то лучшее, что вы можете сделать, это закодировать свой электроящик так, чтобы браузер мог его распознать, а спам-бот нет. Следующий код поможет реализовать это у вас на сайте:
<?php

// Функция кодирования электронного ящика
function hide_email($email, $title = '', $subject = '')
{
if (strpos($email, "@")) {
$parts = explode("@", $email);
$MailLink = "<a href='mailto:".$parts[0]."@".$parts[1];
if ($subject != ) { $MailLink .= "?subject=".urlencode($subject); } $MailLink .= "'>".($title?$title:$parts[0]."@".$parts[1])."</a>"; $MailLetters = ""; for ($i = 0; $i < strlen($MailLink); $i++) { $l = substr($MailLink, $i, 1); if (strpos($MailLetters, $l) === false) { $p = rand(0, strlen($MailLetters)); $MailLetters = substr($MailLetters, 0, $p).$l.substr($MailLetters, $p, strlen($MailLetters)); } } $MailLettersEnc = str_replace("\\", "\\\\", $MailLetters); $MailLettersEnc = str_replace('\"', '\\\"', $MailLettersEnc); $MailIndexes = ""; for ($i = 0; $i < strlen($MailLink); $i ++) { $index = strpos($MailLetters, substr($MailLink, $i, 1)); $index += 48; $MailIndexes .= chr($index); } $MailIndexes = str_replace("\\", "\\\\", $MailIndexes); $MailIndexes = str_replace('\"', '\\\"', $MailIndexes); $res = "<script type='text/javascript'>"; $res .= "ML=\.str_replace("<", "xxxx", $MailLettersEnc)."\";";
$res .= "MI=\"".str_replace("<", "xxxx", $MailIndexes)."\";";
$res .= "ML=ML.replace(/xxxx/g, '<');";
$res .= "MI=MI.replace(/xxxx/g, '<');"; $res .= "OT=\"\";";
$res .= "for(j=0;j < MI.length;j++){";
$res .= "OT+=ML.charAt(MI.charCodeAt(j)-48);";
$res .= "}document.write(OT);";
$res .= "</script>";

return $res;
} else {
return $email;
}
}

// Текст, содержащий адрес ящика
$text ="Чтобы ваш отзыв появился на сайте, отправьте его на наш email: user@host.name";

// Далее находим в тексте электроящик и кодируем его
$text = preg_replace("#([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#sie", "hide_email('\\1@\\2')", $text);

// Выводим текст на экран
echo $text;

?>

Мужичек, который это все придумал, просил оставить ссылку на его сайт с интересным доменным именем — rumkin.com.

20 августа 2010, 12:21

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

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

Итак, вот этот небольшой кусок PHP-кода поможет автоматически определить, где находится ссылка в каком-либо текстовом сообщении и сделает эту ссылку кликабельной:
<?php

// Функция настройки длинны создаваемой ссылки
function trimlink($text, $length)
{
$dec = array("&", "\"", "'", "\\", '\"', "\'", "<", ">");
$enc = array("&amp;", "&quot;", "&#39;", "&#92;", "&quot;", "&#39;", "&lt;", "&gt;");
$text = str_replace($enc, $dec, $text);
if (strlen($text) > $length) $text = substr($text, 0, ($length-3))."...";
$text = str_replace($dec, $enc, $text);
return $text;
}

// Загоняем преобразуемое текстовое сообщение в переменную
$text = "Это конечно все хорошо! Но я знаю еще один хороший сайт - http://maxsof.ru, а так же советую посетить www.podelitsya.ru";

// Делаем колдовство и находим ссылки :-)
$text = preg_replace("#(^|[n ])((http|https|ftp|ftps)://[w#$%&~/.-;:=,?@[]()+]*)#sie", "'\1<a href="'.trim('\2').'" target="_blank" title="autolink">'.trimlink('\2', 20).(strlen('\2')>30?substr('\2', strlen('\2')-10, strlen('\2')):'').'</a>'", $text);
$text = preg_replace("#(^|[n ])((www|ftp).[w#$%&~/.-;:=,?@[]()+]*)#sie", "'\1<a href=http://"'.trim('\2').'" target="_blank" title="autolink">'.trimlink('\2', 20).(strlen('\1')>30?substr('\2', strlen('\2')-10, strlen('\2')):'').'</a>'", $text);

// Выводим текстовое сообщение на экран
echo $text;

?>
ссылки   PHP   функции

26 мая 2010, 12:40

21 комментариев. Пишем по-русски

Часто на сайтах мы сталкиваемся с информацией о количестве комментариев или просмотров. Но не всегда эта строка выглядит грамматически правильной. Так давайте же научимся русскому языку, тем более, что это совсем не сложно и реализуется всего несколькими строками:
<?php

function numeric($summ)
{
if ($summ != "") {
$last_numeric_symb = substr($summ, -1);
return $last_numeric_symb;
}
}

$numeric_comm = numeric($comments_summ);
echo $comments_summ." ".($numeric_comm == 1 && $comments_summ != 11 ? "комментарий" : (preg_match("/[2-4]/", $numeric_comm) && ($comments_summ < 5 || $comments_summ > 15) ? "комментария" : "комментариев"));

?>
Итак, процесс состоит в следующем: мы имеем некую целую переменную $comments_summ, в нашем случае — количество комментариев к какой-нибудь статье. Далее мы прогоняем эту переменную через функцию numeric и на выходе получаем $numeric_comm, которая содержит в себе последнюю цифру числа количества комментариев. Ну, и следующим шагом идет сравнение этого числа и вывод правильного слова «комментирий».

Тем самым пользователь увидит не «21 комментариев», а «21 комментарий», что, согласитесь, приятней читать.
решения   PHP   функции

8 мая 2010, 11:05

Кэширование картинок на PHP

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

Кеширование — накопление данных в доступном хранилище, с целью их быстрого извлечения по мере надобности. Конкретно для нашего случая — это создание картинок в заданном размере при запросе пользователя, сохранение в папке caсhe и вывод их на экран.

Создаем файл в корневой директории pic.php и вставляем в него следующий код:
<?php

function createthumbnail($filetype, $origfile, $thumbfile, $new_w, $new_h, $par)
{
if ($filetype == 1) { $origimage = imagecreatefromgif($origfile); }
elseif ($filetype == 2) { $origimage = imagecreatefromjpeg($origfile); }
elseif ($filetype == 3) { $origimage = imagecreatefrompng($origfile); }

$old_x = imagesx($origimage);
$old_y = imagesy($origimage);

if ($old_x > $new_w || $old_y > $new_h) {
if (($old_x < $old_y) && $par == "n") {
$thumb_w = round(($old_x * $new_h) / $old_y);
$thumb_h = $new_h;
} elseif (($old_x > $old_y) && $par == "n") {
$thumb_w = $new_w;
$thumb_h = round(($old_y * $new_w) / $old_x);
} elseif (($old_x < $old_y) && $par == "s") {
$thumb_w = $new_w;
$thumb_h = round(($old_y * $new_w) / $old_x);
} elseif (($old_x > $old_y) && $par == "s") {
$thumb_w = $new_w;
$thumb_h = round(($old_y * $new_w) / $old_x);
} else {
$thumb_w = $new_w;
$thumb_h = $new_h;
}
} else {
$thumb_w = $old_x;
$thumb_h = $old_y;
}

$thumbimage = imagecreatetruecolor($thumb_w,$thumb_h);
$result = imagecopyresampled($thumbimage, $origimage, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);

touch($thumbfile);

if ($filetype == 1) { imagegif($thumbimage, $thumbfile); }
elseif ($filetype == 2) { imagejpeg($thumbimage, $thumbfile); }
elseif ($filetype == 3) { imagepng($thumbimage, $thumbfile); }
}

if (isset($_GET['url']) && $_GET['url'] != "" && isset($_GET['w']) && $_GET['w'] != "" && isset($_GET['p']) && ($_GET['p'] == "n" || $_GET['p'] == "s")) {
$url = $_GET['url'];
$width = $_GET['w'];
$height = (isset($_GET['h']) ? $_GET['h'] : '500');
$par = $_GET['p'];

$pic_types = array(".gif",".jpg",".jpeg",".png");
$pic = basename($url);
$pic_name = explode(".", $pic);
$pic_ext = strtolower(strrchr($pic,"."));
if (!in_array($pic_ext, $pic_types)) {
exit();
} else {
$imagefile = getimagesize($url);
$thumb = "cache/".$pic_name[0]."_".$width.$par.$pic_ext;
if (!file_exists($thumb) || filesize($thumb) == 0) {
createthumbnail($imagefile[2], $url, $thumb, $width, $height, $par);
}
}
header("Location: ".$thumb);
}

?>
Не забываем создать папку cache так же в корневой директории.

Ну а сейчас разберемся как это все работает на конкретном примере.

Допустим у нас есть картинка kartinka.jpg лежащая в папке images. Скрипт приведенный выше может кешировать картинки в 2 разных ситуациях.

Первая ситуация заключается в том, когда нам надо уменьшить картинку только по ширине, т. е. ширина фиксируется, а высота подгоняется, сохраняя пропорции. В этом случае путь до картинки имеет вид:
<img src="pic.php?url=images/kartinka.jpg&w=100&p=s">
где url=images/kartinka.jpg — путь до оригинальной киртинки, w=100 — ширина создаваемой картинки, а p=s — показатель того, что высоту картинки нужно подогнать по пропорциям исходя из ширины.

Второй случай — это когда нужно вместить картинку в заданную область с сохранением пропорций. Тогда код имеет следующий вид:
<img src="pic.php?url=images/kartinka.jpg&w=100&h=100&p=n">
где url=images/kartinka.jpg — путь до оригинальной киртинки, w=100 — ширина создаваемой картинки, h=100 — высота создаваемой картинки, а p=n — показатель того, что картинку нужно уместить в заданную область, сохраняя пропорции.


Для чего нужно кеширование? А нужно оно, например, для того чтобы экономить место на сайте, ведь все файлы из папки cache можно удалить в любое время. Они будут созданы занова при запросе пользователя. Или, например, если вы меняете структуру или дизайн сайта и нужно чтобы превью картинок оригинального размера были не 100 пикселей в ширину а, например, 150, то для этого достаточно изменить показатель w и все будет хорошо :)


P. S. Скрипт работает на библиотеке изображений GD2.
функции   кэш   PHP

23 января 2010, 10:40

Постраничная навигация

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

Постраничный вывод контента часто становится проблемой перед начинающими PHP-программистами, так же было и у меня. Но давайте, все же, разберемся на примере что к чему.

Для начала, определимся с задачей. Допустим, у нас есть больше тысячи новостей и нам нужно выводить по 10 на каждую страницу. Новости хранятся в базе данных news со следующей структурой:
  • news_id — номер новости
  • news_title — заголовок новости
  • news_text — текст новости
В конечном итоге нам надо получить такую постраничную навигацию:

1   ...   7   8   9   10   11   12   13   ...   100

где 10 — это текущая страница.

Далее, привожу весь код с пояснениями:
<?php 

// Функция постраничной навигации
function makepagenav($start, $count, $total, $range = 0, $link = ) { if ($link == "") { $link = $PHP_SELF."?"; } $pg_cnt = ceil($total / $count); if ($pg_cnt <= 1) { return ""; } $idx_back = $start - $count; $idx_next = $start + $count; $cur_page = ceil(($start + 1) / $count); $res = "Страница ".$cur_page." из ".$pg_cnt.": "; if($idx_back >= 0) { if($cur_page > ($range + 1)) { $res .= "<a href='".$link."rowstart=0'>1</a>..."; } } $idx_fst = max($cur_page - $range, 1); $idx_lst = min($cur_page + $range, $pg_cnt); if ($range == 0) { $idx_fst = 1; $idx_lst = $pg_cnt; } for ($i = $idx_fst; $i <= $idx_lst; $i++) { $offset_page = ($i - 1) * $count; if ($i == $cur_page) { $res .= "<span><strong>".$i."</strong></span>"; } else { $res .= "<a href='".$link."rowstart=".$offset_page."'>".$i."</a>"; } } if ($idx_next < $total) { if ($cur_page < ($pg_cnt - $range)) { $res .= "...<a href='".$link."rowstart=".($pg_cnt - 1) * $count."'>".$pg_cnt."</a>"; } } return "<div>".$res."</div>"; } // Выводим новости // Здесь идет подключение к базе данных или что то еще // ... // Считаем общее количество новостей $resultrows = mysql_query("SELECT `news_id` FROM `news`"); $rows = mysql_num_rows($resultrows); // Пишем количество выводимый новостей на страницу, в нашем случае - 10 $messages_per_page = 10; // Условие: если запрос GET не существует или он не является числом, то присваеваем ему значение 0 if (!isset($_GET['rowstart']) || !preg_match("/^[0-9]+$/", $_GET['rowstart'])) { $_GET['rowstart'] = 0; } // Выводим по 10 новостей на страницу, где начальной точкой отсчета будет считаться запрос GET $result = mysql_query("SELECT * FROM `news` ORDER BY `news_id` DESC LIMIT ".$_GET['rowstart'].",".$messages_per_page.);
while ($data = mysql_fetch_assoc($result)) {
echo data['news_title']."<br />";
echo data['news_text']."";
}

// Условие: если общее количество страниц больше, чем нам надо вывести (т.е. больше 10), то выводим список страниц
if ($rows > $messages_per_page) {
echo makepagenav($_GET['rowstart'], $messages_per_page, $rows, 3, $PHP_SELF."?&amp;");
}

?>

Данный способ реализации я взял из CMS PHP-Fusion, т. к. не смог найти ничего лучше подходящего для себя. Что касается вывода ссылок-стрелок на предыдущую/последующую страницу и ссылок-стрелок в начало/конец списка, то можете попробовать дописать код сами. Я лично очень редко, почти никогда не пользуюсь такими ссылками-стрелками если они есть. Попробуйте вспомнить когда вы последний раз кликали на них :-)
PHP   PHP-Fusion   навигация   функции

20 декабря 2009, 16:13

Генератор паролей на PHP

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

Функция генерации пароля, где $number — число случайных символов:
<?php

// Параметр $number - сообщает число символов в пароле
function generate_password($number)
{
$arr = array('a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'r', 's',
't', 'u', 'v', 'x', 'y', 'z',
'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'R', 'S',
'T', 'U', 'V', 'X', 'Y', 'Z',
'1', '2', '3', '4', '5', '6',
'7', '8', '9', '0', '.', ',',
'(',')', '[',']', '!', '?',
'&', '^', '%', '@', '*', '$',
'<','>', '/', '|', '+', '-',
'{','}', '`', '~');
// Генерируем пароль
$pass = "";
for($i = 0; $i < $number; $i++) {
// Вычисляем случайный индекс массива
$index = rand(0, count($arr) - 1);
$pass .= $arr[$index];
}
return $pass;
}

?>

Далее выводим сгенерированный пароль пользователю:
echo generate_password(10);

И мы увидим, например, такой вид пароля: Jn67FcsX0g
функции   PHP