наши рабочие классы для работы с бд

Статус
В этой теме нельзя размещать новые ответы.

admLoki

генератор случайного PHP
Регистрация
14 Сен 2006
Сообщения
481
Реакции
104

koka

Постоялец
Регистрация
31 Дек 2006
Сообщения
94
Реакции
20
Да, надо описывать..
Вообще, на сайте лежит очень хороший ман.
 

koka

Постоялец
Регистрация
31 Дек 2006
Сообщения
94
Реакции
20
Единственный минус, который я вижу, то, что при изминении таблиц в БД надо править файлы, в которых описаны эти таблицы. Но с другой стороны:
- Строение таблиц у тебя всегда перед глазами
- Описывать модели куда проще
Да и на личие такой штуки как DQL полностью конпенсирует этот недостаток :)
 

Гвоздь

Создатель
Регистрация
6 Сен 2006
Сообщения
47
Реакции
34
  • Заблокирован
  • #45
Ни много, ни мало. Ж)

Код:
<?

class mysql
{
	# Соединение с базой данных
	Function db_connect($mysql_db)
	{
		mysql_connect($mysql_db['h'],$mysql_db['un'],$mysql_db['p']) or die("Невозможно создать соеденение с базой!");
		if(!mysql_select_db($mysql_db['dbn']))
    	{
			print"Найти базу с таким именем не удалось!";
		 	die();
		}
	}
	
	# Разорвать соединение с базой данных
	Function db_disconnect()
	{
		mysql_close();
	}
	
	# Послать запрос базе данных
	Function q($q)
	{
		$res = mysql_query($q) or print"".mysql_error()." (".mysql_errno().")<br>";
		return $res;
	}
}

?>
 

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
Код:
<?php
if(!defined('_SHELL')) die();

// ************************************************* \\
// * Class                 |                Module * \\
// * Version               |                  1.00 * \\
// * Build:                |                  0001 * \\
// * Date:                 |            25.08.2008 * \\
// ************************************************* \\
//  *              Created by CrashX              *  \\
//   *            All Rights Reserved            *   \\
//    *           Copyright © CrashX            *    \\
//     *      Copyright © eXtreme Studio       *     \\
//      *   Site: http://eXtreme-Studio.ru    *      \\
//       *     mail: XSiteCMS@gmail.com      *       \\
//        ***********************************        \\

/**
* Класс Баз Данных
*/
class DB
{
// версия класса
var $version=0.01;
// таймер для сна
var $sleep=1;
// статус и id соединения
var $connected=false;
// настройки сервера
var $server='localhost';
var $user='root';
var $password=null;
var $database=null;
var $port='3306';
var $persistent=false;
// кодовая страница
var $collate='cp1251';
// текст запроса
var $query=null;
// описание запроса
var $info=null;
// время запроса
var $timer=null;
// id запроса для освобождения памяти по указателю
var $id=null;
// версионность
var $mysql=null;
var $compatibility='4.0';
// статистика
// ведение журнала
var $logging=true;
// освобожднеие памяти после выполнения запроса
var $free=true;
var $log=array(array('info'=>'','query'=>'','error'=>'','time'=>''));
// кол-во запросов
var $counter = 0;


function __construct()
{
  $this->db();
}

/**
 * Конфигурация соединения
 *
 */
function db()
{
  if(!defined('DB_SERVER')) $this->server='localhost'; else $this->server=DB_SERVER;
  if(!defined('DB_USER')) $this->user='root'; else $this->user=DB_USER;
  if(!defined('DB_PASSWORD')) $this->password=null; else $this->password=DB_PASSWORD;
  if(!defined('DB_PORT')) $this->port=3306; else $this->port=DB_PORT;
}

/**
 * Подключение к указанной СуБД
 */
function connect()
{
global $engine;
$this->timer=$engine->debug->dbtime('on');
if(!$this->connected):
  if($this->port):
    $this->server.=":".$this->port;
  endif;
  if($this->password==""):
    if($this->persistent):
      $this->connected = @mysql_pconnect($this->server,$this->user);
    else:
      $this->connected = @mysql_connect($this->server,$this->user);
    endif;
  else:
    if($this->persistent):
      $this->connected = @mysql_pconnect($this->server,$this->user,$this->password);
    else:
      $this->connected = @mysql_connect($this->server,$this->user,$this->password);
    endif;
  endif;
endif;
  if($this->connected):
    if($this->database!=""):
    // Выбор базы
      if(!@mysql_select_db($this->database,$this->connected)):
        die("Not select DB ! Не выбрана база данных !");
      endif;
    endif;
  $this->mysql = mysql_get_server_info();
	if(version_compare($this->mysql_version, $this->compatibility, ">=")):
	  $this->query="/*!40101 SET NAMES '".$this->collate."' */";
	else:
      $this->query="SET NAMES '".$this->collate."'";
    endif;
    $this->info="db->connect(".$this->database.")";
    $this->query();
  else:
    die("Not connect server ! Нет соединения с базой данных: <b>".$this->database."</b> !");
  endif;
}


/**
 * Enter description here...
 *
 */
function disconnect()
{
global $engine;
$this->timer=$engine->debug->dbtime('off');
if($this->connected):
  $this->free();
  @mysql_close($this->connected);
  $this->connected=null;
  $this->database='';
endif;
@mysql_close();
}


/**
* Выполняет запросы и возвращает указатель на данные
*
*/
function query()
{
global $engine;
$this->free ? $this->free() : $this->id=null;
$this->timer='';
if($this->query!=""):
  $this->id=mysql_query($this->query,$this->connected);
  $this->counter++;
else:
  return false;
endif;
if($this->logging):
  $this->log();
endif;
$this->info=null;
$this->query=null;
if(!$this->id):
  $engine->debug->error='DEFAULT';
  $engine->debug->dump();
  return false;
endif;
return true;
}

/**
 * Enter description here...
 */
function free($id=false)
{
if($id):
  @mysql_free_result($id);
endif;
if($this->id):
  @mysql_free_result($this->id);
  $this->id=null;
endif;
}

/**
 * Ведение журнала запросов текущего пользователя
 */
function log()
{
$this->log[$this->counter-1]['info']=$this->info;
$this->log[$this->counter-1]['query']=$this->query;
@$this->log[$this->counter-1]['error']=mysql_errno().':'.mysql_error();
@$this->log[$this->counter-1]['error']=mysql_errno().':'.mysql_error();
@$this->log[$this->counter-1]['time']=date('d m Y H:i');
}

