Не получается сделать запрос с помощью PDO

Hrupin

Новичок
Я еще только изучаю ООП и PDO, пытаюсь создать класс для соединения и выполнения запросов к базе данных.


PHP:
private $_db;
    private $_dsn;
    private $_constructionSql = array();
    public $_typeDb = 'MySQL';
    private $_sql = 'SELECT `a`, `b` FROM `aaa`';
    public $_rezultArray;
    private $_rezult;
 
    
 
    function connectMySQL() {
        try {
            $this->_dsn = "mysql:host=localhost;dbname = tx";
            echo '<br>';
            echo $this->_dsn;
            echo '<br>';
            $this->_db = new PDO($this->_dsn, 'root', 'root');
            var_dump($this->_db);
        } catch (PDOException $e) {
            die("Error: " . $e->getMessage());
        }
        return $this->_db;
    }
 
    function SelectAssoc() {
        
    }
 
    function SelectNum() {
        switch ($this->_typeDb) {
            case 'MySQL':
                try {
                    $this->connectMySQL();
                    $this->_rezult = $this->_db->prepare($this->_sql);
                    echo '<br>';
                    var_dump($this->_rezult); 
                    echo '<br>';
                    $this->_rezult->execute();
                    $this->_rezult->debugDumpParams();
                    $this->_rezultArray = $this->_rezult->fetchAll();
                    echo '<br>';
                    print_r($this->_rezultArray);
                } catch (PDOException $e) {
                    die("Error: " . $e->getMessage());
                }
Выводит :

mysql:host=localhost;dbname = tx
object(PDO)#2 (0) { }
object(PDOStatement)#3 (1) { ["queryString"]=> string(26) "SELECT `a`, `b` FROM `aaa`" }
SQL: [26] SELECT `a`, `b` FROM `aaa` Params: 0
Array ( )

а ошибок ни каких не выводит.
 

Фанат

oncle terrible
Команда форума
по-моему, у тебя не класс, а какой-то треш.
но чтобы видеть ошибки, пде надо об этом сказать:
PHP:
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
 

Hrupin

Новичок
Я еще только учусь и не до конца все понимаю. Так что если вы объясните почему "треш", я буду благодарен.
 

Фанат

oncle terrible
Команда форума
если ты только учишься - не надо бежать впереди паровоза, и делать класс для работы с 100500 баз данных.
сделай для работы с одной.
при этом постарайся избежать дублирования кода.
напиши код функции SelectAssoc() и сравни его с кодом функции selectNum, если они будут совпадать чуть менее, чем полностью - подумай, как сделать более оптимально.

больше никаких замечаний сделать не могу, поскольку не понимаю смысла твоих телодвижений.
как выполняются запросы? что означает переменная $_sql = 'SELECT `a`, `b` FROM `aaa`';?
 

Hrupin

Новичок
Спасибо, справился. Пробелов лишних поставил
PHP:
$this->_dsn = "mysql:host=localhost;dbname = tx";
переменная $_sql = 'SELECT `a`, `b` FROM `aaa`'; появилась для проверки. В рабочем варианте её не будет.

Я планирую что объекту класса db будет передаваться массив с названиями столбцов таблицы в ключах и данные в значениях.
Так же планирую методы помогающие сформировать sql запрос в зависимости от присвоенных свойств объекта.

Насчет "SelectAssoc() и selectNum" уже думаю над оптимизацией.
 

Фанат

oncle terrible
Команда форума
По-моему, это полная ерунда.
Ну, то есть, ты пытаешься родить полу-ORM, полу-квери-билдер.
Но учитывая, что коннкетиться к бд ты собрался с каждым запросом, я представляю, что там будет в итоге.
я бы на твоем месте сделал сначала чего попроще.
без "массивов с названиями столбцов в ключах и данных в значениях" и без "методов, помогающих формировать".

обычно считается, что сначала покупают автомобиль, а потом - бензин. А не наоборот.
Метода для выполнения запроса у тебя нет, а метод, помогающий его формировать - уже есть.
 

Hrupin

Новичок
А что бы не коннкетиться к базе данных с каждым запросом, надо наверное сделать метод __construct и убивать соединение только по окончанию работы с базой?

Я сторонник того что если делать все проще, то учиться будет не так интересно...
 

Фанат

oncle terrible
Команда форума
ну если для тебя "проще" - это делать по порядку, а "интереснее" - это накидать кусков, и пытаться собрать из них что-то - то флаг тебе в руки.
 

Hrupin

Новичок
Я не говорю что накидать кусков это интереснее, я говорю что интереснее делать то что сложно.

А метода формирующего запрос пока только в плане.
Я сейчас отрабатываю подключение и выполнение запроса.
 

Фанат

oncle terrible
Команда форума
по большому счёту, для тебя сейчас сложно - это как раз выполнить запрос.
к примеру, я пока не увидел, как ты собрался передавать в него данные.
Судя по всему - вставляя переменные в строку запроса
 

Hrupin

Новичок
Пока я пришел к такому виду:

PHP:
    private $_dsn;
    private $_constructionSql = array();
    private $_sql = 'SELECT * FROM `aaa`';
    public $_rezultArray;
    private $_rezult;

    function __construct($typeDb) {
        global $globalConfig;
        switch ($typeDb) {
            case 'MySQL':
                try {
                    $this->_dsn = "mysql:host=" . $globalConfig['db']['MySQL']['host'] . ";dbname=" . $globalConfig['db']['MySQL']['dbName'];
                    $this->_db = new PDO($this->_dsn, $globalConfig['db']['MySQL']['user'], $globalConfig['db']['MySQL']['password']);
                } catch (PDOException $e) {
                    die("Error: " . $e->getMessage());
                }
                break;
            case 'SQLite':
                try {
                    $this->_dsn = "sqlite:" . $globalConfig['db']['SQLite']['url'];
                    $this->_db = new PDO($this->_dsn);
                } catch (PDOException $e) {
                    die("Error: " . $e->getMessage());
                }
        }
        return $this->_db;
    }

    function queryDb(){
        $this->_rezult = $this->_db->prepare($this->_sql);
        $this->_rezult->execute();
        return $this->_rezult;
    }

    function selectAssoc() {
        $this->queryDb();
        $this->_rezultArray = $this->_rezult->fetchAll(PDO::FETCH_ASSOC);
        print_r($this->_rezultArray);
        return $this->_rezultArray;
    }

    function selectNum() {
        $this->queryDb();
        $this->_rezultArray = $this->_rezult->fetchAll(PDO::FETCH_NUM);
        print_r($this->_rezultArray);
        return $this->_rezultArray;
    }
PHP:
$db = new db('MySQL');
$db->selectAssoc();
соединяется и выполняет запрос.
А построение SQL запроса я еще пока конкретно не вижу
 

Фанат

oncle terrible
Команда форума
ты заметил, что эти две функции практически дублируют друг друга? :)
 

Hrupin

Новичок
Согласен! Но когда я пытался подставлять PDO::FETCH_NUM или PDO::FETCH_ASSOC переставало работать.
А если не учитывать "с базукой на тушканчиков", совсем плохо или просто плохо?
 

Фанат

oncle terrible
Команда форума
что значит - переставало?
и что - это повод не делать правильно?

То есть, если ты начал учиться водить машину и на первом же занятии заглох - это всё, повод забросить машину и идти учить велосипед?
А если не учитывать "с базукой на тушканчиков", совсем плохо или просто плохо?
Никак.
ни одного реального запроса твоя базука пока выполнить не в состоянии.
то есть, и оценивать нечего
 

Hrupin

Новичок
Согласен.

Я подумал что так мол и должно быть...

А как это правильно реализовать?
 

Фанат

oncle terrible
Команда форума
не знаю, лично я в нумерованном результате не вижу никакого смысла.
но если бы нужно было - подставлял бы константу.
 

Hrupin

Новичок
PHP:
const FETCH_ASSOC = "PDO::FETCH_ASSOC";


 $this->_rezultArray = $this->_rezult->fetchAll(self::FETCH_ASSOC);
выдает

Warning: PDOStatement::fetchAll() expects parameter 1 to be long, string given in /home/sandro/SitesWork/library/models/db.php on line 44
 

Фанат

oncle terrible
Команда форума
синтаксис пхп тебе надо учить сначала, а не классы писать.
процитированное у нас что? какой тип данных?
 
Сверху