За последние 24 часа нас посетили 16294 программиста и 1581 робот. Сейчас ищут 1588 программистов ...

Обработка SQL запроса

Тема в разделе "Регулярные выражения", создана пользователем Александр78, 3 апр 2022.

  1. Александр78

    С нами с:
    3 апр 2022
    Сообщения:
    1
    Симпатии:
    0
    Добрый день. Пытаюсь написать свой компилятор для SQL запроса, что бы на входе получать шаблон запроса с параметрами, а на выходе готовый SQL, например
    DbPg::select("select * from settings.settings where adr=?s and org=?n ",array($this->adr,$this->org))
    ?s и ?n это параметны которые будут подменены, ?s это строка, ?n число (таких типов больше)
    текущий код

    PHP:
    1. function select($sql,$parameter)
    2. {
    3.    preg_match_all("/(\?[nfsbdacitP]{1})/i",$sql,$p,PREG_SET_ORDER);
    4.    foreach($p as $id=>$prm){
    5.       $val=parametrConvert($prm[1],$parameter[$id]);
    6.       $sql=preg_replace("/(\?[nfsbdacitP]{1})/i",$val,$sql,1);
    7.    }
    8. return $sql;
    9. }
    10. function parametrConvert($prm,$val)
    11. {
    12.    $prm=substr($prm,1);
    13.    switch($prm){
    14.       case"n":// numeric
    15.         if($val===''||$val===null||$val==='null'||$val==='undefined'||$val=='-1'){
    16.           $val='null';
    17.         }else{
    18.           $val=explode('.',$val)[0];
    19.           $val=preg_replace('/\D+/i','',$val);
    20.         }
    21.        break;
    22.        case"s":// string
    23.           $val="'$val'";
    24.          break;
    25.     }
    26.     return $val;
    27. }
    все это хорошо работало, пока $this->adr не стало равно '... ?n....' в результате на выходе получаю sql "select * from settings.settings where adr='... 5....' and org=?n"

    не могли бы подсказать направление, в котором нужно посмотреть ? )
    т.е. что бы обрабатывались только параметры в исходном шаблоне без учета содержимого самих параметров
    спасибо