PHP Класс для работы с плейсхолдерами в SQL

vasinsky

Новичок
в setType($mark_plhdr, $data) читабельней использовать switch
да, я мне тоже больше switch сюда врисовывается, остаётся только перепилить момент с исключением - если задан неизвестный плейсхолдер

#([a-z]{1}\:)#s это ты погорячился используются то всего 5 букв
вот тут я не понял, разъясни

#\:([a-z0-1]{1,})#s а тут про подчеркиванье камелкейс забыл
и это мне не понятно, о чём речь

class Stmt extends Types разрыв мозга. не по русски как-то
я считаю правильней вынести манипуляции с типами в отдельный класс, в случае дописывания типа или переделок - в основной класс не лезем

public function __construct(){parent::__construct(); } беcполезный метод
это на всяк случай, чтобы не лезть в основной класс, ну а пока - просто хорошая манера описывать конструкторы, а вслучае наследования - передавать чилду

if(!$plhdr[1] or empty($plhdr[1])) это возможный notice нет?
нет, не увидел нотисов, спе. накасячил в паттернах - чтобы пустые массивы вышли - поймал исключение об ошибке определения плейсхолдера
floatы мне бывает маловато 2 значения после запятой
вот этот момент - как раз о отдельном классе Types - править можно, не страшно, основной фунционал не заденем, можно метод дописать с константой, можно метод переписать и т.д.

Stmt, plhdr любитель еврита ))
простые сокращения



приехали.
addslashes не только неуместен, но и совсем не правильно с учётом повсеместного utf http://phpfaq.ru/slashes
вообще - этот момент обойти просто - просто в массив уже обработанную real_escape_string строку поставить
 

riff

Новичок
вообще - этот момент обойти просто - просто в массив уже обработанную real_escape_string строку поставить
Ты только что сам пристрелил свой класс. Зачем он тогда вообще нужен? :)
 

vasinsky

Новичок
я же 8 раз сказал - что есть mysqli, PDO, это мне вчера "домашнее задание дали" - хотели посмотреть как я его напишу.
сколько раз можно объяснять.

ест-но я не собирался напичковать класс внутри механизмами PDO, - я ваще не вижу смысла писать обёртку для обёртки.

так, для разминки пойдёт.

вот как это было

Hell0wo0rd написал
vasinsky, о) тут это любят) Напиши свой класс для работы с именованными плейсхолдерами) Можешь эмулировать, можешь использовать нативные инструменты - как хочешь.
Но главное чтобы я мог написать
PHP:
$db->query('SELECT * FROM bla WHERE price < f:price AND count > i:count', array('price' => $price, 'count' => $count))
На форуме уже есть 3 реализации, если хочешь - дам ссылки)
 

WMix

герр M:)ller
Партнер клуба
PHP:
$str = 'вначале было слово s:mano_mano f:myPapa и ерунда e:deda :hedgehog x:';
preg_match_all('#(i|f|s|b|n):([\w\d\_]{1,})#s', $str, $plhdr); // моя идея
print_r($plhdr);
preg_match_all("#([a-z]{1}\:)#s", $str, $plhdr); // твои
preg_match_all("#\:([a-z0-1]{1,})#s", $str, $plhdr_data);
print_r($plhdr);
print_r($plhdr_data);
 

ksnk

прохожий
Нужно какой то способ экранирования "изображения плейсхолдера" предусмотреть. Чтобы можно было, потенциально, вставлять строковые значения с двоеточием. не опасаясь внезапного парсинга.
 
  • Like
Реакции: WMix

WMix

герр M:)ller
Партнер клуба
class Stmt extends Types разрыв мозга. не по русски как-то
я считаю правильней вынести манипуляции с типами в отдельный класс, в случае дописывания типа или переделок - в основной класс не лезем
я о языке
буквально написано "высказывание это типы"
 

vasinsky

Новичок
(i|f|s|b|n) - на данном примере да, а если представить что их намного больше,
в принципе - да, так наглядней как у тебя
и про нижнее подчёркивание я забыл))

я отказался от одновременного парсинга (общего паттерна) - т.к. если вдруг пары не было у плейсхолдера - то он сам тоже не ловиться, а должно и такое проверяться
 

WMix

герр M:)ller
Партнер клуба
vasinsky, не не поможет разговор то о
PHP:
select 'вначале было слово s:mano_mano f:myPapa и ерунда e:deda :hedgehog x: [i:]count' as text from x where  f=s:mano_mano
 

