Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание класса. Помогите пожалуйста с созданием. 
V
    Опции темы
xoslv
Дата 27.2.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 12.1.2007

Репутация: нет
Всего: нет



Как правильно сделать если я не хочу больше 100 раз повторять одни и теже функции, как например:
Код

$q = "select * from table ........ i t.d.";
$r = mysql_query($q) or die(mysql_error());
$num = mysql_num_rows($r);
nu i tak dalee...

Как надо написать класс если я хочу делать так:
Код

$sql = "mysql query";
$this->$sql;
if ($this) {
      // to chto zadumanno po scenariju......
}

И как в таком случае мне получить переменную $num если она указанна в классе?????

Это сообщение отредактировал(а) xoslv - 27.2.2007, 13:49
--------------------
Не всё то маздай, что синее!
PM MAIL ICQ   Вверх
Всемогущий
Дата 28.2.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 25.6.2006
Где: Челябинск

Репутация: нет
Всего: 13



xoslv, опиши свою цель более глобально
тогда будет куча ответов smile 


--------------------
Цитата(smartov @  16.1.2007,  13:26 Найти цитируемый пост)
Видел я PHP код, который пишут наСильники, никогда на php не писавшие  :D  То еще зрелище. Все пытаются сделать руками и через ж (как в С привыкли). Все пытаются память освобождать итд итп. 
PM MAIL ICQ   Вверх
xoslv
Дата 1.3.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 12.1.2007

Репутация: нет
Всего: нет



Ок! Подскажите, как правильно создавать классы? smile 
--------------------
Не всё то маздай, что синее!
PM MAIL ICQ   Вверх
Vaulter
Дата 1.3.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: нет
Всего: 22



смешной пример, зато реальный:
использование
Код

if(count($this->userinfo['roles']))
{
    $acls = $db->select('SELECT tp.name as permname, tp.perm_id,BIT_OR(tacl.mask) as resmask 
        FROM `%s` tp
        LEFT JOIN `%s` tacl ON tacl.role_id IN (%s) AND tacl.perm_id=tp.perm_id
        GROUP BY tp.perm_id',
        $config->tables['perms'],
        $config->tables['auth/acl'], implode(',', $this->userinfo['roles'])
        );
/*cache acl
$acls = $DB->select(sprintf('SELECT tr.name,ta.mask FROM `%s` tr 
    LEFT JOIN %s ta ON ta.perm_id = tr.perm_id AND (ta.user_id = %d OR ta.group_id = %d)',
    $ts['perms'], $ts['acl'], $user_id, $this->userinfo['group_id']));*/
    while($resource = $db->fetch($acls))
    {
        $this->userinfo['access'][$resource['permname']] = $resource['resmask'];
    }
}


класс db создается гдето так:
Код

$db = $GLOBALS['db'] = datasource::factory($ds);//factory inside 


сами классы такие:
Код

<?php
/********************************

2006 Vaulter <[email protected]>
part of system :)
db layer
**********************************/
define('_DBDRIVERS',dirname(__FILE__).DIRECTORY_SEPARATOR.'drivers'.DIRECTORY_SEPARATOR);//some drivers at ex.
define('_DBDRIVEREXT','php');//some drivers at ex. .class.driver
define('_DBFETCH_ARRAY',1);//fetch as array
define('_DBFETCH_ASSOC',2);//fetch as assoca array
define('_DBFETCH_BOTH',4);//fetch as assoca array
define('_DBFETCH_TREE',8);//fetch as tree...TODO

