Вопрос № 33593: Имеется текст: "текст текст СЛОВО текст СЛОВО2 текст". Задача найти в тексте слова, которые прописаны большими буквами и заменить в них все буквы на маленькие, кроме первой. В данном случае слова "СЛОВО" и "СЛОВО2" должн...Вопрос № 33600: Здравствуйте!
В сайте имеется zip-файл для закачки. Как поставить счетчик на скачивание? То есть если кто-нибудь щелкает по ссылке, сперва увеличивается на 1 число в файле total.txt, а потом идет закачка.
Спасибо....Вопрос № 33606: 1. Как соединиться с POP3/SMTP сервером для получения/отправки писем?
2. Можно ли быстро вставить в таблицу MySQL большое количество записей (около 20000)? Пример в цикле:
for ($i=0;$i<20000;$i++)
{
mysql_query("INSERT INTO msgs ...Вопрос № 33622: Продолжая делать гостевую хочу спросить. Как оследить что при нажатии ссылки виду <a href=..... ></a>, что она пришла от скрипта расположенного на хосте а не с какого нить компа? Я хочу быть уверенным что переход был с моей странице, что ...
Вопрос № 33.593
Имеется текст: "текст текст СЛОВО текст СЛОВО2 текст". Задача найти в тексте слова, которые прописаны большими буквами и заменить в них все буквы на маленькие, кроме первой. В данном случае слова "СЛОВО" и "СЛОВО2" должны быть заменены "Слово" и "Слово2". Как это реализовать и насколько эта операция ресурсоемкая? Заранее благодарю за ответы.
Отправлен: 19.01.2006, 10:45
Вопрос задал: Rusland (статус: Специалист)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Straight
Здравствуйте, Rusland!
Код в приложении. Только убедитесь, что установлена русская локаль, а то регексп русских букв не найдет.
Приложение:
Ответ отправил: Straight (статус: 5-ый класс)
Отправлен: 19.01.2006, 11:00 Оценка за ответ: 5
Отвечает: Whisper
Здравствуйте, Rusland!
поиск по регулярному выраженю и разбить в массив, тоесть тебе надо найти все слова удоблетворяющие условию "пробел+[А-Я]+пробел" - потом применяешь к нему необходимые преобразования
необходимы функции вот
strtolower -- Преобразует строку в нижний регистр
strtoupper -- Преобразует строку в верхний регистр
ucfirst -- Преобразует первый символ строки в верхний регистр
preg_match_all - это для поиска по шаблону (регулярные выражения)
шаблон /s+([А-Я]+)s+/ для поиска
--------- все тленно
Ответ отправила: Whisper (статус: 4-ый класс)
Отправлен: 19.01.2006, 11:43 Оценка за ответ: 5
Отвечает: Stamm
Здравствуйте, Rusland!
Почему то, забыли о функции ucwords, которая переводит в верхний регистр первые символы строки, но сначала нужно все символы сделать маленькими:
$s="текст текст СЛОВО текст СЛОВО2 текст";
$s=ucwords(strtolower($s));
print $s;
--------- В день - один, ну два подвига, не больше...
Ответ отправил: Stamm (статус: Студент)
Отправлен: 19.01.2006, 15:35 Оценка за ответ: 3 Комментарий оценки: Это не то что мне нужно.
Отвечает: Klesman
Здравствуйте, Rusland!
Говоря о локале, Straight вероятно имеет ввиду, что в начале всех скриптов использующих регулярные выражения и функции преобразования регистра, вам надо вписать такую строчку:
setlocale(LC_ALL,"ru_RU.CP1251");
Более точно, значение второй константы узнайте у хостера.
Плюс к этому, возможно придётся подправить корневой файлик .htaccess, в который надо вписать следующее:
CharsetDisable on
CharsetSourceEnc windows-1251
Эти строки принудительно установят именно на вашем виртуальном сервере кодировку windows-1251 для всех документов в директории с файликом и всех нижележащих (если в них, конечно, не встретится, другой . htaccess с другими настройками). Это делается в случае надобности кодировки, отличной от установленной хостером по умолчанию, или в случае возникновения проблем с автоматической перекодировкой на лету. Подробности также узнайте у хостера.
Удачи.
Ответ отправил: Klesman (статус: 2-ой класс)
Отправлен: 19.01.2006, 15:36 Оценка за ответ: 4
Вопрос № 33.600
Здравствуйте!
В сайте имеется zip-файл для закачки. Как поставить счетчик на скачивание? То есть если кто-нибудь щелкает по ссылке, сперва увеличивается на 1 число в файле total.txt, а потом идет закачка.
Спасибо.
Отвечает: Straight
Здравствуйте, Hakimov Rahmatjon Inomovich!
Здесь есть некстолько вариантов.
1. Сделайте ссылку не на сам zip, а на скрипт-счетчик. Скрипт увеличивает цифру, а потом делает header("location: ...zip")
2. С помощью mod_rewrite пернаправьте запрос этого зипа на некий скрипт, который сначала увеличит счетчик, а потом прочитает файл и выдаст его на стандартный вывод (не забудьте сначала выдать Content-Type).
Как считать цифру - тоже сами решайте. Можно в хранить в БД, можно в файле.
Ответ отправил: Straight (статус: 5-ый класс)
Отправлен: 19.01.2006, 12:27 Оценка за ответ: 4
Отвечает: Дмитрий Иванов
Здравствуйте, Hakimov Rahmatjon Inomovich!
есть несколько вариантов:
вызов скрипта который изменяет счетчик и дальше
1. передает location на zip и Apache выдает его сама - плох так как могут узнать прямой линк на файл
header('Location: $zip_file');
exit;
2. пишет header и сам кидает файл юзеру(не везде будет работать если есть ограничение на время работы скрипта, а файл большой)
header('Content-type: application/x-octet-stream');
header('Content-disposition: attachment; filename=' . $zip_file);
readfile('zip_file_path.zip');
exit;
--------- ставя оценку - подумай, может ты не все описал.
Ответ отправил: Дмитрий Иванов (статус: Студент)
Отправлен: 19.01.2006, 13:04
Отвечает: XMF
Здравствуйте, Hakimov Rahmatjon Inomovich!
--
Да, все верно.
Лучше использывать БД- меньше проблем.
1. <A href="download.php?id=1">CLick here</a>
2. download.php:
---
<?
if(!isset($id)) exit;
$id=intval($id);
if($id==0) exit;
/*
mysql_connect & select db
*/
mysql_query("update table set countdownload=countdownload+1 where progid='$id'");
$a=mysql_query("select * from table where progid='$id'");
$d=mysql_fetch_assoc($a);
Header("Location:{$d["path2file"]}");
exit;
?>
---
Table:
path2file - поле для полного адреса проги...
countdownload - количество скачиваний.
------------------------------------------------------
Если что не так - извини.
Ответ отправил: XMF (статус: 3-ий класс)
Отправлен: 19.01.2006, 14:58
Ответ отправил: Schmak (статус: Практикант)
Отправлен: 20.01.2006, 05:57
Вопрос № 33.606
1. Как соединиться с POP3/SMTP сервером для получения/отправки писем?
2. Можно ли быстро вставить в таблицу MySQL большое количество записей (около 20000)? Пример в цикле:
for ($i=0;$i<20000;$i++)
{
mysql_query("INSERT INTO msgs (id, msg) VALUES ($i, 'message text')");
}
Цикл работает слишком долго и сильно грузит сервер. Можно сделать то же самое быстрее?
Отправлен: 19.01.2006, 13:52
Вопрос задал: Schmak (статус: Практикант)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Straight
Здравствуйте, Schmak!
1. Первое, что приходит в голову - через сокеты. Протоколы не слишком сложные. Да уже народ писал такие вещи. Вот тут например:
http://phpclasses.segmenta.ru/browse/file/3.html
2. Попробуйте записать инсерты в файл и загрузить этот файл в MySQL через конвейер консольной командой:
cat dump.sql | mysql
Ответ отправил: Straight (статус: 5-ый класс)
Отправлен: 19.01.2006, 14:11
Вопрос № 33.622
Продолжая делать гостевую хочу спросить. Как оследить что при нажатии ссылки виду <a href=..... ></a>, что она пришла от скрипта расположенного на хосте а не с какого нить компа? Я хочу быть уверенным что переход был с моей странице, что лежит на хосте, а не с другого компа. Кстати так же хотелось бы знать как отследить include, include_once. Что именно грузиться с хоста а не с компа другого. Благодарю.
Отправлен: 19.01.2006, 18:29
Вопрос задал: Diego (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Дмитрий Иванов
Здравствуйте, Diego!
на счет include - проверяй перед использованием на реальное существование файла и отсутствия специальных последовательностей символов как ':/'
$_SERVER['HTTP_REFERER'] - содержит URL вызвавшей страницы
но желательно ставить еще и session для надежности хоть какой-то ;)
--------- ставя оценку - подумай, может ты не все описал.
Ответ отправил: Дмитрий Иванов (статус: Студент)
Отправлен: 19.01.2006, 18:52
Отвечает: n/a
Доброго здоровья, Diego!
1. На сто процентов гарантировать ничего нельзя.
Возможно будет эффективной проверка реферера и... сесиии:
-*------------------
Скрипт, *выводящий* форму открывает сессию и вносит в нее некий флаг, мол форма будет отображаться:
SessStart();
SessSet('someflag', 'someparameter');
-----------------
Скрипт *читающий* данные формы проверяет сессию:
SessStart();
$temp = SessGet('someflag');
if ($temp == 'someparameter') {
/****** минимальная проверка пройдена ********/
}
ниже - используемые функции
------------------------------------------
<?
/* PROTO
SessInit() // cleanup
SessStart()
SessSave()
SessStop()
SessGet($VarName)
SessSet($VarName, $value)
SessUnset($VarName)
*/
/*********************************************************
* Очищает сессию и устанавливает данные
* для проверки подлинности
*********************************************************/
function SessInit() {
$_SESSION=array();
$_SESSION['sess.used']=time();
$_SESSION['sess.HTTP_ACCEPT']=$_SERVER['HTTP_ACCEPT'];
$_SESSION['sess.HTTP_ACCEPT_ENCODING']=$_SERVER['HTTP_ACCEPT_ENCODING'];
$_SESSION['sess.HTTP_ACCEPT_LANGUAGE']=$_SERVER['HTTP_ACCEPT_LANGUAGE'];
$_SESSION['sess.SERVER_PROTOCOL']=$_SERVER['SERVER_PROTOCOL'];
$_SESSION['sess.REMOTE_ADDR']=$_SERVER['REMOTE_ADDR'];
$_SESSION['sess.HTTP_USER_AGENT']=$_SERVER['HTTP_USER_AGENT'];
$_SESSION['sess.HTTP_HOST']=$_SERVER['HTTP_HOST'];
$_SESSION['sess.HTTP_ACCEPT_CHARSET']=$_SERVER['HTTP_ACCEPT_CHARSET'];
$_SESSION['sess.DOCUMENT_ROOT'] = $_SERVER['DOCUMENT_ROOT'];
} /* function Sess*/
/*********************************************************
* Стартует или восстанавливает сессию
*********************************************************/
function SessStart() {
if (!isset($_SESSION['sess.used'])) SessInit();
if (($_SERVER['REQUEST_METHOD'] != 'GET') and ($_SERVER['REQUEST_METHOD'] != 'POST')){
SessInit();
}
if (
($_SESSION['sess.used']> time())
or ($_SESSION['sess.HTTP_ACCEPT']!=$_SERVER['HTTP_ACCEPT'])
or ($_SESSION['sess.HTTP_ACCEPT_ENCODING']!=$_SERVER['HTTP_ACCEPT_ENCODING'])
or ($_SESSION['sess.HTTP_ACCEPT_CHARSET']!=$_SERVER['HTTP_ACCEPT_CHARSET'])
or ($_SESSION['sess.HTTP_ACCEPT_LANGUAGE']!=$_SERVER['HTTP_ACCEPT_LANGUAGE'])
or ($_SESSION['sess.SERVER_PROTOCOL']!=$_SERVER['SERVER_PROTOCOL'])
or ($_SESSION['sess.REMOTE_ADDR']!=$_SERVER['REMOTE_ADDR'])
or ($_SESSION['sess.HTTP_USER_AGENT']!=$_SERVER['HTTP_USER_AGENT'])
or ($_SESSION['sess.HTTP_HOST']!=$_SERVER['HTTP_HOST'])
or ($_SESSION['sess.DOCUMENT_ROOT']!=$_SERVER['DOCUMENT_ROOT'])
/*********************************************************
* Сохраняет изменения сессии и закрывает ее
*********************************************************/
function SessSave() {
session_write_close();
}
/*********************************************************
* Получает переменную из сессии
*********************************************************/
function SessGet($name) {
if (isset($_SESSION[$name]))
return $_SESSION[$name];
return NULL;
}
/*********************************************************
* Устанавливает переменную сессии
*********************************************************/
function SessSet($name, $value) {
$_SESSION[$name]=$value;
}
/*********************************************************
* Удаляет переменную сессии
*********************************************************/
function SessUnset($name) {
if (isset($_SESSION[$name]))
unset($_SESSION[$name]);
}
?>
-------------------------------------------------------
2. Вопрос не очень-то корректно поставлен. В чем проблема при работе с include?
php-inj - тогда в первую очередь - качественная проверка входных параметров.
Ниже идет пример, который разрешает вкладывать (include) файлы, только если переменная является строкой состоящей из латинских букв и цифр.
к началу строки подставляется указанный вручную относительный путь, в конце - указанное вручную расширение.
Кстати, не забывайте про существование require(), во многих случаях использование данной функции безопаснее, нежели include, т.к. появляется возможность отследить неудачные атаки.
define ('root', '/home/www/');
define ('incEXT', 'php');
if (pregmach('/[a-zA-Z0-9]$',$filename) {
include root.$filename.incEXT
}
Ответ отправил: n/a (статус: 2-ой класс)
Отправлен: 19.01.2006, 22:26 Оценка за ответ: 5
Отвечает: XMF
Здравствуйте, Diego!
--
Есть такое: $HTTP_REFERER - будет возвращена строка /УРЛ/ откуда пришли.. НО! Все это защитит от неопытного хацкера... ведь есть спец. программы, которые подделывают даже Referer ;)
Ответ отправил: XMF (статус: 3-ий класс)
Отправлен: 19.01.2006, 23:46
Отвечает: Straight
Здравствуйте, Diego!
Абсолютно наджного способа не существует, иначе не делали бы защиту через распознавание образов ("введите цифры, которые видите на картинке"). Так что если Вам нужно защитить скрипт, в который идут данные через POST, то тоже советую воспользоваться этим способом.
Ответ отправил: Straight (статус: 5-ый класс)
Отправлен: 20.01.2006, 09:10