ВОт было дело
class Types{
const I = 'i:';
const F = 'f:';
const S = 's:';
const B = 'b:';
const N = 'n:';
protected $params;
public function __construct(){
}
@param @return
private function _int($data){
return intval($data);
}
@param @return
private function _float($data){
return round(floatval($data), 2);
}
@param @return
private function _string($data){
return (string)addslashes($data);
}
@param @return
private function _bool($data){
return (bool)$data;
}
@param @return
protected function _null(){
return 'null';
}
protected function setType($mark_plhdr, $data){
if($mark_plhdr == self::I)
$this->params[] = $this->_int($data);
elseif($mark_plhdr == self::F)
$this->params[] = $this->_float($data);
elseif($mark_plhdr == self::S)
$this->params[] = "'".$this->_string($data)."'";
elseif($mark_plhdr == self::B)
$this->params[] = $this->_bool($data);
elseif($mark_plhdr == self::N)
$this->params[] = $this->_null();
else
throw new Exception('Попытка использования неизвестного плейсхолдера: '.$mark_plhdr);
}
}
class Stmt extends Types{
protected $marks = array();
public function __construct(){
parent::__construct();
}
@param @param
private function parseSql($sql, $data){
if(!is_string($sql)){
throw new Exception('SQL запрос должен быть предоставлен в виде строки');
return false;
}
else{
preg_match_all("#([a-z]{1}\:)#s", $sql, $plhdr);
preg_match_all("#\:([a-z0-1]{1,})#s", $sql, $plhdr_data);
if(!$plhdr[1] or empty($plhdr[1]))
throw new Exception('Ошибка определения плейсходера(ов)');
elseif(count($plhdr[1]) != count($plhdr_data[1]))
throw new Exception('Ошибка определения пары: плейсхолдер - данные');
else{
foreach($plhdr[1] as $k=>$v){
$this->marks[] = $v.$plhdr_data[1][$k];
if(!isset($data[$plhdr_data[1][$k]]))
throw new Exception('Не указанно значение параметра : '.$plhdr_data[1][$k].', при использовании '.$v.$plhdr_data[1][$k]);
else
$this->setType($v, $data[$plhdr_data[1][$k]]);
}
}
}
}
@param @param @return
public function plhdr($sql, $data){
$this->parseSql($sql, $data);
if(!empty($this->marks)){
foreach($this->marks as $k=>$m){
$sql = strtr($sql, array($m => $this->params[$k]));
}
return $sql;
}
return $sql;
}
}
Использование
$stmt = new Stmt;
$data = array(
'price' => 10.1291231,
'count' => 25,
'text'=>"as'fsfas"
);
echo $stmt->plhdr("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" , $data);
оригинал
http://phpclub.ru/talk/threads/php-%D0%9A%...0%B2-sql.77316/ может почитать комменты. по мне так - меня в нём всё устраивает
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker