RFpro.ru: Программирование на PHP

  Все выпуски  

RusFAQ.ru: Программирование на PHP


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / PHP

Выпуск № 236
от 25.01.2006, 06:51

Администратор:Калашников О.А.
В рассылке:Подписчиков: 218, Экспертов: 35
В номере:Вопросов: 4, Ответов: 13


Вопрос № 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, а потом идет закачка.
Спасибо.
Отправлен: 19.01.2006, 12:16
Вопрос задал: Hakimov Rahmatjon Inomovich (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: 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
Здравствуйте, Hakimov Rahmatjon Inomovich!
Делаем такую ссылку:
<a href="count.php" target="_blank">

Файл count.php:

<?php
// вставь код увеличения счетчика

// переадресация пользователя:
header("location: file.zip")

?>
---------
Не всё то Windows, что висит!
Ответ отправил: 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'])

) {
_logd('FakeSessionCatch',kernel, serialize($_SESSION));
SessInit();
}
$_SESSION['sess.used']=time();
}

/*********************************************************
* Сохраняет изменения сессии и закрывает ее
*********************************************************/
function SessSave() {
session_write_close();
}

/*********************************************************
* Уничтожает сессию
*********************************************************/
function SessStop() {
$_SESSION=array();
session_destroy();
}

/*********************************************************
* Получает переменную из сессии
*********************************************************/
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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

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

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.phpplus
Архив рассылки
Отписаться Вебом Почтой
Вспомнить пароль

В избранное