 /**
  * Возвращение результата в виде массива
  * @param  MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH
  * @return  mixed результат
  */
 function result($type=MYSQL_ASSOC)
 {
 return @mysql_fetch_array($this->id,$type);

 }

 /**
  * Возвращает количество рядов результата запроса
  * @return  mixed результат
  */
 function rows()
 {
 return @mysql_num_rows($this->id);
 }



/**
 * Создание текста запроса для выборки записи
 * @param поля в виде ассоциативного массива
 * @param таблица имя
 * @param критерии в виде ассоциативного массива
 * @param доплительные части запроса или директивы
 * @return mixed
 */
function select($fields=array(),$table=null,$criteria=array(),$directive=null)
{
// SELECT *ПОЛЯ* FROM *ТАБЛИЦА* WHERE *УСЛОВИЯ* *ДИРЕКТИВЫ*
$fields=implode(", ",array_keys($fields));
if(is_array($criteria)):
  foreach($criteria as $column=>$value):
    $where[]="{$column}='{$value}'";
  endforeach;
  $where=implode(" AND ",$where);
endif;
$this->query.="SELECT {$fields} FROM {$table}";
if(!empty($where)):
  $this->query.=" WHERE {$where}";
endif;
$this->query.=" {$directive}";
return true;
}

/**
 * Создание текста запроса для добавления записи
 * @param поля в виде ассоциативного массива
 * @param таблица имя
 */
function insert($fields=array(),$table=null)
{
// INSERT INTO *ТАБЛИЦА* SET *ПОЛЯ* WHERE *УСЛОВИЯ*
foreach($fields as $field):
  $values[]="'{$field}'";
endforeach;
$columns=array_keys($fields);
$this->query.="INSERT INTO {$table} (".implode(", ",$columns).") VALUES (".implode(", ",$values).")";
return true;
}
/**
 * Создание текста запроса для обновления записи
 * @param поля в виде ассоциативного массива
 * @param таблица имя
 * @param критерии в виде ассоциативного массива
 * @return mixed
 */
function update($fields,$table,$criteria)
{
// UPDATE *ТАБЛИЦА* SET *ПОЛЯ* WHERE *УСЛОВИЯ*
foreach($fields as $column=>$value):
  $updates[]="{$column}='{$value}'";
endforeach;
$update=implode(", ",$updates);
foreach($criteria as $column=>$value):
  $wheres[]="{$column}='{$value}'";
endforeach;
$where=implode(" AND ",$wheres);
$this->query.="UPDATE {$table} SET {$update} WHERE {$where}";
return true;
}

/**
 * Создание текста запроса для удаления записи
 * @param таблица имя
 * @param критерии в виде ассоциативного массива
 * @return mixed
 */
function delete($table,$criteria)
{
// DELETE *?!ПОЛЯ!?* FROM *ТАБЛИЦА* WHERE *УСЛОВИЯ*
foreach($criteria as $column=>$value):
  $wheres[]="{$column}='{$value}'";
endforeach;
$where=implode(" AND ",$wheres);
$this->query.="DELETE FROM {$table} WHERE {$where}";
return true;
}

function import($filename)
{

if(!file_exists($filename)):
  return false;
endif;
$fdb = fopen($filename, 'r');
$sql = '';
while(!feof($fdb)):
  $sql .=fread($fdb, 1024);
endwhile;
fclose($fdb);
$sql = str_replace("\r", '', $sql);
$sql = split("\n\n", $sql);
foreach($sql as $string):
  $this->query=trim($string, "\r\n; ");
  if(ereg('^\#', $this->query))continue;
  // strip out comments and \n for mysql 3.x
  if($this->mysql < $this->compatibility):
    $this->query=preg_replace("~COMMENT.*[^']?'.*[^']?'~","",$this->query);
    $this->query=str_replace('\r', "", $this->query);
    $this->query=str_replace('\n', "", $this->query);
  endif;

  $this->info='db->import('.$filename.')';
  $this->query();
endforeach;
}

}
?>

