Существенное преимущество в бОльшей простоте и бОльшей безопасности. Насколько я знаю, эта общая проблема драйверов БД в PHP. Вместо того, что-бы использовать биндинг, который есть во всех БД, используется обработка параметров для подстановки их прямо в SQL запрос. Честно говоря, удивлен что в phpbb этот костыль тоже активно используется.В чем существенное преимущество и почему не использовать обычные запросы?
Расширения - это просто!
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB3.1.x/3.3.x | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
).
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB3.1.x/3.3.x | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
-
UncleAndy
- phpBB 1.4.1
- Сообщения: 44
- Стаж: 10 лет 10 месяцев
- Благодарил (а): 7 раз
Re: Расширения - это просто!
-
rxu
- phpBB Guru

- Сообщения: 17082
- Стаж: 19 лет 7 месяцев
- Откуда: Красноярск
- Благодарил (а): 567 раз
- Поблагодарили: 1752 раза
Re: Расширения - это просто!
С первым соглашусь, со вторым - не обязательно.UncleAndy писал(а):Существенное преимущество в бОльшей простоте и бОльшей безопасности.
Не думаю, что проблема в драйверах PHP, скорее, просто не реализовано на абстрактном уровне драйвера БД в phpBB.
-
UncleAndy
- phpBB 1.4.1
- Сообщения: 44
- Стаж: 10 лет 10 месяцев
- Благодарил (а): 7 раз
Re: Расширения - это просто!
Я лично экспериментировал с SQL Injection и убедился на практике что передача данных через биндинг параметры исключает их возможность. По крайней мере, у меня ни разу не получилось сделать ее через такие параметры. В отличии от подстановки.С первым соглашусь, со вторым - не обязательно.
Относительно приведенной ссылки - здесь как раз биндинга нет, а есть подстановка. Вернее, это просто не очень удачный способ автоматизации. Однако, надо учитывать что имена параметров почти никогда не передаются снаружи напрямую. Это надо быть сверхнекомпетентным что-бы сделать возможность такой инъекции.
Добавлено спустя 42 минуты 24 секунды:
Вопрос по правильной организации кода.
Мне нужно сделать класс, который будет заниматься определенными операциями (криптография). Где его располагать "по фэншую"? У меня есть два варианта - в хэлперах или в отдельной папке /libs.
-
rxu
- phpBB Guru

