che
Новичок
По мотивам темы "Оцените класс работы с БД на говнокод."
Для тех кто хочет предложить мне почитать ".. psr, phpdoc, неймспейсы, phpunit .." я уже читаю.
Кто хочет мне предложить "взять нормальную ORM, например {%super_orm_name%}" - нет. Просто нет.
Если вам больше нечего написать - проходите, пожалуйста, мимо.
Класс
Что есть
Сейчас у меня только обёртка для экранирования переменных параметров запроса и реализация часто востребованных функций: получить строку, получить набор строк, получить значение столбца.
Используется это вот так:
Чего хотелось бы
PS. Приветствуются примеры кода, ссылки на реализации в том или ином проекте/фреймворке, конструктивная критика.
Для тех кто хочет предложить мне почитать ".. psr, phpdoc, неймспейсы, phpunit .." я уже читаю.
Кто хочет мне предложить "взять нормальную ORM, например {%super_orm_name%}" - нет. Просто нет.
Если вам больше нечего написать - проходите, пожалуйста, мимо.
Класс
PHP:
/**
* Обертка над SQL запросами
*
* Class DBWrapper
*
*/
class DBWrapper {
/**
* Производит SQL-зарос на выбор 1 элемента
* Возвращает false если запись не найдена и ассоциативный массив записи, если она была найдена
*
* @param string $sql
* @param array $params
* @return bool|array
*/
public static function find($sql, $params=array()){
$response = false;
$query = self::execute($sql, $params);
if(mysql_num_rows($query)){
$response = mysql_fetch_assoc($query);
}
return $response;
}
/**
* Производит SQL-зарос на выбор 1 элемента
* Возвращает false если запись не найдена и значение указанного столбца в случае успеха
*
* @param string $sql SQl-выражение
* @param int|string $column номер или имя столбца
* @param array $params
* @return mixed
*/
public static function findColumn($sql, $column, $params=array()){
$response = false;
$query = self::execute($sql, $params);
if(mysql_num_rows($query)){
if(is_integer($column)){
$response = mysql_fetch_row($query);
} else {
$response = mysql_fetch_assoc($query);
}
$response = $response[$column];
}
return $response;
}
/**
* Производит SQL-запрос на выборку списка
*
* @param string $sql
* @param array $params
* @return array
*/
public static function findAll($sql, $params=array()){
$response = array();
$query = self::execute($sql, $params);
if(mysql_num_rows($query)){
while(($row = mysql_fetch_assoc($query)) !== false){
$response[] = $row;
}
}
return $response;
}
/**
* Выполняет SQL-запрос предварительно подготавливая переданные данные
*
* @param string $sql строка запроса
* @param array $params параметры запроса
* @return resource
*/
public static function execute($sql, $params=array()){
if($params){
$params = self::prepareParams($params);
foreach($params as $key=>$value){
$sql = preg_replace("/$key(,|\s|\)|$){1}/", "{$value}$1", $sql);
}
}
return self::executeSql($sql);
}
/**
* Производит подготовку параметров для использваония в SQL-запросе
*
* @param array $params
* @return array
*/
protected static function prepareParams($params){
if(!$params){
return $params;
}
$prepareFunction = self::getPrepareFunction();
foreach($params as $key=>&$value){
if(is_array($value)){
$value = self::prepareParams($value);
$value = implode(',', $value);
} else {
$value = "'". self::$prepareFunction($value) ."'";
}
}
return $params;
}
/**
* Возвращает имя функции-обработчика значения для SQL-запроса в зависимости от значения magic_quotes_gpc
*
* @return string
*/
protected static function getPrepareFunction(){
if(get_magic_quotes_gpc()){
return "prepareMagicQuotes";
}
return "prepareNoMagicQuotes";
}
/**
* Подготавливает значения для SQL-запроса, при условии что magic_quotes_gpc=on
*
* @param mixed $value
* @return string
*/
protected static function prepareMagicQuotes($value){
return self::prepareNoMagicQuotes(stripslashes($value));
}
/**
* Подготавливает значения для SQL-запроса, при условии что magic_quotes_gpc=off
*
* @param mixed $value
* @return string
*/
protected static function prepareNoMagicQuotes($value){
// TODO: выделить преобразование html-кода в отдельное место (класс или еще что)
return mysql_real_escape_string(htmlspecialchars_decode($value));
}
/**
* Выполняет sql-запрос и возвращает ресурс запроса
*
* @param $sql string - sql-запрос
* @return resource
* @throws Exception
*/
protected static function executeSql($sql){
$query = mysql_query($sql);
if(!$query){
throw new Exception("Ошибка выполнения SQL-запроса: \"{$sql}\" \n ". mysql_errno() ." : ". mysql_error());
}
return $query;
}
}
Сейчас у меня только обёртка для экранирования переменных параметров запроса и реализация часто востребованных функций: получить строку, получить набор строк, получить значение столбца.
Используется это вот так:
PHP:
$persons = DBWrapper::findAll("SELEC * FROM person WHERE name=:name AND second_name IN (:second_name)", array(':name'=>$personName, ':second_name'=>array('Пупкин', 'Васечкин', 'Васильев')));
- Заключить в класс параметры подключения к БД и чтобы можно было быстро и без напряга менять одно подключение к БД на другое (иногда возникает такая потербность). Вроде такого:
PHP:$a = $a = DBWrapper::find("SELECT * FROM table1"); DBWrapper::setDb('db2'); $b = $a = DBWrapper("SELECT * FROM table1");
- Изменить реализацию find() и findAll() таким образом что бы можно было сделать так:
PHP:$a = DBWrapper::find("SELCT * FROM tabnle 1")->asRow(); $b = DBWrapper::find("SELCT * FROM tabnle 1")->asArray(); $c = DBWrapper::findAll("SELCT * FROM tabnle 1"); foreach($c as $ite){ $data[] = $item->asRow(); }
- И меня ещё смущает реализация метода findAll() - хотелось бы не наполнять массив без необходимости, а возвращать какой-нибудь объект реализующий интерфейс Iterator или ещё что.
- куда-нибудь вынести восстановление html-сущностей:
PHP:.. protected static function prepareNoMagicQuotes($value){ // TODO: выделить преобразование html-кода в отдельное место (класс или еще что) return mysql_real_escape_string(htmlspecialchars_decode($value)); } ..
PS. Приветствуются примеры кода, ссылки на реализации в том или ином проекте/фреймворке, конструктивная критика.