vasinsky

Новичок
зачем, я про

PHP:
SELECT good_name, price, count FROM bla WHERE price BETWEEN (f:price AND [f]:price * [i]:count) AND count > [i]:count AND text = [s]:text
это самое простое как можно уникализировать плейсхолдеры - чтобы они отличались от возможных совпадений в значениях


и подожди, что делать тексту в запросе - туда же значения только через плейсхолдеры попадают.
 

ksnk

прохожий
Разумно было бы не парсить "значения в кавычках", как у Котерова было. А то неясно получится ставить кавычки в строковый пдейсхолдер, какие и накой?
 

hell0w0rd

Продвинутый новичок
Redjik, мы договаривались, что vasinsky реализует любым образом безопасную работу с базой, с удобным синтаксисом именованных плейсхолдеров, так что все ок на мой взгляд с точки зрения препаредов
По классу: на мой взгляд странно выделять в отдельный класс Types, и тем более организовывать схему плейсхолдеров через константы.
Странные названия методов
Не обязательно создавать пустой конструктор
Не уверен что нужно - в деструкторе можно закрывать коннект с базой
Странное использование preg_*, фактически ты эмулируешь preg_replace_callback.
Ну и собственно нет работы с самой базой, написан только кусок класса)
https://github.com/colshrapnel/safemysqli.dev/blob/master/safemysqli.class.php - Реализация @Фанат
https://github.com/FountainDb/pdoshechka - мое

Совсем не против ответной критики)
PS Redjik, предлагай название, я ничего лучше не придумал пока. Уже есть всякие SimpleSuperProEasySimplyPDO, мне они не нравятся
 

hell0w0rd

Продвинутый новичок
ksnk, нет, такое не нужно. Вы либо используете плейсхолдеры, либо пишите SQL ручками. Можно хоть один юзкейс в котором оправдана мешанина?
 

vasinsky

Новичок
не не.. я же сказал - писать обёртку для обёртки - это я считаю тратой времени)

про работу с базой... в задаче было: Напиши свой класс для работы с именованными плейсхолдерами)

а это всего лишь - разбор sql запроса и обработка данных

да - у меня такое же мнение - что для этой обработки ненужен класс, а достаточно метода в общем классе.
а по поводу отдельного класса Types - я уже объяснил.

я стараюсь писать прозрачно, чтобы логика не вооружённым глазом читалась
 

ksnk

прохожий
Можно хоть один юзкейс в котором оправдана мешанина?
стандартный
Код:
select * from users where name=s:user
Все понятно, плейсхолдер заменяется с вставленными кавычками
Код:
update users set descr="Вставка плейсходлером s:user", title="Привет s:user" where name=s:user
Возникнут непонятки. Так как мне хочется, чтобы первый был оставлен без изменения, второй вставился без кавычек, а третий нормально окавыченый

P.S. - про "второй" - решается дополнительным "типом плейсхолдера". А первый и третий - остались в тумане.
 

vasinsky

Новичок
я вижу метод

private function escapeInt($value)
в нём

if (is_float($value))
{
$value = number_format($value, 0, '.', ''); // may lose precision on big numbers
}
float - это не string, а number_format именно строку возвращает

далее

mysqli_real_escape_string($this->conn,$value).
зачем использовать процедурный вариант и писать 2 аргумента, когда - есть ооп синтаксис у mysqli?
 

vasinsky

Новичок
update users set descr="Вставка плейсходлером s:user", title="Привет s:user" where name=s:user
плейсхолдеры - это плейсхолдеры

вот он как должен выглядеть
PHP:
update users set descr=s:desc title=s:title where name=s:user

$data = array(
  'user'=>$user,
  'desc'=>"Вставка плейсходлером ".$user,
    'title'=>"Привет ".$user
);
 

ksnk

прохожий
не!
Код:
 'desc'=>"Вставка плейсходлером s:user ",
;)
или
Код:
'descr'=>"Укажите пару admin:password"
,

Только мне хочется иметь возможность строковую константу с двоеточием вставлять непосредственно в запрос.
 

vasinsky

Новичок
массив с данными - ещё не является частью sql запроса - к нему понятия плесхолдера неприменимо, я по этому показал динамическое формирование данных - а потом уже вставка в запрос - с предварительной обработкой
 
Сверху