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 строку поставить
 
вообще - этот момент обойти просто - просто в массив уже обработанную real_escape_string строку поставить
Ты только что сам пристрелил свой класс. Зачем он тогда вообще нужен? :)
 
я же 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 реализации, если хочешь - дам ссылки)
 
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);
 
Нужно какой то способ экранирования "изображения плейсхолдера" предусмотреть. Чтобы можно было, потенциально, вставлять строковые значения с двоеточием. не опасаясь внезапного парсинга.
 
  • Like
Реакции: WMix
class Stmt extends Types разрыв мозга. не по русски как-то
я считаю правильней вынести манипуляции с типами в отдельный класс, в случае дописывания типа или переделок - в основной класс не лезем
я о языке
буквально написано "высказывание это типы"
 
(i|f|s|b|n) - на данном примере да, а если представить что их намного больше,
в принципе - да, так наглядней как у тебя
и про нижнее подчёркивание я забыл))

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

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

это самое простое как можно уникализировать плейсхолдеры - чтобы они отличались от возможных совпадений в значениях


и подожди, что делать тексту в запросе - туда же значения только через плейсхолдеры попадают.
 
Разумно было бы не парсить "значения в кавычках", как у Котерова было. А то неясно получится ставить кавычки в строковый пдейсхолдер, какие и накой?
 
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, мне они не нравятся
 
ksnk, нет, такое не нужно. Вы либо используете плейсхолдеры, либо пишите SQL ручками. Можно хоть один юзкейс в котором оправдана мешанина?
 
не не.. я же сказал - писать обёртку для обёртки - это я считаю тратой времени)

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

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

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

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

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

я вижу метод

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

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