- Сообщения: 17082
- Стаж: 19 лет 7 месяцев
- Откуда: Красноярск
- Благодарил (а): 567 раз
- Поблагодарили: 1752 раза
Re: Расширения - это просто!
Опять зависит от потребностей.
В принципе, в хелперах обычно располагаем набор универсальных методов, не более. Если будет солидный объект, например, интерфейс, его имплементация, и наследующие классы, то лучше в отдельной папке. libs слишком общее имя, я бы выбрал что-то вроде core/crypt например.
В принципе, в хелперах обычно располагаем набор универсальных методов, не более. Если будет солидный объект, например, интерфейс, его имплементация, и наследующие классы, то лучше в отдельной папке. libs слишком общее имя, я бы выбрал что-то вроде core/crypt например.
-
UncleAndy
- phpBB 1.4.1
- Сообщения: 44
- Стаж: 10 лет 10 месяцев
- Благодарил (а): 7 раз
Re: Расширения - это просто!
По большому счету, вроде-бы все получается. Сейчас единственная загвоздка с хранением времени в БД. Сделал вот такую миграцию:
При этом поля created_at и signed_at создались в базе с типом integer. С этим можно что-то сделать (что-бы в базе создавались поля типа TIMESTAMP)?
Код: Выделить всё
$this->table_prefix . 'login_signs' => array(
'COLUMNS' => array(
'id' => array('VCHAR:64', ''),
'code' => array('VCHAR:32', ''),
'sign' => array('TEXT', ''),
'public_key' => array('TEXT', ''),
'public_key_id' => array('VCHAR:64', ''),
'created_at' => array('TIMESTAMP', null),
'signed_at' => array('TIMESTAMP', null),
),
'PRIMARY_KEY' => 'id',
-
xisp
- phpBB 3.0.0 RC7
- Сообщения: 1798
- Стаж: 13 лет 6 месяцев
- Благодарил (а): 97 раз
- Поблагодарили: 91 раз
- Забанен: Бессрочно
Re: Расширения - это просто!
Так и нужно. Посмотрите на стандартные поля со временем- они тоже в integer. Там хранится метка времени в формате UNIX TIME.UncleAndy писал(а):При этом поля created_at и signed_at создались в базе с типом integer
phpBBex
-
rxu
- phpBB Guru

- Сообщения: 17082
- Стаж: 19 лет 7 месяцев
- Откуда: Красноярск
- Благодарил (а): 567 раз
- Поблагодарили: 1752 раза
Re: Расширения - это просто!
См.UncleAndy писал(а):поля created_at и signed_at создались в базе с типом integer
\phpbb\db\tools.php - это алиас для полей различной размерности в зависимости от СУБД, но все они имеют целый тип.-
UncleAndy
- phpBB 1.4.1
- Сообщения: 44
- Стаж: 10 лет 10 месяцев
- Благодарил (а): 7 раз
Re: Расширения - это просто!
Ясно. Спасибо. Попробую с unixtime. Если я расширение привяжу к определенной БД, это будет не очень хорошо.
-
rxu
- phpBB Guru

- Сообщения: 17082
- Стаж: 19 лет 7 месяцев
- Откуда: Красноярск
- Благодарил (а): 567 раз
- Поблагодарили: 1752 раза
Re: Расширения - это просто!
Как раз наоборот. С типом timestamp в зависимости от используемой СУ БД будет создаваться поле нужного типа.UncleAndy писал(а): Если я расширение привяжу к определенной БД, это будет не очень хорошо.
-
UncleAndy
- phpBB 1.4.1
- Сообщения: 44
- Стаж: 10 лет 10 месяцев
- Благодарил (а): 7 раз
Re: Расширения - это просто!
Что значит "нужного"? Тут важно единство способов работы с этим полем независимо от базы данных. Integer как раз удовлетворяет этому условию. Т.к. integer он и в Африке integer.С типом timestamp в зависимости от используемой СУ БД будет создаваться поле нужного типа.
Начал работать дальше и появились вопросы по провайдеру авторизации. Я сейчас не предполагаю изменять стандартные пути для формы логина и т.д. Но в случае если авторизация не прошла, откуда мне взять URL формы логина что-бы на нее вернуться? Или тут достаточно отдать в ответ "'status' => LOGIN_ERROR_EXTERNAL_AUTH" и phpbb сам вернеться на страницу логина?
-
rxu
- phpBB Guru

- Сообщения: 17082
- Стаж: 19 лет 7 месяцев
- Откуда: Красноярск
- Благодарил (а): 567 раз
- Поблагодарили: 1752 раза
Re: Расширения - это просто!
UncleAndy писал(а):Что значит "нужного"?
Смотрели? Там всё понятно.rxu писал(а):\phpbb\db\tools.php
-
UncleAndy
- phpBB 1.4.1
- Сообщения: 44
- Стаж: 10 лет 10 месяцев
- Благодарил (а): 7 раз
Re: Расширения - это просто!
Обнаружилась странная проблема. В своем auth_provider мне нужно использовать свои таблицы из БД. Но я не нашел где я из него могу получить table_prefix. Так, как у меня получалось в контроллере - через $this->table_prefix не получается. 
Подскажите, плиз, откуда можно взять table_prefix в auth провайдере?
PS. Сам себе отвечаю. В сервисе можно прописать в качестве одного из параметров auth провайдера %core.table_prefix%
Подскажите, плиз, откуда можно взять table_prefix в auth провайдере?
PS. Сам себе отвечаю. В сервисе можно прописать в качестве одного из параметров auth провайдера %core.table_prefix%
Последний раз редактировалось UncleAndy 21.02.2015 21:10, всего редактировалось 1 раз.
-
rxu
- phpBB Guru

- Сообщения: 17082
- Стаж: 19 лет 7 месяцев
- Откуда: Красноярск
- Благодарил (а): 567 раз
- Поблагодарили: 1752 раза
Re: Расширения - это просто!
Посмотрите пример в расширении https://github.com/rxu/thanks_for_posts
В tables.yml объявлена кастомная таблица, файл потом импортирован в основной конфиг. Затем имя передано в списке сервисов нужному классу.
Если нужен именно префикс, он на строку выше.
В tables.yml объявлена кастомная таблица, файл потом импортирован в основной конфиг. Затем имя передано в списке сервисов нужному классу.
Если нужен именно префикс, он на строку выше.
-
UncleAndy
- phpBB 1.4.1
- Сообщения: 44
- Стаж: 10 лет 10 месяцев
- Благодарил (а): 7 раз
Re: Расширения - это просто!
rxu, спасибо! Как раз так и сделал.
Теперь у меня не получается заменить страницу логина. Мне ее нужно заменить полностью, т.к. полей логин и пароль в ней не будет. В процедуру логина вместо логина будет передаваться сгенерированная мною строка (перед этим показываемая пользователю вместе со сформированной мною-же картинкой) и пустой пароль. Мне показалось что все это должно формироваться в методе get_login_data, который у меня делает возврат вот в таком виде:
Но на странице логина все так-же отображается обычная страница. Только внизу исчез блок о регистрации. Я так подозревая что для полной замены страницы логина (еще и с предварительными операциями по подготовке данных для нее) надо действовать по другому. Но как именно?
Теперь у меня не получается заменить страницу логина. Мне ее нужно заменить полностью, т.к. полей логин и пароль в ней не будет. В процедуру логина вместо логина будет передаваться сгенерированная мною строка (перед этим показываемая пользователю вместе со сформированной мною-же картинкой) и пустой пароль. Мне показалось что все это должно формироваться в методе get_login_data, который у меня делает возврат вот в таком виде:
Код: Выделить всё
return array(
'TEMPLATE_FILE' => '@gplvote/auth_provider_gplvote.html',
'VARS' => array(),
);
-
Anvar
- Former team member
- Сообщения: 1965
- Стаж: 15 лет 8 месяцев
- Благодарил (а): 57 раз
- Поблагодарили: 622 раза
Re: Расширения - это просто!
Там же есть события
Пример:
Разместить в расширении
core.login_box_redirect и core.login_box_failed, подключить можно свой шаблон в listener.Пример:
Код: Выделить всё
page_header($this->user->lang['LOGIN'], false);
$this->template->set_filenames(array('body' => '@ext_name/login_body.html'));
page_footer();
exit();@ext_name/
