PDO::FETCH_ASSOC не возвращает значения. Я запутался между разными подходами, можете ли вы помочь мне их разрешить?

#php #mysql #list #pdo

#php #mysql #Список #pdo

Вопрос:

Я совершенно не знаком с php. Я хочу создать меню, взяв объекты из базы данных, но меня смущают все разные способы сделать это (как из школы, так и из Интернета), и мне нужно навести порядок в уме.

Это то, что я делал до сих пор, я использую для этого два разных класса.

Db.php

 class Db extends PDO {

    private $uname;
    private $passwd;
    private $hostname;
    private $dbname;

    public function __construct() {
        $this->uname = "root";
        $this->passwd = "";
        $this->hostname = "127.0.0.1";
        $this->dbname = "myclienti";

        try {
            parent::__construct('mysql:charset=utf8mb4;host=' . $this->hostname . ';dbname=' . $this->dbname, $this->uname, $this->passwd);
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }

}
  

Servizie.php

 class Servizie {
    private $codice_utente;
    private $desc_servizio;
    private $puntopresa;



    function getCodice_utente() {
        return $this->codice_utente;
    }

    function getDesc_servizio() {
        return $this->desc_servizio;
    }

    function getPuntopresa() {
        return $this->puntopresa;
    }

    function setCodice_utente($codice_utente) {
        $this->codice_utente = $codice_utente;
    }

    function setDesc_servizio($desc_servizio) {
        $this->desc_servizio = $desc_servizio;
    }

    function setPuntopresa($puntopresa) {
        $this->puntopresa = $puntopresa;
    }




    public function getAllServizie() {
        $db = new Db();

        $query = 'select CODICE_UTENTE, DESC_SERVIZIO, PUNTOPRESA from serviziele';
        $statement = $db->prepare($query);
        $statement->execute();
        $object = $statement->fetchAll(PDO::FETCH_ASSOC);
        return $object;

    }

}
  

Часть моей индексной страницы, где я хочу разместить свое меню.

        <?php
        $servizie = new Servizie();


        $list = $servizie->getAllServizie();
        echo '<div id="dropdown-contentelectr">';
        foreach ($list as $element){
            echo '<a href="#">' . $element->PUNTOPRESA . '</a>';
        }

        echo '</div>';
        ?>
  

Извините за мой английский.

Комментарии:

1. Поскольку вы выбрали ассоциативный массив, вам нужно использовать $element['PUNTOPRESA'] вместо объектной нотации.

2. Или используйте PDO::FETCH_OBJ вместо этого.

3. от serviziele мой nizzle!

4. Это работает, спасибо.

Ответ №1:

При выборке в виде ассоциативного массива вы восстанавливаете данные по индексу

 $element['PUNTOPRESA'];
  

Если вы хотите получить как класс / экземпляр, используйте:

 PDO::FETCH_INTO
PDO::FETCH_CLASS
  

Или для stdClass который возвращает анонимный объект.

 PDO::FETCH_OBJ
  

Это позволит получить доступ к свойствам выбранного объекта с обозначением стрелки.

Использование:

 statement->fetchAll(PDO::FETCH_OBJ);
  

Подробнее читайте:
http://php.net/manual/en/pdostatement .fetch.php

Если вам нужен пример класса базы данных, посмотрите на это (это часть микро-фреймворка, поэтому просто возьмите его в качестве примера, написанного мной): https://github.com/yuxblank/phackp/blob/master/src/phackp/core/Database.php

Комментарии:

1. В вашем классе есть некоторые критические ошибки. Возможно, вам пригодится эта статья, которую я написал после пересмотра десятков оболочек PHP, детских болезней вашей первой оболочки базы данных

2. Спасибо, это всего лишь альфа-версия. Я дам чтение, чтобы оптимизировать его и выпустить стабильный релиз. Если вы хотите отредактировать и опубликовать более полное решение, это нормально для меня.

3. Ну, если вы спросите меня, более полное решение было бы таким же простым, как простая функция run() отсюда: phpdelusions.net/pdo/pdo_wrapper#run Все остальное будет обработано PDO.

4. Мне это не очень нравится. Во-первых, таким образом вы все равно создаете много шаблонного кода и создаете что-то вроде фасадов (используя статические методы, одноэлементный способ), которые я бы не использовал. Каждый раз, когда вы получаете оператор, его нужно снова кодировать (так скучно!), И каждый класс должен использовать PDO, Чтобы знать о режимах выборки и т. Д. И т. Д. Мой способ (хотя еще рано) обеспечивает более понятный / быстрый способ доступа к pdo (упрощенный интерфейс). Возможно, вы потеряете некоторую производительность (не так много), но код будет меньше и больше совпадать (хотя и менее полным)

5. Вы просто не получили этот код. Никто не просит вас создавать синглтон, и никто не просит вас совместно кодировать оператор. На самом деле без режимов выборки pdo вы теряете много функций PDO, что в итоге заставляет вас писать много шаблонов. Но все в порядке — всегда требуется время, чтобы понять, что более простой код лучше, так что просто потратьте свое время.