База данных возвращает только первую строку - PullRequest
0 голосов
/ 25 мая 2018

Это довольно странно, но когда я выполняю запрос «SELECT * FORM table», он возвращает только первую строку, но когда я выполняю «SELECT * FORM table WHERE id = 2», я получаю вторую строку.Может кто-нибудь, пожалуйста, помогите мне с этим?

Вот мой код: DB class,

class DB
{
    private static $_instance = null;
    private $_conn,
        $_query,
        $_error = false,
        $_result,
        $_count = 0;

    /**
     *
     */
    private function __construct()
    {
        $servername = Config::get("mysql/host");
        $username   = Config::get("mysql/username");
        $password   = Config::get("mysql/password");
        $database   = Config::get("mysql/db");

        $this->_conn = new mysqli($servername, $username, $password, $database);
    }


    public static function getInstance()
    {
        if(!isset(self::$_instance)){
            self::$_instance = new DB;
        }
        return self::$_instance;
    }


    public function query($sql)
    {
        $this->_error = false;

        if ($this->_query = $this->_conn->query($sql)) {
            $this->_result = $this->_query->fetch_object();
            $this->_count = $this->_query->num_rows;
        } else {
            $this->_error = true;
        }

        return $this;
    }

    private function action($action, $table, $where = array())
    {
        if(count($where) === 3) {
            $operators = array('=', '>', '<', '>=', '<=');

            $field      = $where[0];
            $operator   = $where[1];
            $value      = $where[2];

            if(in_array($operator, $operators)) {
                $sql = "{$action} FROM {$table} WHERE {$field} {$operator} '{$value}'";

                if (!$this->query($sql)->error()) {
                    return $this;
                }
            }
        } elseif (count($where) === 0) {
            $sql = "{$action} FROM {$table}";

            if (!$this->query($sql)->error()) {
                return $this;
            }
        }

        return false;
    }

    public function get($table, $where = array())
    {
        return $this->action("SELECT *", $table, $where);
    }

Index.php,

    $db = DB::getInstance();
    $results1 = $db->get('pages')->results();
    $results2 = $db->get('pages', ["id", "=", 2])->results();

    var_dump($results1); // Returns first row
    var_dump($results2); // Returns second row

Это странная вещь, на мой взгляд,$ result1 должен вернуть все строки, верно?Я ожидаю, что это как-то связано с -> fetch_object в методе запроса из класса DB.Я искал там проблему, но не смог ее найти, и поэтому php.net метод fetch_object может возвращать более одной строки.У кого-то есть идеи, и может ли он мне помочь?

ОБНОВЛЕНИЕ: когда я запрашиваю счет, он возвращает правильное количество строк в базе данных, но все равно не будетнаходиться в свойстве $ _result

1 Ответ

0 голосов
/ 25 мая 2018

Вы вызываете только fetch_object один раз.

mysqli_fetch_object () вернет текущий ряд результирующий набор как объект, где атрибутыобъект представляет собой имена полей, найденных в наборе результатов.

Согласно документации…

while ($obj = $result->fetch_object()) {
    printf ("%s (%s)\n", $obj->Name, $obj->CountryCode);
}

… вам необходимо вызвать его вцикл, пока больше нет объектов для извлечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...