PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (2): [1] 2 »

> Найдено сообщений: 28
Goshik Отправлено: 12 Августа, 2010 - 18:52:48 • Тема: Класс для экранирования строк • Форум: Пользовательские функции

Ответов: 10
Просмотров: 1681
Ну реализация интерфейсов здесь не просто так сделана, а для того чтобы обЪект вёл себя так же как массив.
Goshik Отправлено: 30 Июля, 2010 - 12:13:01 • Тема: Класс для экранирования строк • Форум: Пользовательские функции

Ответов: 10
Просмотров: 1681
2fargred
Спасибо за найденный баг Закатив глазки . Исправил. Теперь ваш пример работает как надо.

Добавил несколько новых свистелок:


1. Класс теперь реализует интерфейс Countable. Т.е. теперь можно писать так:

PHP:
скопировать код в буфер обмена
  1.  
  2. $_GET["a"] = 100500;
  3. $_GET["b"] = 100600;
  4.  
  5. $get = new SafeData($_GET, SafeData::MYSQL);
  6.  
  7. echo count($get) // 2;
  8. echo $get->count(); // 2
  9.  




2. Добавлена константа SafeData::INT.

PHP:
скопировать код в буфер обмена
  1.  
  2. $_GET["a"] = "Z";
  3. $_GET["b"] = 2;
  4.  
  5. $get = new SafeData($_GET, SafeData::INT);
  6.  
  7. echo $get["a"]; // 0;
  8. echo $get["b"]; // 2;
  9.  




3. Теперь можно определять свою функцию для экранирования

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. function foo($arg){
  4.   return (int)$arg + 20;
  5. }
  6.  
  7. $_GET["a"] = 1;
  8. $_GET["b"] = 2;
  9.  
  10. $get = new SafeData($_GET, "foo");
  11.  
  12. echo $get["a"]; // 21;
  13. echo $get["b"]; // 22;
  14.  



Класс можно скачать в первом посте.
Goshik Отправлено: 27 Июля, 2010 - 18:37:45 • Тема: Баг в ООП? • Форум: Программирование на PHP

Ответов: 13
Просмотров: 1058
>Мелкий скорей всего так и есть ,т.к константу нельзя переписать
Авотфиг. Если написать в конструкторе класса БЭ echo self::C, то тогда выведется 100600, т.е. константа переопределяется. Также напоминаю что со статическими полями та же фигня.

Добавлено:

Есть подозрение, что косяк вот в чём:
self - это константа, которая заменяется на имя класса в котором обЪявлен метод (в нашем случае это A).
$this - это переменная в которой хранится ссылка на создаваемый обЪект. В нашем случае обЪект БЭ.

Вот если бы к константам можно было к константам через зыс обращаться...
Goshik Отправлено: 27 Июля, 2010 - 17:48:53 • Тема: Баг в ООП? • Форум: Программирование на PHP

Ответов: 13
Просмотров: 1058
2unded
Ты меня неправильно понял. Я хочу добиться эффекта прототивоположного тому что ты предлагаешь.

2Arch-Web На сколько я знаю при наследовании, в классе наследнике создаются свои методы. И они нифига не должны вызываться из класа родителя. Для этого есть ключевое слово parent.

Приведу ещё один пример:

PHP:
скопировать код в буфер обмена
  1.  
  2. class A{
  3.  
  4.   protected $C = 100500;
  5.        
  6.   function C(){return $this->C;}
  7.                
  8. }
  9.  
  10.        
  11.        
  12. class B extends A{
  13.        
  14.   protected $C = 100600;
  15.                
  16.   function __construct(){echo $this->C();}
  17.        
  18. }
  19.  
  20.  
  21. new B();
  22.  



Здесь всё ОК, выводится 100600 как и следовало ожидать. Почему эта фича не работает с константами и статическими полями, йух его знает. Возможно дело в разнице "->" и "::". Или просто я туплю?
Goshik Отправлено: 27 Июля, 2010 - 16:54:26 • Тема: Баг в ООП? • Форум: Программирование на PHP

Ответов: 13
Просмотров: 1058
Да, но вызывается метод ЦЭ() из контекста класса БЭ, поэтому по идее должён возвращать переопределённую константу ЦЭ.
Goshik Отправлено: 27 Июля, 2010 - 16:45:15 • Тема: Баг в ООП? • Форум: Программирование на PHP

Ответов: 13
Просмотров: 1058
Имеем код:


PHP:
скопировать код в буфер обмена
  1. class A{
  2.  
  3.   const C = 100500;
  4.                
  5.   function C(){return self::C;}
  6.                
  7. }
  8.  
  9.        
  10.        
  11. class B extends A{
  12.        
  13.   const C = 100600;
  14.                
  15.   function __construct(){echo self::C();}
  16.        
  17. }
  18.  
  19.        
  20. new B();


Вопрос: Какого выводится 100500, а не 100600?
Goshik Отправлено: 01 Июня, 2010 - 13:39:46 • Тема: Класс для экранирования строк • Форум: Пользовательские функции

Ответов: 10
Просмотров: 1681
>Хотя если второе в большинстве случаев предполагается true, то правильно оставить как есть.
ТруЪ нужно использовать для массивов которые могут затрагивать магические кавычки. Тоесть посты, геты, куки. Они, по моему, чаще нуждаются в экранировании.

> И всё равно я не пойму, зачем класс (а не функция с 3 параметрами), зачем ему массив, а не отдельная строка.

Функция будет экранировать весь массив. А благодоря использованию класса можно сделать экранирование только используемых элементов. А если делать экранирование отдельных строк, то так писать менее удобно:

PHP:
скопировать код в буфер обмена
  1.  
  2. $a = escape($_POST["a"], HTML);
  3. $b = escape($_POST["b"], HTML);
  4. $c = escape($_POST["c"], HTML);
  5.  


Проще один раз создать обЪект, который будет хранить в себе способ экранирования массива:

PHP:
скопировать код в буфер обмена
  1.  
  2. $post = new SafeData($_POST, SafeData::HTML);
  3.  
  4. $a = $post["a"];
  5. $b = $post["b"];
  6. $c = $post["c"];
  7.  
Goshik Отправлено: 29 Мая, 2010 - 19:07:20 • Тема: Класс для экранирования строк • Форум: Пользовательские функции

Ответов: 10
Просмотров: 1681
>экранирование происходит только при обращении к конкретному элементу. Остальные остаются нетронутыми.
И в правду глупость написал. Я хотел сказать, что оригинальный массив не затрагивается.

>А как определяется какой элемент массива должен быть обработан под MySql, какой для HTML - я так и не понял.
Очень просто:
PHP:
скопировать код в буфер обмена
  1.  
  2. $post4mysql = new SafeData($_POST, SafeData::MYSQL);
  3. $post4html = new SafeData($_POST, SafeData::HTML);
  4.  


Если надо применить сразу два типа экранирования можно так написать:

PHP:
скопировать код в буфер обмена
  1.  
  2. $str = new SafeData(new SafeData($_POST, SafeData::MYSQL), SafeData::HTML);
  3.  
Goshik Отправлено: 29 Мая, 2010 - 17:12:30 • Тема: Класс для экранирования строк • Форум: Пользовательские функции

Ответов: 10
Просмотров: 1681
>А как же использование данных для командой строки?
Пока такой необходимости не возникало. Допишу.

>А если у меня там большое количество элементов, которые не полагается экранировать - работа в пустую?
Неа. Я же писал что экранирование происходит только при обращении к конкретному элементу. Остальные остаются нетронутыми.

>А если часть данных массива мне надо подготовить для безопасной работы с БД, а часть - для вывода в браузер?
Создаём два обЪекта с разными режимами экранирования и не паримся. Т.к. входной массив не копируется, то памяти это сожрёт не много, какой-бы большой не был массив.

> А работа с различными кодировками?
Не подумал. Самые распространённые цп1251 и утф8. Пожалуй тут не используются функции, которые некорректно с ними работают. Или я ошибаюсь?

> можно использовать один с массивами в качестве параметров
Да, согласен. Переделаю.

>Выпиливать ли магические кавычки - я всё равно должен определить сам? Пусть тогда уж класс это за меня делает.
Не, класс какраз это сам делает. Но иногда нужно принудительно отключить это выпиливание. В комментах к классу есть пример.
Goshik Отправлено: 29 Мая, 2010 - 15:23:05 • Тема: Класс для экранирования строк • Форум: Пользовательские функции

Ответов: 10
Просмотров: 1681
Представляю вашему вниманию самопальный класс для экранирования строк от небезопасных символов. По моему очень неудобно каждый раз при выводе данных в браузер писать длинное htmlspecialchars, а при сохранении данных в БД использовать mysql_real_escape_string. Да ещё эти ваши магические кавычки проверять надо, чтобы не получить двойного экранирования. Все эти траблы решаются при использовании класса SafeData.

У класса есть 3 режима экранирования:
SafeData::NONE - Без экранирования. Пригодится если нужно выпилить магические кавычки
SafeData::MYSQL - Для сохранения инфы в БД. Использует самописный аналог mysql_real_escape_string, ибо стандартная функция требует подключение к БД, а это не всегда возможно.
SafeData::HTML - Заменяет опасные для HTML символы соответствующими сущностями

Конструктор выглядит так:
SafeData($экранируемыйМассив, $типЭкранирования = SafeData::NONE, $выпиливать-лиМагическиеКавычки = true);

$экранируемыйМассив - любой массив или обЪект SafeData (для примеения нескольких типов экрнирования к одному массиву). Можно даже многомерный.
$типЭкранирования - см. типы чуть выше
$выпиливать-лиМагическиеКавычки - принудительно отключает вырезку магических кавычек (см. описание в комментах к классу)

