14 заметок с тегом
PHP РСС
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();
2 комментария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."&r=".$rating."&d=".urlencode($defImg);
}
?>где:- $email — электронный ящик автора.
- $size — размер аватара в пикселях.
- $rating — рейтинг аватара. Может быть:
- g — подходит для отображения на всех веб-сайтах с любой аудиторией.
- pg — может содержать грубые жесты, провокационно одетых людей, нецензурные выражения или легкое насилие.
- r — может содержать такие вещи, как суровую ненормативную лексику, тяжелое насилие, обнаженную натуру или наркотики.
- x — может содержать грубые сексуальные образы или крайне тяжелое насилие.
- $defImg — картинка, которая будет показана если у автора нет граватара. Могут быть следующие варианты: mm, identicon, monsterid, wavatar, retro или любая ваша картинка. Аватары, которые я перечислил, выглядят следующим образом, соответственно:
И, да, у каждого автора генерируются свои аватарки в том же стиле, что и в каждом из вариантов.
Выводим на экран
echo "<img src='".getGravatarUrl('тут_емайл_автора', 40, 'g', 'mm')."' alt=''>";19 января 2011, 19:59
Скрипт создания сокращенных ссылок, используя сервис bit.ly
Для одного моего проекта, о котором я официально расскажу чуть позже, понадобилась возможность сокращать ссылки при помощи специального сервиса Bit.ly. В данной заметке я приведу PHP-код, который поможет разобраться в работе сервиса и который вы сможете смело использовать на своих сайтах.
Для начала вам нужно зарегистрироваться на сайте и получить API Key.
Далее пишем PHP-код:
В коде нужно заменить maxsof на ваш логин в сервисе, а xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx на API Key.
В принципе, мне хватило и этого кода, но для полного понимания работы сарвиса можно почитать их API.
Для начала вам нужно зарегистрироваться на сайте и получить 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.
8 октября 2010, 21:00
Продолжительность жизни сайта
Апдейт от 3 января 2012: Крайним годом считается дата последней публикации материала на сайт. Поэтому, если ваш сайт давно не обновляется — не используйте PHP-код, приведенный ниже.
——
Почти всегда в подвале сайта, прямо рядом с копирайтом, можно встретить дату существования этого интернет ресурса. К сожелению, чаще всего эта дата отстает от настоящей на год, а то и на больше лет. Это вводит в заблуждение, иногда даже бесит. Невольно начинаешь думать: «А поддерживается ли этот сайт по сей день или же он просто доживает свои оставшиеся на хостинге деньги?».
Так вот, чтобы идти в ногу со временем и не дезориентировать пользователей, предлагаю ставить совсем не сложный PHP-код, состоящий всего из двух строчек, который сам автоматически каждый год будет выставлять продолжительность жизни сайта:
——
Почти всегда в подвале сайта, прямо рядом с копирайтом, можно встретить дату существования этого интернет ресурса. К сожелению, чаще всего эта дата отстает от настоящей на год, а то и на больше лет. Это вводит в заблуждение, иногда даже бесит. Невольно начинаешь думать: «А поддерживается ли этот сайт по сей день или же он просто доживает свои оставшиеся на хостинге деньги?».
Так вот, чтобы идти в ногу со временем и не дезориентировать пользователей, предлагаю ставить совсем не сложный PHP-код, состоящий всего из двух строчек, который сам автоматически каждый год будет выставлять продолжительность жизни сайта:
// Год рождения сайта
$date_birthday = 2009;
// Вывод на экран продолжительности жизни сайта
echo (date('Y') == $date_birthday ? $date_birthday : $date_birthday."–".date('Y'));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;
}
?>1 сентября 2010, 15:10
Кодирование электронного ящика
Нежелательная электронная почта (так называемая «спам») является неотъемлемой частью жизни каждого человека, если он когда-либо опубликовывал свой адрес в сети Интернет. Как для администраторов сайтов, так и для обычных пользователей, спам — постоянная проблема.

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

