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();
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=''>";

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.

8 октября 2010, 21:00

Продолжительность жизни сайта

Апдейт от 3 января 2012: Крайним годом считается дата последней публикации материала на сайт. Поэтому, если ваш сайт давно не обновляется — не используйте PHP-код, приведенный ниже.
——

Почти всегда в подвале сайта, прямо рядом с копирайтом, можно встретить дату существования этого интернет ресурса. К сожелению, чаще всего эта дата отстает от настоящей на год, а то и на больше лет. Это вводит в заблуждение, иногда даже бесит. Невольно начинаешь думать: «А поддерживается ли этот сайт по сей день или же он просто доживает свои оставшиеся на хостинге деньги?».

Так вот, чтобы идти в ногу со временем и не дезориентировать пользователей, предлагаю ставить совсем не сложный PHP-код, состоящий всего из двух строчек, который сам автоматически каждый год будет выставлять продолжительность жизни сайта:
// Год рождения сайта
$date_birthday = 2009;

// Вывод на экран продолжительности жизни сайта
echo (date('Y') == $date_birthday ? $date_birthday : $date_birthday."&ndash;".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

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

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

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

Если вы хотите указать свой адрес электронной почты на странице и не хотите, чтобы он был собран спам-ботом, то лучшее, что вы можете сделать, это закодировать свой электроящик так, чтобы браузер мог его распознать, а спам-бот нет. Следующий код поможет реализовать это у вас на сайте:
<?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. Ну, встречались с такими, да?! :-)

Итак, если таковые завелись у вас на сайте, то пишем следующий код для удаления лишних пробелов:
// Строка с лишними пробелами
$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

// Функция настройки длинны создаваемой ссылки
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;

?>

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 комментарий», что, согласитесь, приятней читать.

18 мая 2010, 12:00

Карта сайта Sitemap.xml

Каждому крупному сайту нужна карта сайта для пользователей, чтобы лучше ориентироваться, а так же для поискового робота, который индексирует ваш сайт, собственно, чтобы правильно индексировал.

А вот здесь я хотел написать о протоколе 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>';

?>
Ctrl +  Ранее