[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите!
meduza56@yandex.ru
С использованием возможностей ООП написать класс-обертку MySQL над стандартной библиотекой mysql, которая будет понимать подготовленные выражения аналогично тому, как работают эти выражения в PDO и mysqli
Примеры итогового использования (обрати внимание на два типа плейсхолдеров для подготовленных выражений
$db=new MySQL();
$db->query("SELECT * FROM tablename WHERE id=? AND type=?",$id,$type);
$db->query("UPDATE tablename SET type=? WHERE id=?",$type,$id);
$db->query("INSERT INTO tablename SET id=:id. type=:type",array(
'id'=>$id,
'type'=>$type
));
echo $db->lastInsertId();


Это тестовое задание. Уважаемые, помогите понять чего от меня надо
inpost
meduza56@yandex.ru
Не совсем понял. Тебе же сказали, что надо написать класс-обертку.

Создай класс, внутри которого будет автоматическое соединение с БД, логирование ошибок mysql, логирования длинных запросов. Собственно всё. Ну и не забудь методы query и lastInsertId.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Игорь_Vasinsky
ВОт было дело

Свернутый текст
/**
* класс типизации входных данных
*/

class Types{
/**
* Описание констант плейсхолдеров
*/

const I = 'i:'; //int
const F = 'f:'; //float
const S = 's:'; //string
const B = 'b:'; //bool
const N = 'n:'; //null

/**
* array
* собирает обработанные входные данные
*/

protected $params;

public function __construct(){

}


/**
* Приводит данные к типу int
*
@param int,float
*
@return int
*/

private function _int($data){
return intval($data);
}
/**
* Приводит данные к типу float
*
@param int,float
*
@return float
*/

private function _float($data){
return round(floatval($data), 2);
}
/**
* Приводит данные к типу string + экранирует спец. символы
*
@param int,float,string
*
@return string
*/

private function _string($data){
//addsleshes здесь смотрится неуклюже
//более правильней, наверно - формировать $data с данными - если строка - то ->real_escape_string()
//и пихать real_escape_string сюда - не вижу смысла

return (string)addslashes($data);
}
/**
* Приводит данные к типу bool
*
@param int,float,string
*
@return bool
*/

private function _bool($data){
return (bool)$data;
}
/**
* подставляет null вместо значения
* я не понял зачем этот плейсхолдер нужен, когда null можно подставить в массив с данными
*
@param void
*
@return NULL as string
*/

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);
}
}


/**
* класс обработки SQL запросов с использование плейсхолдеров
*/

class Stmt extends Types{
protected $marks = array();

public function __construct(){
parent::__construct();
}

/**
* Парсер плейсхолдеров в SQL запросе
* формирует свойства объекта, заполняет $this->marks - плейсхолдеры вместе с метками, $this->params - обработанными данными
*
@param sql string (валидный sql запрос)
*
@param data array (входные данные в виде ассоц массива, с ключами по меткам плейсхолдеров)
*/

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]]);
}

}
}

}

/**
* конечный этап работы с плейсхолдерами в SQL
*
@param sql string (валидный sql запрос)
*
@param data array (входные данные в виде ассоц массива, с ключами по меткам плейсхолдеров)
*
@return string
* пускай название с толку не сбивает - это сокращение от placeholder, его всегда можно сменить на более красивое
*/

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
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.