PHP PDO запрос на выбор не возвращает результата - PullRequest
0 голосов
/ 18 октября 2018

Я создал соединение с базой данных в connection.php и включил его в insert.php.Затем расширьте класс DBConnection в конструкторе, затем создайте функцию getData (), где я выполнил запрос на выборку, пока я запускаю свой файл, я получаю только сообщение об успешном соединении.Я перепробовал все возможные варианты и искал решение по stackoverflow и другим местам, но не смог.

Это мой файл connection.php

<?php

class DBConnection
{

    private $servername;
    private $username;
    private $password;
    private $dbname;

    private $conn;

    public function __construct()
    {

        $this->servername   = "localhost";
        $this->username     = "root";
        $this->password     = "";
        $this->dbname       = "pdo_test";
        try {
            $this->conn = new PDO("mysql:host=$this->servername;dbname=$this->dbname", $this->username, $this->password);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            echo "connected successfully";
        }catch(PDOException $e){
            echo "Error: " . $e->getMessage();
        }
    }
}
?>

мой insert.php

<?php 
include('connection.php');

class insertData extends DBConnection
{
    private $conn;

    public function __construct()
    {
        $this->conn = new DBConnection();
    }

    public function getData()
    {
        $sql = "SELECT * FROM user";
        $stmt = $this->conn->prepare($sql);
        $res = $stmt->execute();
        print_r($res->fetch());
    }
}

$id = new insertData();
echo $id->getData();

?>

Может ли кто-нибудь указать мне мою ошибку в коде?Заранее спасибо

Примечание: Хотя нет никакой связи с ним, но все же для получения дополнительной информации я использую Ubuntu 18.04

1 Ответ

0 голосов
/ 18 октября 2018

Хотя я думаю, что ваша иерархия классов неверна, проблема в том, что в вашем insertData классе есть конструктор, который создает экземпляр DBConnection и присваивает его $this->conn.Поэтому, когда вы ссылаетесь на $this->conn, вы ссылаетесь на DBConnection экземпляр, а не на PDO объект.Таким образом, ваш вызов

$stmt = $this->conn->prepare($sql);

завершится неудачей, так как DBConnection не имеет prepare() метода.

Если вместо этого вы удалите конструктор и оставите его для базового класса, этосоздаст соединение и присвоит его $this->conn.Вам нужно изменить одну вещь: $conn необходимо определить как protected, чтобы позволить производному классу получить к ней доступ.

protected $conn;

Также убедитесь, что когда вы execute(), это просто возвращает, есливыполнение выполнено успешно, результат прибывает из fetch()

class insertData extends DBConnection
{
    public function getData()
    {
        $sql = "SELECT * FROM user";
        $stmt = $this->conn->prepare($sql);
        $stmt->execute();
        $res = $stmt->fetch();
        print_r($res);
    }
}

Обновление:

Чтобы проверить, что происходит, вы можете попробовать ...

ini_set('display_errors', 'On');
error_reporting(E_ALL);
$id = new insertData();
echo $id->getData();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...