самописный
лучше всего его использовать описав таблицу, те указав те поля которе будут фигурировать в модуле например
Код:
var $table='organizacia';
var $org=array(
'oid'=>false,
'short_name'=>false,
'full_name'=>false,
'tip'=>null,
'otdelen'=>null,
'plat_name'=>null,
'gol_org'=>null,
'sthet_id'=>null,
'inn'=>null,
'kpp'=>null,
'ogrn'=>null,
'date_reg'=>null,
'code_ifns'=>null,
'name_ifns'=>null,
'date_svidet'=>null,
'num_svidet'=>null,
'code_org_vid_svidet'=>null,
'code_nalog_organ'=>null,
'name_nalog_organ'=>null,
'urid_adres'=>null,
'fiz_adres'=>null,
'tel_fiz'=>null,
'tel_urid'=>null,
'fax_fiz'=>null,
'pochta'=>null,
'uchereditel'=>null,
'email'=>null,
'intern'=>null,
'info'=>null,
'code_okato'=>null,
'okpo'=>null,
'koknh'=>null,
'code_okopf'=>null,
'name_okopf'=>null,
'code_okfs'=>null,
'name_okfs'=>null,
'code_okved'=>null,
'name_okved'=>null,
'code_inspekc_poluch'=>null,
'num_pfr'=>null,
'ter_id'=>null,
'num_fss'=>null,
'str_reg'=>null,
'str_mesto'=>null,
'kod_nal'=>null,
'poln_name'=>null,
'rukovod'=>null,
'gl_buch'=>null,
'kassir'=>null,
);

function select($who=null)
{
global $engine;
$engine->db->select($this->org,$this->table,$who);
@$engine->db->info.='org->select(ID:'.$who['id'].')';
if($engine->db->query()) return $this->org=$engine->db->result();
}
function insert($who=array())
{
global $engine;
$engine->db->insert($this->org,$this->table);
@$engine->db->info.='user->select(ID:'.$who['id'].', UL:'.$who['ulogin'].', UP:'.$who['upassword'].')';
if($engine->db->query()) return $engine->db->result();
}
function update($who=array())
{
global $engine;
$engine->db->update($this->org,$this->table,$who);
@$engine->db->info.='org->update(ID:'.$who['id'].')';
if($engine->db->query()) return $engine->db->result();
}
function delete($who=array())
{
global $engine;
$engine->db->delete($this->table,$who);
@$engine->db->info.='user->delete(ID:'.$who['id'].')';
if($engine->db->query()) return $engine->db->result();
}

проверки на вилд делаются отдельно
 

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
да использую и при том много где, тк FW я не люблю, а этот класс всегда модернизируется и в него добавляются только то что нужно, мне не нужны классы перегруженные функционалом который я вообще не буду использовать!

вот например в соседней ветке искал решение как работать с DateTime а именно как его преобразовать в любой формат, написал свой обработчик полностью, а сначала с Unix-TimeStamp, но в нем оказалось ограничение что дата должна быть 1970 > тут < 2038
потом переписал, за основу взял функционал PHP 5.2 впрочем там все написано!))

Для просмотра ссылки Войди или Зарегистрируйся
 

admLoki

генератор случайного PHP
Регистрация
14 Сен 2006
Сообщения
481
Реакции
104
А зачем писать то что уже написано? Такое ощущение что тебе «перегруженность» создает проблем.
 

Jeurey

Хранитель порядка
Регистрация
13 Сен 2006
Сообщения
419
Реакции
614
А зачем писать то что уже написано? Такое ощущение что тебе «перегруженность» создает проблем.

А чо - нет, разве? Кому нужны десять-двадцать "лишних" методов, которые не используешь. Видать, байты на ФС экономят :D
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху