ФорумПрограммированиеPHP для идиотов → массив засунуть в метод класса.

массив засунуть в метод класса.

  • s_s

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

    Spritz 10 сентября 2009 г. 14:22

    с ооп только начинаю осваиваться, начал сооружать класс для mysql'a. все премудрости синтаксиса классов до конца не усвоил, вот не знаю как грамматно массив передать функции в классе…
    было так:

    /*…………….*/
    function connect()
    {
    $conn = mysql_connect(self::HOST, self::USER, self::PASS) AND
    mysql_select_db(self::DB) or
    die(mysql_error());
    return $conn;
    }
    }


    class Select extends MySQL
    {
    function select_all($COLS=array(), $table, $WHERE='')
    {
    #если строка запроса в массиве - преобразуем в строку из названий колонок
    if(is_array($COLS))
    {
    $COLS = implode(',', $COLS);
    $COLS = '`'.$COLS.'`';
    $COLS = str_replace(',', '`, `', $COLS);
    }
    #если задан массив с условиями, приводим его в SQL-строку.
    if(is_array($WHERE))
    {
    foreach($WHERE as $col => $val)
    {$where[] = "`$col` = '$val'";}
    $where = implode(' AND ', $where);
    }

    if(!isset($conn)){parent::connect();}

    $query = "SELECT $COLS FROM `$table` WHERE $where";
    $q = mysql_query($query);
    return $q;
    }

    function get_res($a, $b, $c)
    {
    $w = self::select_all($a, $b, $c);
    $sql = mysql_fetch_assoc($w);
    print_r($sql);
    }
    }

    //вызов
    $COLS = array('TITLE', 'AUTOR');
    $where = array(
    'POSTS' => 0,
    'LEVEL' => 'A');
    $c = new Select();
    $c->select_all('*', 'users', $where);

    и что поразительно как-то работало =)
    но чтоб не писать по три переменные в каждой функции решил заапгрейдить и сувать массив. работать что не удивительно перестало.
    так от не работает:
     
    /*…………….*/
    function connect()
    {
    $conn = mysql_connect(self::HOST, self::USER, self::PASS) AND
    mysql_select_db(self::DB) or
    die(mysql_error());
    return $conn;
    }
    }


    class Select extends MySQL
    {
    function select_all($sql)
    {
    #если строка запроса в массиве - преобразуем в строку из названий колонок
    if(is_array($sql[0]))
    {
    $COLS = implode(',', $sql[0]);
    $COLS = '`'.$COLS.'`';
    $COLS = str_replace(',', '`, `', $COLS);
    }
    #если задан массив с условиями, приводим его в SQL-строку.
    if(is_array($sql[2]))
    {
    foreach($sql[2] as $col => $val)
    {$where[] = "`$col` = '$val'";}
    $where = implode(' AND ', $where);
    }

    #проверить существует ли открытое соединение, если нет - создать!
    if(!isset($conn)){parent::connect();}

    $query = "SELECT $COLS FROM `$table` WHERE $where";
    $q = mysql_query($query);
    return $q;
    }

    function get_res($sql)
    {
    $w = self::select_all($sql);
    $res = mysql_fetch_assoc($w);
    print_r($res);
    }
    }

    //вызов
    $sql[] = '*';
    $sql[] = 'users';
    $sql[] = array(
    'POSTS' => 0,
    'LEVEL' => 'A');

    $d = new Select();
    $d-> get_res($sql);


    ошибка: Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in…………..
    то бишь не разбирает оно массив как хотелось бы….

    ЗЫ сорри за код(имена переменных, стиль - для себя кожу), спасибо за помощь.
  • Mr.Pihto

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

    Spritz 10 сентября 2009 г. 14:31, спустя 8 минут 46 секунд

    надо писать кодю а не кожу)
  • s_s

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

    Spritz 10 сентября 2009 г. 14:42, спустя 11 минут 45 секунд

    =) учту. и как это мне накодить?
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 10 сентября 2009 г. 15:32, спустя 49 минут 7 секунд

    код вроде нормальный, ты точно подключение делаешь перед вызовом get_res ?
    здается мне у тебя вот эта шняга не пашет parent::connect();
  • s_s

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

    Spritz 10 сентября 2009 г. 15:59, спустя 27 минут 33 секунды

    первый вариант работает, второй нет. разница только в том что передаю ф-циям. с массивом что-то не катит =(
    ошибка то в запросе вроде как не в подключении… или одно другому не мешает?
    из родительского вызывается, я не дописал…:

    $t = microtime();
    class MySQL
    {
    const HOST = "localhost";
    const USER = 'user';
    const PASS = '***';
    const DB = 'abyrvalg';

    function connect()
    {
     $conn = mysql_pconnect(self::HOST, self::USER, self::PASS) AND
       mysql_select_db(self::DB) or
       die(mysql_error());
     return $conn;
    }
    }
  • LIFF

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

    Spritz 11 сентября 2009 г. 2:59, спустя 11 часов 20 секунд

    s_s,

    вроде здесь ошибка
    $query = "SELECT $COLS FROM `$table` WHERE $where";


    $table = $sql[1];

  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 11 сентября 2009 г. 4:27, спустя 1 час 27 минут 28 секунд

    class Select extends MySQL

    у тебя какойто премудренный класс….
    все находится не там где надо…
    почему в методе селектОлл у тебя происходит коннект ?
    коннект должен устанавливатся при создании обьекта Mysql
    мне кажется, правильнее сделать какойто абстрактный класс датабейз а от него наследовать Mysql
    а вот в класе Mysql реализовать методы селекта, делита и т.д.
    примерно таким я вижу класс Mysql
    <?php

    class Mysql extends Database
    {
    protected $_host = 'localhost';
    protected $_port = 3306;
    protected $_user = 'root';
    protected $_pswd = '';
    protected $_database = 'qwerty_database';
    protected $_connection = NULL;

    public function __construct()
    {
    $this->connect();
    $this->selectDatabase();
    }

    public function connect()
    {
    if (is_null($this->_connection)) {
    $this->_connection = mysql_connect($this->_host . ':' . $this->_port, $this->_user, $this->_pswd);
    }
    }

    public function selectDatabase()
    {
    mysql_select_db($this->_database, $this->_connection);
    }

    public function query($sql)
    {
    /* your query method */
    }

    /**
    * Other methods you needed
    */
    }


    класс датабейз по сути должен выполнять всего лишь роль интерфейса…
  • s_s

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

    Spritz 11 сентября 2009 г. 17:50, спустя 13 часов 23 минуты 10 секунд

    NRG, спасибо, попробую расковырять на основе твоего кода, надеюсь разобраться… а почему таки с массивом у меня не заладилось, хотелось бы знать..
    эм… а что в абстрактном Datebase? очень туго в ооп възжаю…
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 14 сентября 2009 г. 4:08, спустя 2 дня 10 часов 17 минут

    s_s, абстрактный датабейз как я уже написал, выступает в роли интерфейса.
    т.е. обладает всеми методами присущеми для каждого адаптера ДБ.
    к примеру :
    connect()
    disconnect()
    selectDb()
    query()
    fetch()
    т.е. он носит чисто интерфейсный характер
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 14 сентября 2009 г. 4:10, спустя 2 минуты 24 секунды

    NRG, ты такой умный, милашка!
    Сапожник без сапог
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 14 сентября 2009 г. 4:21, спустя 11 минут 2 секунды


    NRG, ты такой умный, милашка!
    phpdude, ты подьебуешь или действительно мною восхищаешся ? =)
  • AndryG

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

    Spritz 14 сентября 2009 г. 4:34, спустя 13 минут 1 секунду


    т.е. обладает всеми методами присущими для каждого адаптера ДБ.

    Вы имеете ввиду
    "присущими для каждого адаптера определенной СУБД (mySQL)"
    или
    "присущими для каждого адаптера любой/большинства СУБД"?

    Если второе, то стоит более ответственно подходить к декларированию интерфейса.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 14 сентября 2009 г. 4:51, спустя 16 минут 52 секунды



    NRG, ты такой умный, милашка!
    phpdude, ты подьебуешь или действительно мною восхищаешся ? =)
    действительно!
    Сапожник без сапог
  • Lirck

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

    Spritz 14 сентября 2009 г. 7:05, спустя 2 часа 14 минут 8 секунд

    действительно подъебывает
  • s_s

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

    Spritz 14 сентября 2009 г. 9:03, спустя 1 час 58 минут 5 секунд

    NRG, спасибо. то есть надо их просто объявить:

    abstract function connect();
    abstract function disconnect();//и т.д…..

    сделал, выдаёт ошибку

    Fatal error: Declaration of Mysql::query() must be compatible with that of Database::query()
    на строке где закрывающая скобка класса Mysql О_о..
    надо же как-то ещё вызвать функции connect(), selectDatabase() перед тем как query выполнять… я в её теле так запулял, это правильно?

    function query(sql)
    {
    self::__construct();
    self::selectDatabase();
    self::connect();

    //дальше выборка сама…
    }

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