Собсно пример:


PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. $_POST["a"] = "' OR '1' = '1";
  4. $_POST["b"] = "\" '";
  5. $_POST["c"] = array("'", "'");
  6.  
  7. $post = new SafeData($_POST, SafeData::MYSQL);
  8. $a = $post["a"]; // a = \' OR \'1\
  9. $b = $post["b"]; // b = \" \'
  10. $c = $post["c"]; // c[0] = c[1] = \'
  11.  
  12. foreach($post as $p) echo $p;
  13.  
  14.  


Благодаря тому что класс реализует интерфейсы Iterator и ArrayAccess, с его обЪектом можно работать как с обычным массивом, т.е. юзать оператор foreach и скобки [].

Главное то, что оригинальный массив остаётся неизменным при экранирвании (однако, если в примере выше написать $post["a"] = "1234", то $_POST всё-таки изменится). Также можно без проблем засунуть в конструктор массив имеющий 100500 элементов, т.к. класс не копирует массив, а лишь хранит ссылку на него, а экранирование идёт только во время доступа к элементу.

Жду пендалей Радость
Goshik Отправлено: 15 Декабря, 2009 - 15:34:41 • Тема: Вопрос по поводу скачивания и передачи файлов • Форум: Программирование на PHP

Ответов: 0
Просмотров: 143
Приветствую, товарищи программеры!

Тут такое дело. Есть здоровый файл на удалённом сервере. Есть мой хост. Есть юзер. Нужно отдать юзеру файл, не показывая его реальное местоположение. Вроде бы всё просто... Но! Файл большой, а скорость у юзера низкая (возможно). Если будем делать так: while(...) echo fgets(...);, тогда засрётся (или нет??) оч. много памяти, т.к. цикл пройдёт относительно быстро, а пользователь ещё не успеет зохавать весь файл.
Внимание вопрос: как можно реализовать постепенное скачивание и отдачу файла? sleep() - не вариант.

Заранее благодарен! По пиву!
Goshik Отправлено: 06 Августа, 2009 - 16:57:47 • Тема: Нужна функция • Форум: Программирование на PHP

Ответов: 12
Просмотров: 510
Можно на страницу жабаскрипт сунуть. Пусть он, к примеру, каждые 10 сек пхп скрипту отправляет юзерский ид. Если в назначеное врямя инфа не придёт, значит либо юзеро свалил с твоего сайта, либо он закрыл браузер следовательно можно очищать тхт-файл юзера с этим ид-ом.
Goshik Отправлено: 06 Августа, 2009 - 16:22:01 • Тема: Выбрать только цифры из строки, средствами MySQL • Форум: SQL и Архитектура БД

Ответов: 4
Просмотров: 200
Плиз, не баньте за даблпост Закатив глазки .
Просто тема ушла, а решенья так и нету.... Как же всё-таки выбрать цифры из строки?
Goshik Отправлено: 03 Августа, 2009 - 11:20:58 • Тема: Выбрать только цифры из строки, средствами MySQL • Форум: SQL и Архитектура БД

Ответов: 4
Просмотров: 200
Дак в том и дело что никак на пхп - надо только MySQL юзать. Просто $tel мне тоже заранее неизвестен. Влт запрос:

CODE (text):
скопировать код в буфер обмена
  1. SELECT table.*, table.phone as ph  FROM table WHERE (SELECT COUNT(*) FROM table WHERE [b]phone[/b] = [b]ph[/b]) = 1


Вот из ph и phone какраз и нужно цифры вытащить. С ПхП тут придётся кучу доп. запросов делать, а это - гемор.

З.Ы. Нашёл на каком-то форуме:

Цитата:
По-моему, тему пора в FAQ. Решение для 10-ки
CODE (text):
скопировать код в буфер обмена
  1. SELECT regexp_replace('32#56*32+00abc;', '[^[:digit:]]') FROM dual


Чё за десятка? У мну не пашет Растерялся
В 5.0.45 рег.выр нету что-ль?
Goshik Отправлено: 02 Августа, 2009 - 21:11:36 • Тема: Смены оформления на сайте с помощью куки • Форум: Программирование на PHP

Ответов: 2
Просмотров: 253
Хы, а кто ж кукисы ставит, после вывода текста? Подмигивание


Надо так:

PHP:
скопировать код в буфер обмена
  1. <?PHP  
  2. $skin = $_POST['skin'];
  3. setcookie("skin", $skin, time()+86400);
  4. global $skin;
  5. ?>
  6.  
  7. <form style="float:right" action="index.php">
  8.   <select name="skin" id="skin" >
  9.     <option value="blue">Светлый</option>
  10.     <option value="black">Темный</option>
  11.   </select>
  12.   <input type="submit" name="submit" id="submit" value="Сменить" />
  13. </form>

Страниц (2): [1] 2 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB