Archive for Вересень 2009

Підрахунок користувачів на сайті через сесію

Цікава функція виловлена на просторах тенет. Підрахунок користувачів онлайн базується на підрахунку сесійних файлів створених для них (звичайно, це спрацює тільки у випадку, якщо ви зберігаєте дані сесії на сервері, а не, скажімо, в базі даних ).


<?php
 session_start();
function getUsersOnline() {
 $count = 0;
$handle = opendir(session_save_path());
 if ($handle == false) return -1;
while (($file = readdir($handle)) != false) {
 if (ereg("^sess", $file)) $count++;
 }
 closedir($handle);

return $count;
 }
 ?>

Коментарів немає

Регулярні вирази – практикум використання

Якщо у вас проблема і вирішили справитись з нею за допомогою регулярних виразів, то у вас уже дві проблеми

Шкода, але я не знаю, хто автор цієї чудової і, головне, правдивої фрази. В будь-якому випадку, сподіваюсь, що приведена нижче інформація хоча б трохи полегшить подорож читача у світі незбагненних regular expressions
Квантифікатори

Позначення Число повторів
* Ноль або більше
+ Одно або більше
? Ноль або один раз
{n} Точно n відповідностей
{n,} n або більше відповідностей
{n,m} Мінімум n та максимум m відповідностей

Набори символів

Метасимвол Замінює Значення
\d [0-9] Цифра
\D [^0-9] Не цифра
\w [A-Za-zА-Яа-я0-9_] Символи, які “створюють слово”  (букви, цифри и символ підкреслення)
\W [^A-Za-zА-Яа-я0-9_] Символи, які  не “створюють слово”

Позиція в рядку

Представление Позиция
^ Початок рядку
$ Кінець рядку
\b Закінчення слова
\B “Не закінчення” слова

\ екрануючий символ
^ показує початок даних; в середині символьного класу являє собою заберечення
$ показує кінець даних; в середині символьного класу являє собою крапку
. відповідає будь-якому символу
[ початок опису символьного класу
] кінець опису символьного класу
| умовний вибір
( початок підмаски
) кінець підмаски

Щоб знайти певний набір символів використовується синтакиси (abc). Щоб знайти вираз, який НЕ МІСТИТЬ цей набір символів, треба писати (?!abc). Це називається negative lookahed. Але чомусь не працює для кількох груп наборів символів.

Для відпрацювання регулярних виразів можна використовувати програмку Regex Coach
Основна інфа:
http://ru2.php.net/manual/ru/regexp.reference.php
http://phpclub.ru/detail/article/regexp_1

Тепер можна детальніше зупинитись у використанні regular expressions в PHP, JS та файлах .htaccess Read the rest of this entry »

Коментарів немає

PHP-кодеру на пам’ять

Дебагінг без зайвих труднощів

Для дебагінгу РНР-програмісти в незалежності від власної кваліфікації часто використовують конструкції echo, var_dump(), print_r і навіть комбінацію echo ‘<pre>’;print_r($obj);echo ‘</pre>’;
Ясно, що в цьому випадку вся потрібна інформація виводиться прямо в браузер. У випадку, якщо потрібні дані будуть містити HTML-теги, браузер їх одразу інтерпретує, і програміст майже нічого не побачить. Наприклад, наступний код не виведе в браузері абсолютно нічого:

<?
$tablelist='<input name=csv_dbtable type=hidden value=123>';
echo $tablelist; //Виведе <input name=csv_dbtable type=hidden value=123> і браузер це не покаже
?>

В такому випадку доцільно застосовувати спеціальну РНР функцію – htmlentities. Вона замінює всі теги на спеціальні символи і забезпечує потрібний вигляд інформації, що виводиться

<?
$tablelist='<input name=csv_dbtable type=hidden value=123>';
echo  htmlentities($tablelist); //Виведе <input name='csv_dbtable' type=hidden value=> через спецсимволи, а браузер це нормально покаже
?>

Генерація картинок в РНР

В PHP можлива робота з графічними файлами через використання бібліотек GD або ImageMagick. Одним із цікавих прикладів такої “співпраці” може бути … генерація картинки з самого php-файлу. Достатньо відправити правильний заголовок браузеру. Наприклад такий (генеруємо png-файл з файлу png_resize.php):

<?
header("Content-type: image/png");
//далі йде код по створенню файла
?>

Потім залишається викликати цей файл:

<img id=text_player_box src=some_folder/png_resize.php?parametrs=some_parametrs>

Редирект сторінок в РНР

При використанні редиректів варто не забувати примусово завершувати виконання скрипта.

<?
header("Location: www.google.com");
exit;
?>

Інакше потім довго доведеться шукати джерело помилки. По ідеї, це очевидно, але все-таки озвучу ще раз: header лише формує заголовки, які будуть відіслані браузеру, автоматичне завершення виконання скрипта НЕ ВХОДИТЬ в її обов’язки.

Витягнути дробову частину числа на РНР

Можна так:

$t=$t-floor($t);

або так:

$t=substr($t,2,2);

Дехто навіть умудряється використовувати explode()

Повідомлення про помилки в коді

Зрозуміло, що на “бойовому” сервері помилки на очі користувачам виводити не варто. На томість під час розробки без цього – ніяк.
Зручно в конфігураційному файлі створити константу, якій присвоювати значення (показувати чи не показувати помилки) в залежності від того, де виконується код:

<?php
if($_SERVER['REMOTE_ADDR']!='127.0.0.1'){
	//інші налаштування....
	define('SHOW_ALL_ERRORS', 0);
} else {
	//інші налаштування....
	define('SHOW_ALL_ERRORS', 1);

}
?>

А потім в коді орієнтуватись на цю константу:

if (SHOW_ALL_ERRORS == 2) {
			error_reporting(E_ALL|E_STRICT);//Report all errors plus E_STRICT errors
			ini_set('display_errors', 1);
		}
		if (SHOW_ALL_ERRORS == 1) {
			error_reporting(E_ALL ^ E_NOTICE);//Report all errors except E_NOTICE; Also could be E_ALL &amp;amp; ~E_NOTICE
			ini_set('display_errors', 1);
		}
		if (SHOW_ALL_ERRORS == 0) {
			ini_set('display_errors', 0);
		}

1 Коментар

Java Script і далекі мрії про спокійну веб-розробку

Що може так підняти настрій в похмурий день як  написання коду на  Java Script? Напевно, тільки пошук помилок в Java Script :)  Зовсім не заздрю тим веб-розробникам, робота яких тісно пов’язана з цією веб-технологією. З іншої сторони, безумовно, вся справа в професійності та знаннях.  Якщо ти добре розбираєшся в конкретній технології, то робота з нею справді може приносити задоволення…

Як не важко здогадатись, JS  не входить в перелік моїх “улюбленців”, і тільки існування таких цікавих методик як Аякс і прекрасних бібліотек як jQuery змушує мене час від час використовувати цю технологію. В цьому пості подаю першу “порцію” рецептів, які в свій час мені знадобились…

Кілька способів перевірки на число в JS

Можна так:

parseInt(value) > 0

або так:

if (!isNaN(value)) 

Лапки в тексті

У функціях document.write, .innerHTML інколи треба здійснити передачу тексту з одинарними лапками, в такому випадку виникає помилка, яка до того ж ще й ніде не відображається.
В цьому випадку в тексті потрібно замінити всі одинарні лапки на їх код: &#039
Або використати старий добрий РНР:

$result_of_query=addslashes($result_of_query);

Зробити лінком якийсь об’єкт

Наскільки просто, настільки і ефективно:

<input type="button" onclick="document.location='somedocument.html'">
<div style="cursor:pointer;" onclick="document.location='somedocument.html'">Link</div>

Виринаюче вікно на JS

… відчувається запах епохи 90-х :)

function popup()
{
window.open("popup.htm",null,
"height=200,width=400,status=no,toolbar=no,menubar=no,location=no");
}

Підтвердження дії на сторінці

<a href=http://google.com onclick='if(confirm("Are you sure?")){return true;}else{return false;}'> Push</a>

Якщо користувач натисне “Ок”, то перехід на сторінку google.com відбудеться, якщо ні – подія кліку проігнорується.

Ну і порада на завершення: не варто винаходити велосипед на JS. Значно простіше підключити бібліотеку типу Prototype чи jQuery, аніж вчергове шукати в інтернеті як, скажімо, все-таки створюється те знамените виринаюче віконце на JS…

Коментарів немає

Коректна робота з кирилицею в AJAX

Мабуть, найпоширеніше питання на форумах про Аякс в Рунеті та Уанеті. Попри всі переваги Юнікоду, багато програмістів все ще використовують в своїх проектах інші кодування, наприклад cp1251. Коли справа доходить до застосування AJAX, з’являються проблеми…

Щоб дані на кирилиці, які ПОВЕРТАЮТЬСЯ скриптом відображались коректно потрібні дві умови:
а) Робота самої БД з кирилицею ведеться коректно
б) В php-файлі, який ПЕРЕДАЄ дані вставити наступні рядки:

header(’Content-Type: text/html; charset=windows-1251′);

Щоб дані на кирилиці, які ПЕРЕДАЮТЬСЯ скриптом передавались коректно(наприклад, при пошуку на сайті введене слово передається через GET) потрібно:
а) В JavaScript використовувати кодування в Юнікод:

encodeURIComponent($string)

б) А в РНР скрипті використовувати обернене кодування – з Юнікоду в 1251ср:

$_GET['SearchText']=iconv(’UTF-8′, ‘windows-1251′, $_GET['SearchText']);

Коментарів немає