Archive for the ‘PHP’ Category
При использовании модуля пагинации (pagination) в kohana 3.2 столкнулся с неприятным нюансом:
модуль не формировал правильные ссылки.
Имея роут прописанный в bootstrap.php вида:
1 2 3 4 5 6 7 8 | Route::set('catalog', 'catalog(/(/ )(/ .html))') ->defaults(array( 'directory' => 'index', 'action' => 'index', 'controller' => 'catalog', )); |
где <page> используется для постраничной навигации, я получал все ссылки с одинаковым путем:
http://site/catalog/category/n
где n - номер страницы, который не выводился
Проблема оказалась в модуле https://github.com/kohana/pagination входившем ранее в ядро kohanы, он прекрасно работает до версии 3.1., но в kohana 3.2 он не работает.
Для версии 3.2 необходимо использовать модуль пагинации находящийся по ссылке:
https://github.com/kloopko/kohana-pagination
Скрипт приведен с учетом изменения строки запроса Google в сентябре 2011.
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | <?php //Google PR START function StrToNum($Str, $Check, $Magic) { $Int32Unit = 4294967296; $length = strlen($Str); for ($i = 0; $i < $length; $i++) { $Check *= $Magic; if ($Check >= $Int32Unit) { $Check = ($Check - $Int32Unit * (int) ($Check / $Int32Unit)); $Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check; } $Check += ord($Str{$i}); } return $Check; } function HashURL($String) { $Check1 = StrToNum($String, 0x1505, 0x21); $Check2 = StrToNum($String, 0, 0x1003F); $Check1 >>= 2; $Check1 = (($Check1 >> 4) & 0x3FFFFC0 ) | ($Check1 & 0x3F); $Check1 = (($Check1 >> 4) & 0x3FFC00 ) | ($Check1 & 0x3FF); $Check1 = (($Check1 >> 4) & 0x3C000 ) | ($Check1 & 0x3FFF); $T1 = (((($Check1 & 0x3C0) << 4) | ($Check1 & 0x3C)) <<2 ) | ($Check2 & 0xF0F ); $T2 = (((($Check1 & 0xFFFFC000) << 4) | ($Check1 & 0x3C00)) << 0xA) | ($Check2 & 0xF0F0000 ); return ($T1 | $T2); } function CheckHash($Hashnum) { $CheckByte = 0; $Flag = 0; $HashStr = sprintf('%u', $Hashnum) ; $length = strlen($HashStr); for ($i = $length - 1; $i >= 0; $i --) { $Re = $HashStr{$i}; if (1 === ($Flag % 2)) { $Re += $Re; $Re = (int)($Re / 10) + ($Re % 10); } $CheckByte += $Re; $Flag ++; } $CheckByte %= 10; if (0 !== $CheckByte) { $CheckByte = 10 - $CheckByte; if (1 === ($Flag % 2) ) { if (1 === ($CheckByte % 2)) { $CheckByte += 9; } $CheckByte >>= 1; } } return '7'.$CheckByte.$HashStr; } function getpagerank($url) { $fp = fsockopen("toolbarqueries.google.com", 80, $errno, $errstr, 30); if (!$fp) {} else { $out = "GET /tbr?features=Rank&sourceid=navclient-ff&client=navclient-auto-ff&ch=" . CheckHash(HashURL($url)) . "&q=info:" . $url . " HTTP/1.1\r\n"; $out .= "Host: toolbarqueries.google.com\r\n"; $out .= "User-Agent: Mozilla/4.0 (compatible; GoogleToolbar 2.0.114-big; Windows XP 5.1)\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { $data = fgets($fp, 128); $pos = strpos($data, "Rank_"); if($pos === false){} else { $pagerank = substr($data, $pos + 9); } } fclose($fp); } return $pagerank; } ?> <? //Yandex TIC START function getTIC($url) { $str=file('http://bar-navig.yandex.ru/u?ver=2&show=32&url='.$url); if ($str==false) { $ans=false; } else { $is_find=preg_match("/value=\"(.\d*)\"/", join("",$str), $tic); if ($is_find<1) { $ans=0; } else { $ans=$tic[1]; } } return $ans; } ?> |
Инклюдите в свой код этот скрипт и вызываете:
<?php $url = 'http://site.com'; getpagerank($url); ?>
Код проверен - 100% полностью рабочий!
Столкнулся с тем, что на некоторых хостингах не работает роутинг у kohana. Я использую Kohana 3.2 с включенным .htaccess и отключенным index.php в url.
На главную страницу попадаем без проблем, а вот при попытке перейти по внутренним ссылкам выдает следующую ошибку:
No input file specified .
При этом все роутинги прописаны правильно. На локальном хостинге все работает корректно.
Поиск в сети дает различные варианты, ниже приведен тот, которым я решил эту проблему.
Пишем в .htaccess
RewriteRule .* index.php/$0 [PT,L]
меняем на
RewriteRule .* index.php?kohana_uri=$0 [PT,L,QSA]
Перед тем как добавить открытую загрузку файлов на сайт необходимо продумать какие типы файлов мы разрешаем загружать. Например, только изображения с раширениями - .jpg, .png,
Или, если список типов файлов не ограничивается, к примеру, только картинками или видеофайлами нужно запретить загружать файлы с расширением, которые могут нести потенциальную опасность.
Пример:
<?php /* Создаем паттерн, где есть список запрещенных файлов по расширению */ $blacklist = '/.(com|bat|exe|cmd|vbs|msi|jar|php(\d?)|phtml|access|js)$/i'; /* Если файл содержит запрещенное разрешение - выход с уведомлением*/ if (preg_match($pattern, $_FILES['file']['name'])) { exit ("Файл с данным расширением запрещен к загрузке"); } $uploaddir = 'uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "Файл загружен.\n"; } else { echo "Файл не загружен.\n"; } ?>
Далее, если все-таки необходимо загружать файлы php, то можно, как вариант - менять их раширение на .txt
<?php // Обработчик формы загрузки if(!empty($_FILES['filename']['tmp_name'])) { // Извлекаем расширение $ext = strtolower(strrchr($_FILES['filename']['name'], ".")); // Запрещенные форматы $extentions = array(".phtml", ".php", ".html", ".htm", ".pl", ".xml", ".inc"); // Проверка расширения по // списоку запрещенных файлов if(in_array($ext, $extentions)) { $pos = strrpos($_FILES['filename']['name'], "."); $path = substr($_FILES['filename']['name'], 0, $pos).".txt"; } else { $path = $_FILES['filename']['name']; } // Сохраняем файл в текущем каталоге if(copy($_FILES['filename']['tmp_name'], $path)) { echo "Файл успешно загружен - <a href=$path>$path</a>"; } } ?>
Также можно при помощи .htaccess папки, в которую загружаются файлы переопределить обработчик исполняемых файлов php, perl воспринимать их как текстовые:
RemoveHandler .php .phtml .pl
AddType text/plain .php .phtml .pl
Еще можно в папке прописать запрет на исполнение скриптов:
Options -ExecCGI
AddHandler cgi-script .pl .py .php .jsp. htm .shtml .sh .asp .cgi
Иногда нужно вывести текст не полностью, а - только заданной длинны.
Например, нужно вывести первые 200 символов текста без разрыва слов.
Решение такое:
$n = strpos ($text.' ', ' ', 200)-1; $text = substr ($text1, 0, (strlen($n) < 200 ? 200 : $n));
или так:
if (strlen($text)>200) { $text = substr ($text, 0,strpos ($text, " ", 200)); echo $text; } else echo $text;
strlen($str) - возвращает количество символов в строке $str.
strpos($str, $what) - возвращает позицию подстроки $what в строке $str или false, если подстрока не найдена.