Форумы портала PHP.SU » » Работа с СУБД » Класс работы с MySQL

Страниц (1): [1]
 

1. vlom - 26 Июня, 2011 - 20:59:38 - перейти к сообщению
Нарыл в интернете вот такой класс для работы с базой данных
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class MySQLResultSet {
  4.     private $strSQL;
  5.     private $databasename;
  6.     private $connection;
  7.     private $result;
  8.  
  9.  
  10.     public function __construct($strSQL, $databasename, $connection) {
  11.         $this->strSQL = $strSQL;
  12.         $this->databasename = $databasename;
  13.         $this->connection = $connection;
  14.         mysql_select_db($databasename, $connection) or die (mysql_error()."Ошибка #:".  mysql_errno());
  15.         mysql_query($strSQL, $connection) or die (mysql_error()."Ошибка #:".  mysql_errno());
  16.         if(stristr($strSQL, "SQL_CALC_FOUND_ROWS")){
  17.             $msg="No need to use SQL_CALC_FOUND_ROWS.";
  18.             die($msg);
  19.         }
  20.     }
  21.    
  22.     public function __destruct() {
  23.         $this->close();
  24.     }
  25.    
  26.     public function getRow(){
  27.         return mysql_fetch_array($this->result);
  28.     }
  29.    
  30.     public function getDatabaseName(){
  31.         return $this->databasename;
  32.     }
  33.  
  34.     public function getNumberColums(){
  35.         return musql_num_filds($this->result);
  36.     }
  37.    
  38.     public function getNumberRow(){
  39.         return mysql_num_rows($this->result);
  40.     }
  41.    
  42.     public function getInsertID(){
  43.         return mysql_insert_id($this->connection);
  44.     }
  45.    
  46.     public function getUnlimetdNumberRows(){
  47.         $number = 0;
  48.         $version = substr($this->findVersionNumbe(), 0, 1);
  49.         if (!$this->checkForSelect()){
  50.             $msg="Illegal method call - not a SELECT query";
  51.             die( $msg );
  52.         }
  53.         $tempsql = strtoupper($this->strSQL);
  54.         $end = strpos($tempsql, "LIMIT");
  55.         if($end === FALSE){
  56.             $number = mysql_num_rows($this->result);
  57.         }elseif($version < 4) {
  58.             $number = $this->countVersionThree($end);
  59.         }else{
  60.             $number = $this->countVersionFour();
  61.         }
  62.     }
  63.    
  64.     public function getFildNames(){
  65.         $fildname = array();
  66.         if(isset($this->result)){
  67.             $num = mysql_numfields($this->result);
  68.             for($i=0; $i<$num; $i++){
  69.                 $meta = mysql_fetch_field($this->result, $i) or die (mysql_error()."Ошибка #:".  mysql_errno());
  70.                 $fildname[$i] = $meta->name;
  71.             }
  72.         }
  73.         return $fildname;
  74.     }
  75.    
  76.     public function findVersionNumbe(){
  77.         return mysql_get_server_info($this->connection);
  78.     }
  79.    
  80.     private function checkForSelect(){
  81.         $bln = TRUE;
  82.         $strtemp = trim(strtoupper($this->strSQL));
  83.         if(substr($strtemp, 0, 6) != "SELECT"){
  84.             $bln = FALSE;
  85.         }
  86.         return $bln;
  87.     }
  88.    
  89.     private function close(){
  90.         if(isset($this->result)){
  91.             mysql_free_result($this->result);
  92.             unset ($this->result);
  93.         }
  94.     }
  95.    
  96.     private function countVersionFour(){
  97.         $tempsql = trim($this->strSQL);
  98.         $insertstr = " SQL_CALC_FOUND_ROWS ";
  99.         $tempsql=substr_replace($tempsql, $insertstr, 6, 1);          
  100.         $rs=mysql_query($tempsql, $this->connection) or die ( mysql_error(). " Error no:".mysql_errno());
  101.         $tempsql="SELECT FOUND_ROWS()";
  102.         $rs=mysql_query($tempsql) or die ( mysql_error(). " Error no:".mysql_errno());
  103.         $row=mysql_fetch_row($rs);
  104.         $number=$row[0];
  105.         mysql_free_result($rs);
  106.         return $number;
  107.     }
  108.    
  109.     private function countVersionThree($end){
  110.         $tempsql=strtoupper($this->strSQL);
  111.         if(!strpos($tempsql,"DISTINCT")){
  112.             $start= strpos($tempsql,"FROM");
  113.             $numchars=$end-$start;
  114.             $countsql="SELECT COUNT(*) ";
  115.             $countsql.=substr($this->strSQL, $start, $numchars);
  116.             $rs=mysql_query($countsql, $this->connection) or die ( mysql_error(). " Error no:".mysql_errno());
  117.             $row=mysql_fetch_row($rs);
  118.             $number=$row[0];
  119.             mysql_free_result($rs);          
  120.         }else{        
  121.             $msg="Using keyword DISTINCT, "."calculate total number manually.";
  122.             die($msg);
  123.         }
  124.         return $number;
  125.     }
  126. }
  127. ?>
  128.  


в таком виде его можно будет использовать? не в том плане что на локальной машине, а сразу на сайт, какие дыры в нем могут быть?
2. OrmaJever - 26 Июня, 2011 - 21:15:21 - перейти к сообщению
класов для mysql кучи, ево можно самому спокойно написать для себя, а лутше юзать mysqli там уже есть обьектный интерфейс
3. komprenda - 27 Июня, 2011 - 10:37:17 - перейти к сообщению
Плохой класс лучше самому свой написать и должно быть я считаю минимум два объекта база и результат

$db = new MySQL(/* ... */);
$q = $db->query($sql);
$result = $q->fetchNum();
4. vlom - 27 Июня, 2011 - 20:45:43 - перейти к сообщению
komprenda пишет:
должно быть я считаю минимум два объекта база и результат

на счет этого я не совсем понял
(Добавление)
по моему у меня то и происходит запрос выполняется в конструкторе, а результат выборки возвращается getRow()
5. Slavenin - 27 Июня, 2011 - 21:12:40 - перейти к сообщению
на мой взгляд класс должен знать информацию только о том, как связаться с базой, для чего в конструкторе инициируются нужные поля. А вот за выполнение запроса, разбор строк и прочие действия должны отвечать разные функции, зачем в объекте держать результат выборки из базы? выбрали, распарсили, удалили. также не заметил функции, которая закрывает соединение с бд, т.е получается пока не вызван метод close соединение с базой будет висеть открытым, что не есть гуд. В общем присоединяюсь к мнению предыдущих ораторов: проще и лучше написать свой класс, благо, это не так уж и сложно. Закатив глазки
6. OrmaJever - 27 Июня, 2011 - 21:48:28 - перейти к сообщению
komprenda пишет:
и должно быть я считаю минимум два объекта база и результат

Зачем? Есть этому обоснование?
Вобще не нужно сильно заморачиватся, вот простой пример.
PHP:
скопировать код в буфер обмена
  1. class mysql {
  2.         private $mysql = false;
  3.         private $query = false;
  4.  
  5.         public function __construct($user, $pass, $db, $host = 'localhost')
  6.         {
  7.                 $this->mysql = mysql_connect($host, $user, $pass);
  8.                 mysql_select_db($db, $this->mysql);
  9.         }
  10.  
  11.         public function query($sql)
  12.         {
  13.                 if(!$this->mysql) return false;
  14.  
  15.                 $this->query = mysql_query($sql, $this->mysql);
  16.         }
  17.  
  18.         public function fetch_array()
  19.         {
  20.                 if(!$this->query) return false;
  21.                 return mysql_fetch_array($this->query);
  22.         }
  23. // можно ещё добавить методы fetch_object, error и много нужных
  24. }
  25.  

ну и сам вызов
PHP:
скопировать код в буфер обмена
  1. $m = new mysql('user', 'pass', 'database');
  2. $m->query('SELECT * FROM table');
  3. while($r = $m->fetch_array())
  4. print_r($r);
7. vlom - 27 Июня, 2011 - 23:45:33 - перейти к сообщению
Slavenin пишет:
также не заметил функции, которая закрывает соединение с бд, т.е получается пока не вызван метод close соединение с базой будет висеть открытым, что не есть гуд

Закрывается во втором файле, который устанавливает соединение с бд
(Добавление)
всем спасибо, ошибки понял, учту
8. Мелкий - 28 Июня, 2011 - 09:00:48 - перейти к сообщению
OrmaJever пишет:
Зачем? Есть этому обоснование?

Есть - возможно оперировать несколькими результатами. Тот же mysqli возвращает объект результатов, экземпляр другого класса.
9. EuGen - 28 Июня, 2011 - 09:20:11 - перейти к сообщению
Многие не любят Zend за громоздкость, но я бы рекомендовал посмотреть, как там организована работа с БД - структура классов, архитектура.

 

Powered by ExBB FM 1.0 RC1