Если вы хотите указать свой адрес электронной почты на странице и не хотите, чтобы он был собран спам-ботом, то лучшее, что вы можете сделать, это закодировать свой электроящик так, чтобы браузер мог его распознать, а спам-бот нет. Следующий код поможет реализовать это у вас на сайте:
<?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.
30 августа 2010, 16:11
Удаление лишних пробелов и переводов строк
Сегодня я расскажу о том, как избавиться от лишних пробелов и переводов строк с помощью регулярных выражений PHP.
Вообще, регулярные выражения очень хорошая вещь! С их помощью можно создавать достаточно сложные конструкции. Новичкам рекомендую почитать об этом на php.su.
Теперь о том, как избавиться от ненужных символов.
В природе существуют такие пользователи, которые могут случайно написать что-нибудь ненужное или специально напортачить и сделать, например, 100500 переводов строк, зажав кнопку Enter. Ну, встречались с такими, да?! :-)
Итак, если таковые завелись у вас на сайте, то пишем следующий код для удаления лишних пробелов:
Чтобы преобразовать все тройные (или больше) переводы строк на двойные, а двойные и одинарные оставить без изменения, нужно сделать так:
Ну, вот, как-то так. Удачи и ведите себя хорошо ;-)
Вообще, регулярные выражения очень хорошая вещь! С их помощью можно создавать достаточно сложные конструкции. Новичкам рекомендую почитать об этом на php.su.
Теперь о том, как избавиться от ненужных символов.
В природе существуют такие пользователи, которые могут случайно написать что-нибудь ненужное или специально напортачить и сделать, например, 100500 переводов строк, зажав кнопку Enter. Ну, встречались с такими, да?! :-)
Итак, если таковые завелись у вас на сайте, то пишем следующий код для удаления лишних пробелов:
// Строка с лишними пробелами
$text = " maxso f . r u ";
// Удаляем лишние пробелы
$text = preg_replace("/[ ]+/i", "", $text);
/* В итоге получаем: maxsof.ru */Такое преобразование подойдет для строк в которых вообще не должны содержаться пробелы, таких как адрес сайта, логин, пароль, эл. ящик и тп. В остальных случаях можно воспользоваться функциями PHP:- trim() — удаляет пробелы из начала и конца строки.
- ltrim() — удаляет пробелы из начала строки.
- rtrim() — удаляет пробелы из конца строки.
// Текст с кучей лишних переводов строки
$text = "У лукоморья дуб зелёный;
Златая цепь на дубе том:
И днём и ночью кот учёный
Всё ходит по цепи кругом;
Идёт направо - песнь заводит,
Налево - сказку говорит.
Там чудеса: там леший бродит,
Русалка на ветвях сидит;";
// Удаляем двойные (тройные и тд.) переводы строк
$text = preg_replace("/(\r\n)+/i", "\r\n", $text);
/* В итоге получаем:
У лукоморья дуб зелёный;
Златая цепь на дубе том:
И днём и ночью кот учёный
Всё ходит по цепи кругом;
Идёт направо - песнь заводит,
Налево - сказку говорит.
Там чудеса: там леший бродит,
Русалка на ветвях сидит; */Чтобы преобразовать все тройные (или больше) переводы строк на двойные, а двойные и одинарные оставить без изменения, нужно сделать так:
$text = preg_replace("/(\r\n)+(\r\n)/i", "\r\n\r\n", $text);Ну, вот, как-то так. Удачи и ведите себя хорошо ;-)
20 августа 2010, 12:21
Автоматическое создание кликабельных ссылок
В этой записи я расскажу как могут автоматически создаваться кликабельные ссылки, например, если пользователь вставляет их на вашем сайте в комментариях, на форуме или где-то еще.
Итак, вот этот небольшой кусок PHP-кода поможет автоматически определить, где находится ссылка в каком-либо текстовом сообщении и сделает эту ссылку кликабельной:
Итак, вот этот небольшой кусок PHP-кода поможет автоматически определить, где находится ссылка в каком-либо текстовом сообщении и сделает эту ссылку кликабельной:
<?php
// Функция настройки длинны создаваемой ссылки
function trimlink($text, $length)
{
$dec = array("&", "\"", "'", "\\", '\"', "\'", "<", ">");
$enc = array("&", """, "'", "\", """, "'", "<", ">");
$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;
?>26 мая 2010, 12:40
21 комментариев. Пишем по-русски
Часто на сайтах мы сталкиваемся с информацией о количестве комментариев или просмотров. Но не всегда эта строка выглядит грамматически правильной. Так давайте же научимся русскому языку, тем более, что это совсем не сложно и реализуется всего несколькими строками:
Тем самым пользователь увидит не «21 комментариев», а «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 комментарий», что, согласитесь, приятней читать.
18 мая 2010, 12:00
Карта сайта Sitemap.xml
Каждому крупному сайту нужна карта сайта для пользователей, чтобы лучше ориентироваться, а так же для поискового робота, который индексирует ваш сайт, собственно, чтобы правильно индексировал.
А вот здесь я хотел написать о протоколе sitemap, о его структуре и используемых тегах, но понял, что лучше чем написано на официальном сайте я навряд ли смогу, а лишний копипаст ни к чему. Небольшие трудности у меня возникли только с созданием карты сайта для динамических страниц. Пришлось немного повозиться, но решение не заставило себя долго ждать.
Ниже приведен немного уменьшенный файл карты сайта моего блога — sitemap.php:
А вот здесь я хотел написать о протоколе sitemap, о его структуре и используемых тегах, но понял, что лучше чем написано на официальном сайте я навряд ли смогу, а лишний копипаст ни к чему. Небольшие трудности у меня возникли только с созданием карты сайта для динамических страниц. Пришлось немного повозиться, но решение не заставило себя долго ждать.
Ниже приведен немного уменьшенный файл карты сайта моего блога — sitemap.php:
<?php
// Подключаем конфигурационный файл
require_once "maincore.php";
header("Content-Type: text/xml; charset=UTF-8");
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
// 1 уровень
echo "<url>
<loc>http://maxsof.ru/</loc>
<priority>1.0</priority>
</url>";
// 2 уровень
$result = mysql_query("SELECT `menu_url` FROM `menu` ORDER BY `menu_number`");
while ($data = mysql_fetch_array($result)) {
echo "<url>
<loc>http://maxsof.ru/".$data['menu_url'].".php</loc>
<priority>0.5</priority>
</url>";
}
$result2 = mysql_query("SELECT `category_id`, `category_name_en` FROM `category` ORDER BY `category_number`");
while ($data2 = mysql_fetch_array($result2)) {
echo "<url>
<loc>http://maxsof.ru/entry.php?cat=".$data2['category_name_en']."_".$data2['category_id']."</loc>
<priority>0.5</priority>
</url>";
}
echo '</urlset>';
?>