ФорумПрограммированиеPHP для идиотовPHP и ООП → class sql

class sql

  • sweet15w

    Сообщения: 140 Репутация: N Группа: Кто попало

    Spritz Ноя. 6, 2011, 9:54 п.п., спустя 2 часа 1 минуту 28 секунд

    Nyaah, ты взорвешь ему мозг. не надо :)
    ну чтож Вы так-то сразу… вроде никого не забрызгал…

    получается что-то типо этого (опять же, для начала)?? :

    <?php

    /**
    * абстрактный класс соединения
    **/

    abstract class DBConnection {
    protected $dbhost;
    protected $dbname;
    protected $dbuser;
    protected $dbpassword;
    protected $dbcharset;

    function setParams( $dbconfig ) {
    $this -> dbhost = $dbconfig["dbhost"];
    $this -> dbname = $dbconfig["dbname"];
    $this -> dbuser = $dbconfig["dbuser"];
    $this -> dbpassword = $dbconfig["dbpassword"];
    $this -> dbcharset = $dbconfig["dbcharset"];
    }

    function __construct() {
    echo "DB ";
    }
    }



    /**
    * расширенный класс соединения для работы с Mysql
    **/

    class DBMysql extends DBConnection {
    function __construct( $dbconfig ) {
    parent::__construct();
    echo "Mysql<br />";
    }
    }



    /**
    * расширенный класс соединения для работы с Postgresql
    **/

    class DBPostgresql extends DBConnection {
    function __construct( $dbconfig ) {
    parent::__construct();
    echo "Postgresql<br />";
    }
    }



    /**
    * фабрика соединений
    **/

    class DB {
    function instance( $dbconfig ) {
    switch( $dbconfig["dbdriver"] ) {
    case "mysql" :
    $DBDriver = new DBMysql( $dbconfig );
    break;

    case "postgresql" :
    $DBDriver = new DBPostgresql( $dbconfig );
    break;
    }
    return $DBDriver;
    }
    }
    ?>
    Спустя 161 сек.
    теперь только возникает вопрос… что-то не понял… а как наследуются protected переменные… нужно создавать метод для их получения который будет унаследован потомками?? или как??
    Спустя 80 сек.
    вызов класса:

    	require_once "classes/DB.class.php";
    $db=DB::instance( array(
    "dbdriver" => "mysql",
    "dbhost" => "localhost",
    "dbname" => "wwwmysqliru",
    "dbuser" => "root",
    "dbpassword" => "",
    "dbcharset" => "cp1251"
    ));

    $db2=DB::instance( array(
    "dbdriver" => "postgresql",
    "dbhost" => "localhost2",
    "dbname" => "wwwmysqliru",
    "dbuser" => "postgres",
    "dbpassword" => "postgres",
    "dbcharset" => "cp1251"
    ));
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz Ноя. 7, 2011, 12:01 д.п., спустя 2 часа 7 минут 13 секунд

    а как наследуются protected переменные…

    private доступен только внутри методов текущего класса, protected в текущем классе и в наследниках, public доступны везде
    Work, buy, consume, die
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz Ноя. 7, 2011, 12:03 д.п., спустя 2 минуты 2 секунды

    теперь только возникает вопрос… что-то не понял… а как наследуются protected переменные… нужно создавать метод для их получения который будет унаследован потомками?? или как??

    как насчет почитать книгу?
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz Ноя. 7, 2011, 12:04 д.п., спустя 50 секунд

    а вопрос не понял
    если свойство рид онли, то стоит его сделать привейтом, и создать паблик метод для получения этого свойства, если подразумевается, что свойство можно менять в процессе использоватия класса, то почему бы его не сделать пабличным или защищённым. Зависит от того что ты хочешь получить.
    Work, buy, consume, die
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz Ноя. 7, 2011, 1:06 д.п., спустя 1 час 1 минуту 23 секунды

    зачем делать setParams если ты передаешь параметры в конструктор?
  • sweet15w

    Сообщения: 140 Репутация: N Группа: Кто попало

    Spritz Ноя. 7, 2011, 2:18 д.п., спустя 1 час 12 минут 14 секунд

    <?php
    require_once "classes/DB.class.php";

    $db=DB::instance( array(
    "dbdriver" => "mysql",
    "dbhost" => "localhost",
    "dbname" => "wwwmysqliru",
    "dbuser" => "root",
    "dbpassword" => "",
    "dbcharset" => "cp1251"
    ));
    $result = $db -> query( "select * from test" );
    foreach( $result as $data ) {
    echo $data["id"]." - ".$data["name"]."<br />";
    }

    $db2=DB::instance( array(
    "dbdriver" => "postgresql",
    "dbhost" => "localhost",
    "dbname" => "postgres",
    "dbuser" => "postgres",
    "dbpassword" => "postgres",
    "dbcharset" => "WIN1250"
    ));
    $result2 = $db2 -> query( "select * from test2" );
    foreach( $result2 as $data ) {
    echo $data["id"]." - ".$data["name"]."<br />";
    }
    ?>


    <?php

    /**
    * абстрактный класс соединения
    **/

    abstract class DBConnection {
    protected $dbhost;
    protected $dbname;
    protected $dbuser;
    protected $dbpassword;
    protected $dbcharset;

    public $dbid = 0;

    function __construct( $dbconfig ) {
    $this -> setParams( $dbconfig );
    $this -> connect();
    }

    function __destruct() {
    $this -> close();
    }

    function setParams( $dbconfig ) {
    $this -> dbhost = $dbconfig["dbhost"];
    $this -> dbname = $dbconfig["dbname"];
    $this -> dbuser = $dbconfig["dbuser"];
    $this -> dbpassword = $dbconfig["dbpassword"];
    $this -> dbcharset = $dbconfig["dbcharset"];
    }


    function setDBName( $dbname ) {
    /**
    * функция выбора базы данных
    **/
    }

    function setDBCharset( $dbname ) {
    /**
    * функция установки кодировки базы данных
    **/
    }

    function connect() {
    /**
    * соединение с базой данных
    **/
    }

    function close() {
    /**
    * закрытие соединения с базой данных
    **/
    }

    function query() {
    /**
    * выполнение запроса
    **/
    }
    }



    /**
    * расширенный класс соединения для работы с Mysql
    **/

    class DBMysql extends DBConnection {

    function connect() {
    $this -> dbid = mysql_connect( $this -> dbhost, $this -> dbuser, $this -> dbpassword );
    $this -> setDBName( $this -> dbname );
    $this -> setDBCharset( $this -> dbcharset );
    }

    function close() {
    mysql_close( $this -> dbid );
    }

    function query( $query ) {
    $data_array = array();
    $result = mysql_query( $query, $this -> dbid );
    while( $data = mysql_fetch_assoc( $result ) ) {
    array_push( $data_array, $data );
    }
    return $data_array;
    }

    function setDBName( $dbname ) {
    $this -> dbname = $dbname;
    mysql_select_db( $this -> dbname, $this -> dbid );
    }

    function setDBCharset( $dbcharset ) {
    $this -> dbcharset = $dbcharset;
    mysql_set_charset( $this -> dbcharset, $this -> dbid );
    }

    }

    class DBPostgresql extends DBConnection {

    function connect() {
    $this -> dbid = pg_connect( "host=".$this -> dbhost." dbname=".$this -> dbname." user=".$this -> dbuser." password=".$this -> dbpassword );
    $this -> setDBCharset( $this -> dbcharset );
    }

    function close() {
    pg_close( $this -> dbid );
    }

    function query( $query ) {
    $data_array = array();
    $result = pg_query( $this -> dbid, $query );
    while( $data = pg_fetch_assoc( $result ) ) {
    array_push( $data_array, $data );
    }
    return $data_array;
    }

    function setDBName( $dbname ) {
    $this -> dbname = $dbname;
    $this -> connect();
    }

    function setDBCharset( $dbcharset ) {
    $this -> dbcharset = $dbcharset;
    pg_set_client_encoding( $this -> dbid, $this -> dbcharset );
    }

    }



    /**
    * фабрика соединений
    **/

    class DB {
    function instance( $dbconfig ) {
    switch( $dbconfig["dbdriver"] ) {
    case "mysql" :
    $DBDriver = new DBMysql( $dbconfig );
    break;

    case "postgresql" :
    $DBDriver = new DBPostgresql( $dbconfig );
    break;
    }
    return $DBDriver;
    }
    }
    ?>


    и конечно возникает вопрос, как быть с тем, что в разных базах сортировка или limit определяются по-разному… придется , по всей видимости, с регйлярными выраженями работать…
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz Ноя. 7, 2011, 10:07 д.п., спустя 7 часов 48 минут 45 секунд

    или DBConnection::query($query, $offset = 0, $limit = 0), и в зависимости от того, что передали дописывать в создаваемом запросе предел выборки/обновления/удаления непосредственно в драйвере
    Work, buy, consume, die
  • sweet15w

    Сообщения: 140 Репутация: N Группа: Кто попало

    Spritz Ноя. 7, 2011, 12:24 п.п., спустя 2 часа 17 минут 29 секунд

    для DBPostgresql::query($query)

    $query = preg_replace("/(limit) (\d){1,}, (\d){1,}/", "limit $3 offset $2", $query)




    теперь задача сделать что-то типо:
    для DBSQL::query($query)

    определения типа запроса (select)

    и еще промелькнула идея что-то типо mysql_escape_string - но только для

    $query = "insert into test values ( '1', 'test 1' )";
    чтобы регуляркой эскейпилось то, что стоит в ' ' … типо значения, записываемые в базу
    mysql_query( $query )
  • Trieg

    Сообщения: 41 Репутация: N Группа: Адекваты

    Spritz Ноя. 7, 2011, 7:42 п.п., спустя 7 часов 17 минут 28 секунд

    херня, надо делать плейсхолдеры, что то типа

    $db->query('insert into test values (?, ?)', $value1, $value2);


    или

    $db->query('insert into test values (?, ?)', array($value1, $value2));
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Ноя. 7, 2011, 8:25 п.п., спустя 43 минуты 25 секунд

    ктулху, убей всех этих людей
    не всё полезно, что в swap полезло
  • sweet15w

    Сообщения: 140 Репутация: N Группа: Кто попало

    Spritz Ноя. 8, 2011, 6:50 д.п., спустя 10 часов 24 минуты 38 секунд

    20 лет - дурачком растешь… (с)
  • Strate

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz Ноя. 10, 2011, 11:22 п.п., спустя 2 дня 16 часов 32 минуты

    Напишете щас ещё раз goDB =)
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz Ноя. 10, 2011, 11:48 п.п., спустя 26 минут 21 секунду

    master, :D
  • sweet15w

    Сообщения: 140 Репутация: N Группа: Кто попало

    Spritz Ноя. 11, 2011, 6:56 д.п., спустя 7 часов 7 минут 38 секунд

    только gpDB2 епть
  • iphine5g

    Сообщения: 221 Репутация: N Группа: Кто попало

    Spritz Ноя. 27, 2011, 10:41 п.п., спустя 16 дней 15 часов 45 минут

    ах вы говнокодеры, сбавьте пробелы $fuck -> bytch($dick) -> in_pussy();

Пожалуйста, авторизуйтесь, чтобы написать комментарий!