class datasource/*OLD DB class */ extends object
{
    static public $dsns;//connected ready datasources;//array?
    function __construct($dsn = null)//factory
    {
        //
        if($dsn) $this->factory($dsn);
    }
    function connect($dsn = null/*default actions?*/)
    {
        
    }
    static function factory($dsn = null)/* if null what to do? */
    {
        if(datasource::$dsns[$dsn]) return datasource::$dsns[$dsn];
        //else init connect
        if($dsn)    
            $parsed = datasource::parseDSN($dsn);
        else
            $parsed = array('hostspec' => 'localhost',
                            'username' => 'root',
                            'password' => '',
                            'database' => 'test',
                            'phptype' => 'mysqli',
                            
                            );//stupid defaults
        if($parsed['phptype'])//mysql ...
        {
            $driver = _DBDRIVERS.$parsed['phptype'].'.'._DBDRIVEREXT;
            if(file_exists($driver))
            {
                include $driver;
                $classname = $parsed['phptype'].'_Layer';
                datasource::$dsns[$dsn] = new $classname($parsed);
                datasource::$dsns[$dsn]->connect($parsed);//needed there? or in constructor of driver?
                return datasource::$dsns[$dsn];
            }
            else
                datasource::setError('datasource/notfound',$driver);//'cannot load driver: '.$driver);
        }
    }
/**
* Parse a data source name.
*
* @param string $dsn Data Source Name to be parsed
*
* @return array an associative array with the following keys:
*  + phptype:  Database backend used in PHP (mysql, odbc etc.)
*  + dbsyntax: Database used with regards to SQL syntax etc.
*  + protocol: Communication protocol to use (tcp, unix etc.)
*  + hostspec: Host specification (hostname[:port])
*  + database: Database to use on the DBMS server
*  + username: User name for login
*  + password: Password for login
*
* @author Tomas V.V.Cox <[email protected]>
*/
    static function parseDSN($dsn)
    {
      $parsed = array(
          'phptype'  => false,
          'dbsyntax' => false,
          'username' => false,
          'password' => false,
          'protocol' => false,
          'hostspec' => false,
          'port'     => false,
          'socket'   => false,
          'database' => false,
      );

      if (is_array($dsn)) {
          $dsn = array_merge($parsed, $dsn);
          if (!$dsn['dbsyntax']) {
              $dsn['dbsyntax'] = $dsn['phptype'];
          }
          return $dsn;
      }

      // Find phptype and dbsyntax
      if (($pos = strpos($dsn, '://')) !== false) {
          $str = substr($dsn, 0, $pos);
          $dsn = substr($dsn, $pos + 3);
      } else {
          $str = $dsn;
          $dsn = null;
      }

      // Get phptype and dbsyntax
      // $str => phptype(dbsyntax)
      $arr = null;
      if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) {
          $parsed['phptype']  = $arr[1];
          $parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2];
      } else {
          $parsed['phptype']  = $str;
          $parsed['dbsyntax'] = $str;
      }

      if (!count($dsn)) {
          return $parsed;
      }

      // Get (if found): username and password
      // $dsn => username:password@protocol+hostspec/database
      if (($at = strrpos($dsn,'@')) !== false) {
          $str = substr($dsn, 0, $at);
          $dsn = substr($dsn, $at + 1);
          if (($pos = strpos($str, ':')) !== false) {
              $parsed['username'] = rawurldecode(substr($str, 0, $pos));
              $parsed['password'] = rawurldecode(substr($str, $pos + 1));
          } else {
              $parsed['username'] = rawurldecode($str);
          }
      }

      // Find protocol and hostspec

      // $dsn => proto(proto_opts)/database
      $match = null;
      if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) {
          $proto       = $match[1];
          $proto_opts  = $match[2] ? $match[2] : false;
          $dsn         = $match[3];

      // $dsn => protocol+hostspec/database (old format)
      } else {
          if (strpos($dsn, '+') !== false) {
              list($proto, $dsn) = explode('+', $dsn, 2);
          }
          if (strpos($dsn, '/') !== false) {
              list($proto_opts, $dsn) = explode('/', $dsn, 2);
          } else {
              $proto_opts = $dsn;
              $dsn = null;
          }
      }

      // process the different protocol options
      $parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp';
      $proto_opts = rawurldecode($proto_opts);
      if ($parsed['protocol'] == 'tcp') {
          if (strpos($proto_opts, ':') !== false) {
              list($parsed['hostspec'], $parsed['port']) = explode(':', $proto_opts);
          } else {
              $parsed['hostspec'] = $proto_opts;
          }
      } elseif ($parsed['protocol'] == 'unix') {
          $parsed['socket'] = $proto_opts;
      }

      // Get dabase if any
      // $dsn => database
      if ($dsn) {
          // /database
          if (($pos = strpos($dsn, '?')) === false) {
              $parsed['database'] = $dsn;
          // /database?param1=value1&param2=value2
          } else {
              $parsed['database'] = substr($dsn, 0, $pos);
              $dsn = substr($dsn, $pos + 1);
              if (strpos($dsn, '&') !== false) {
                  $opts = explode('&', $dsn);
              } else { // database?param1=value1
                  $opts = array($dsn);
              }
              foreach ($opts as $opt) {
                  list($key, $value) = explode('=', $opt);
                  if (!isset($parsed[$key])) {
                      // don't allow params overwrite
                      $parsed[$key] = rawurldecode($value);
                  }
              }
          }
      }

      return $parsed;
    }
}
abstract class dblayer extends object
{
    private $link;
    private $version;//hm some collations stuff switching by config
    function __construct($dsn = null)
    {//connect!
        //echo 'dblayer construct<br />';
        if(!empty($dsn))$this->link = $this->connect($dsn);
    }
    abstract function lastInsertID($table = null, $field = null);
        // not using mysql_insert_id() due to http://pear.php.net/bugs/bug.php?id=8051
        //return $this->selectCell('SELECT LAST_INSERT_ID()');//SQL92???
    abstract function connect($dsn = null);
    function __destruct()
    {
        /*
        if(!empty($this->link))
        {
            mysql_close($this->link);
            //sys_log('mysql closed');
        }*/
    }
    function tableExists($tablename)
    {
        $res = $this->query("SHOW TABLES LIKE '$tablename'");//SQL92?
        if($this->_count($res) > 0) return true;
        else return false;
    }
    function createTable($tablename,$spec = null,$force=false)
    {
        //do query
        $query = "create table ".($force?"":" IF NOT EXISTS ")." `$tablename` $spec";
        return $this->query($query);
    }
    abstract function escape($data);
        /*
        return mysql_real_escape_string($data);
        */
    /*возвращает колонку, need argc */
    function selectCell($query)
    {//do query
        if(func_num_args() > 1) 
        {
            $args = func_get_args();
            array_shift($args);//query
            $sql = vsprintf($query,$args);
            $query = & $sql;//alias
        }
        $res = $this->query($query);
        if($res && $this->numRows($res))
        {
            $arr = $this->fetch($res);
            if(isset($cell))    return $arr[$cell];
            return $arr[0];
        }
    }
    function selectRow($query)//???? queryRow fetchmode set via function TODO
    {
        if(func_num_args() > 1) 
        {
            $args = func_get_args();
            array_shift($args);//query
            $sql = vsprintf($query,$args);
            $query = & $sql;//alias
        }
        $res = $this->query($query);
        if($res && $this->numRows($res))
        {
            $arr = $this->fetch($res);//
            return $arr;
        }
        return null;
    }
    function select($query)
    {
        if(func_num_args() > 1) 
        {
            $args = func_get_args();
            array_shift($args);//query
            $sql = vsprintf($query,$args);
            $query = & $sql;//alias
        }
        return $this->query($query);
    }
    function insert($table,$fields = array())
    {
        $keys = array_keys($fields);// check if we have numeric
        if(is_numeric($keys[0]))//we have numeric array - remove all non numeric fields!
        {
            foreach($fields as $key=>$value)
                if(is_numeric($key)) $newfields[$key] = $value;

            $fields = $newfields;
        }
        else
        {//do assoc query
            $f = "`".implode("`,`",$keys)."`";

        }
        $values = "'".implode("','",$fields)."'";//we be 'value1','value2'
        if(!empty($f))
            $query = "INSERT INTO `$table` ($f) VALUES ($values)";
        else
            $query = "INSERT INTO `$table` VALUES ($values)";

        $ok = $this->_query($query);
        if(!$ok) return false;
        return mysql_insert_id($this->link);
    }
    function query($query)
    {
        if(defined('_SQLDEBUG') || @$_GET['debug']=='vkl' )slog($query,'debugsql');//TOO SLOOOW!!!
        //continue to layer
    }
    abstract function numRows($res = null);
        //if(is_resource($res))return mysql_num_rows($res);
        //elseif($aff = mysql_affected_rows($this->link)) return $aff;
        //else return null;
    abstract function fetch($res, $mode = _DBFETCH_BOTH);
        //if null get last result
        //return mysql_fetch_array($res);
    abstract function free($res);
        //mysql_free_result($res);

}
?>





--------------------
PM MAIL WWW ICQ   Вверх
xoslv
Дата 2.3.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 12.1.2007

Репутация: нет
Всего: нет



Тобеж получается что для того, что мне надо, это будет выглядеть примерно так:
Код

class sql_q {
  $host = "localhost";
  $user = "mysqluser";
  $pass = "mysqlpass";
  $db = "dbname";
  function query() {
    mysql_connet($host,$user,$pass) or die(mysql_error());
    mysql_select_db($db) or die(mysql_error());
    $sql_query = mysql_query($sql) or dei(mysql_error());
  }
}

И для использования мне надо будет писать так:
Код

$sql_query = $sql->(select * from `table` where `status`='1');

Или как ? Я что-то не понимаю пока.... Очень хочется разобраться.....
Если у меня где-то не правильно, подскажите где именно! Зарание спасибо!
--------------------
Не всё то маздай, что синее!
PM MAIL ICQ   Вверх
mishaSL
Дата 2.3.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 54



xoslv, нет.

Вот простейший пример, этот пример будет работать как на php4 так и на php5(т.к. незнаю какая у тебя версия) и отражает только суть, он не несет смысловую нагрузку. Но в 5 версии объектная модель сильно изменилась и лучше писать  по примеру Vaulterа.

Код

<?php
class sql {
  /* Свойства объекта*/
  var $host = "localhost";
  var $user = "mysqluser";
  var $pass = "mysqlpass";
  var $db = "dbname";
  /*Конструктор - выполняется когда мы инициализируем класс, т.е. когда ты делаешь $db = new sql(); сразу выполняется конект к базе*/  
  function sql() {
    mysql_connect($this->host,$this->user,$this->pass) or die(mysql_error());
    mysql_select_db($this->db) or die(mysql_error());    
  }                                                                                                                                
  /*методы объекта*/
  function query($sql) {
    return mysql_query($sql) or die(mysql_error());
  }       
  /* тут могут быть другие методы ...*/
}

$db = new sql();
$query = $db->query('select * from `table`');
?>



--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
xoslv
Дата 2.3.2007, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 12.1.2007

Репутация: нет
Всего: нет



Огромное спасибо! Разобрался!
--------------------
Не всё то маздай, что синее!
PM MAIL ICQ   Вверх
mishaSL
Дата 5.3.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 54



Цитата(xoslv @  2.3.2007,  20:09 Найти цитируемый пост)
Огромное спасибо! Разобрался! 


Всегда пожалуйста smile 


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
CyClon
Дата 20.4.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Все раскидываютсся советами по сабжу, а смысл то какой smile)) Человеку нужно просто сделать функцию.

Код
<?php

function sqlQuery($query) {
    $result = mysql_query($query);
    return ($result) ? mysql_num_rows($result) : 0;
}

$query = "SELECT * FROM `table`";
$result = sqlQuery($query);

print_r($result);

?>


Но можно еще усовершенствовать, получим экранированные запросы, ведущие к повышению защиты от sql-инъекций:

Код
<?php

function sqlQuery($query, $escape = 1) {
    if ($escape) {
        $result = mysql_real_escape_string($result);
    }
    $result = mysql_query($query);
    return ($result) ? mysql_num_rows($result) : 0;
}

$query = "SELECT * FROM `table`";
// Экранированный запрос, краткая и полная форма использования функции
$result = sqlQuery($query);
$result = sqlQuery($query, 1);
// Не экранированный запрос
$result = sqlQuery($query, 0);

print_r($result);

?>



--------------------
user posted image
PM   Вверх
xoslv
Дата 18.7.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 12.1.2007

Репутация: нет
Всего: нет



Super! Спасибо! Отлично работает!
--------------------
Не всё то маздай, что синее!
PM MAIL ICQ   Вверх
Feldmarschall
Дата 18.7.2008, 12:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: нет
Всего: 32



Цитата

Дата 20.4.2007
Человеку нужно просто сделать функцию.

Дата 18.7.2008
Super! Спасибо! Отлично работает! 


Как писали раньше в газетах, "награда нашла героя"...

А "усовершенствованная" функция - неправильная
Да и в первой смысла тоже немного.



при этом моё понимание того, что нужно было человеку, заключается примерно в таком:
Код

$scalar=sqlQuery("SELECT count(*) FROM table","single"); 
$row=sqlQuery("SELECT * FROM table WHERE id=1","row");
$array=sqlQuery("SELECT count(*) FROM table","arr"); 
$result=sqlQuery("SELECT count(*) FROM table","res");


Это сообщение отредактировал(а) Feldmarschall - 18.7.2008, 12:28
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Extensions | Следующая тема »


 




[ Время генерации скрипта: 0.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.