понедельник, 13 декабря 2010 г.

Лучшая функция xml2array php

Код - пример #1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function xml2array(&$string) {
    $parser = xml_parser_create();
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parse_into_struct($parser, $string, $vals, $index);
    xml_parser_free($parser);
    $mnary=array();
    $ary=&$mnary;
    foreach ($vals as $r) {
        $t=$r['tag'];
        if ($r['type']=='open') {
            if (isset($ary[$t])) {
                if (isset($ary[$t][0])) $ary[$t][]=array(); else $ary[$t]=array($ary[$t], array());
                $cv=&$ary[$t][count($ary[$t])-1];
            } else $cv=&$ary[$t];
            if (isset($r['attributes'])) {foreach ($r['attributes'] as $k=>$v) $cv['_a'][$k]=$v;}
            $cv['_c']=array();
            $cv['_c']['_p']=&$ary;
            $ary=&$cv['_c'];
        } elseif ($r['type']=='complete') {
            if (isset($ary[$t])) { // same as open
                if (isset($ary[$t][0])) $ary[$t][]=array(); else $ary[$t]=array($ary[$t], array());
                $cv=&$ary[$t][count($ary[$t])-1];
            } else $cv=&$ary[$t];
            if (isset($r['attributes'])) {foreach ($r['attributes'] as $k=>$v) $cv['_a'][$k]=$v;}
            
            if (isset($r['value'])) $cv['_v'] = $r['value'];
        } elseif ($r['type']=='close') {
            $ary=&$ary['_p'];
        }
    }    
    
    _del_p($mnary);
    return $mnary;
}
function _del_p(&$ary) {
    foreach ($ary as $k=>$v) {
        if ($k==='_p') unset($ary[$k]);
        elseif (is_array($ary[$k])) _del_p($ary[$k]);
    }
}
Скопипастил с себе подобного блога

Функция закрытия незакрытых тегов в HTML

Код - пример #1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
 * close all open xhtml tags at the end of the string
 *
 * @param string $html
 * @return string
 * @author Milian Wolff <mail@milianw.de>
 */
 
function closetags($html) {
    #put all opened tags into an array
    preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
    $openedtags = $result[1];
    
    #put all closed tags into an array
    preg_match_all('#</([a-z]+)>#iU', $html, $result);
    $closedtags = $result[1];
    $len_opened = count($openedtags);
    
    # all tags are closed
    if (count($closedtags) == $len_opened) {
        return $html;
    }
    $openedtags = array_reverse($openedtags);
    
    # close tags
    for ($i=0; $i < $len_opened; $i++) {
        if (!in_array($openedtags[$i], $closedtags)){
            $html .= '</'.$openedtags[$i].'>';
        } else {
            unset($closedtags[array_search($openedtags[$i], $closedtags)]);
        }
    }
    return $html;
}

imTimer профайлер для PHP

Когда то он находился на блоге imbolc, которого уже давно нет. Вот поэтому blogspot рулит. Думаю блоги эти будут жить пока есть Google :)
Код - пример #1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function imTimer($name= 'default', $mode= ''){
    static $timers= array();
    $now=microtime(true);
    if(!isset($timers[$name])){
        $timers[$name]= $now;
        return 0;
    }
    $ret= $now - $timers[$name];
    if($mode == 'reset')
        $timers[$name]= $now;
    return round($ret, 5);
}

// пример использования

// запускаем
imTimer();

... // здесь типа много кода

imTimer('temp');

function temp() {
... // кучка говнокода
}
// выводим время выполнения функции temp
echo imTimer('temp');

... // еще код

// выводим время выполнения всего скрипта
echo imTimer();

Notice, Warning логирование ошибок PHP

Как-же отключить эти варнинги, нотисы, чтоб работа скрипта php не ломала дизайн сайта и при этом, сохраняя возможность, давать разработчику отзывы. Это просто, хотя многие не знают как. Если у вас свой сервер, настройте php.ini по примеру моих настроек:
Код - пример #1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
; Показывать все ошибки, включая нотисы, варнинги
error_reporting = E_ALL | E_STRICT

; Не показывать ошибки
display_errors = Off

; Отключить вывод ошибок при старте выполнения php, ошибки при выполнении на клиенте.
display_startup_errors = Off

; Записывать ошибки в логи
log_errors = On

; размер файла ошибок
log_errors_max_len = 1024

; Не записывать повторяющиеся ошибки
ignore_repeated_errors = On

; Это повторные ошибки, которые впрочем можно и включить, теперь они нам не страшны (Off)
ignore_repeated_source = On

; Логгировать утечки памяти
report_memleaks = On

; Трассировка ошибок (дебагинг). Это больше полезно разработчикам php систем вроде cms
track_errors = Off

; Формат вывода ошибок в виде html. Нам ссылки не нужны, мы пишем в текстовый файл
html_errors = Off

; Путь к файлу ошибок.
error_log =  "\apache\logs\php_error.log"
.htaccess если у вас хостинг и нет доступа к php.ini

В php скрипте включить выключить можно так:
Код - пример #1
1
2
ini_set("display_errors", "0");
error_reporting(E_ALL);

четверг, 9 декабря 2010 г.

Авторизация PHP

Код - пример #1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// если пользователь не авторизован
if (!isset($_SESSION['user_id'])) {
    // то проверяем его куки
    // вдруг там есть логин и пароль к нашему скрипту
 
    if (isset($_COOKIE['login']) && isset($_COOKIE['password'])) {
        // если же такие имеются
        // то пробуем авторизовать пользователя по этим логину и паролю
        $login = mysql_real_escape_string($_COOKIE['login']);
        $password = mysql_real_escape_string($_COOKIE['password']);
 
        // и по аналогии с авторизацией через форму:
 
        // делаем запрос к БД
        // и ищем юзера с таким логином и паролем
 
        $query = "SELECT `id`
                FROM `users`
                WHERE `login`='{$login}' AND `password`='{$password}'
                LIMIT 1";
        $sql = mysql_query($query) or die(mysql_error());
 
        // если такой пользователь нашелся
        if (mysql_num_rows($sql) == 1) {
            // то мы ставим об этом метку в сессии (допустим мы будем ставить ID пользователя)
 
            $row = mysql_fetch_assoc($sql);
            $_SESSION['user_id'] = $row['id'];
 
            // не забываем, что для работы с сессионными данными,
            // у нас в каждом скрипте должно присутствовать session_start();
        }
        else {
            // только мы не будем давай ссылку на форму авторизации
            // вдруг человек и не хочет был авторизованым
            // а пришел просто поглядеть на наши страницы как гость
        }
    }
}

jQuery - как получить value radio элемента

Код - пример #1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// ========= 1 вариант ==========
Cтрана: <br />
<input type="radio" name="country" value="Russia" checked="checked">Россия <br />
<input type="radio" name="country" value="Other">Другая

...

var the_value = $(":radio[name=country]").filter(":checked");

// ========= 2 вариант ==========
<form id="radio_form">
  <fieldset>
    <label><input type="radio" name="color" value="red" checked="checked" />Red</label><br />
    <label><input type="radio" name="color" value="yellow" />Yellow</label><br />    
    <label><input type="radio" name="color" value="blue" />Blue</label><br />
    <label><input type="radio" name="color" value="purple" />Purple</label><br />
  </fieldset>
</form>

...

var the_value = $('#radio_form input:radio:checked').val();

среда, 8 декабря 2010 г.

Как удалить денвер

Как деинсталлировать Денвер?
Комплекс полностью автономен и останется таковым. Поэтому для легальной деинсталляции Денвера достаточно просто удалить директорию, в которую вы его установили (По умолчанию –C:\WebServers ). При желании можете также стереть ярлыки с Рабочего стола и из Автозагрузки (если забудете, система сама об этом напомнит при следующей загрузке).

Если вы перед удалением Денвера не завершили его работу корректно (перезагрузившись или ярлыком остановки), то, вероятно, Вам придется вручную «почистить» файлС:\WINDOWS\system32\drivers\etc\hosts (в Windows NT/2000/XP/2003) или C:\WINDOWS\hosts (в WIndows 9x или Me), чтобы адреса [Не проверен] и test2.ru перестали вести на локальную машину, а «смотрели» в Интернет.

Таким образом, для деинсталляции Денвера достаточен следующий порядок действий:
1. Остановите Денвер 2. Если виртуальный диск создаётся по умолчанию, в Start -> Run нужно выполнить следующую команду (если необходимо, замените Z на Вашу букву виртуального диска): subst Z: /D 3. Удалите папку инсталляции Денвера (по умолчанию C:\WebServers) 4. Удалите, если необходимо, ярлык из Автозагрузки 5. Удалите ярлыки Запуска/Останова Комплекса