@Kristina8787

Что не так тут?

Доброго дня товарищи. У меня загвоздка, есть класс Db , в нем прописано конструктором подключение , оно осуществляется, ошибки при вардампе не выдает, делаю вот такой запрос с главной страницы
require __DIR__.'/autoload.php';


$dbh = new \App\Db();
$sql = 'SELECT * FROM about';
$article = $dbh->query($sql,[]);
var_dump($article);die;


вот сам класс Db из которого берется метод запроса к БД

namespace App;

class Db
{
  protected $dbh;

  public function __construct()
  {
    $config = (include __DIR__.'/../../config.php')['db'];
    $this->dbh = new \PDO('mysql:host'.$config['host'].';dbname='.$config['dbname'], $config['login'], $config['password']);
  }

  public function execute(string $sql)
  {
    $sth = $this->dbh->prepare($sql);
    return $sth->execute();
  }

  public function query(string $sql, array $data)
  {
    $sth = $this->dbh->prepare($sql);
        if ($sth->execute($data)) {
            return $sth->fetchAll();
        } else {
            return false;
        }

  }
}


выдает false и все, хоть убей, писала до этого такой же код в другом мини-проекте - все работало прекрасно, памагити найти где я так туплю..
  • Вопрос задан
  • 441 просмотр
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Ну так ты в своем классе никому не сказала выводить ошибки. Вот он и молчит.

Вот тебе нормальный класс.
class Db
{
    public $dbh;

    public function __construct()
    {
        $config = (include __DIR__.'/../../config.php')['db'];
        $options = [
            \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
            \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
            \PDO::ATTR_EMULATE_PREPARES   => false,
        ];
        $dsn = "mysql:host=$config[host];dbname=$config[dbname];charset=utf8mb4";
        $this->dbh = new \PDO($dsn, $config['login'], $config['password'], $options);
    }

    public function query(string $sql, array $data = [])
    {
        $sth = $this->dbh->prepare($sql);
        $sth->execute($data);
        return $sth;
    }
    public function getAll(string $sql, array $data = [])
    {
        return $this->query($sql, $data)->fetchAll();
    }
}

- dbh сделана пуличной. lastInsertId() ты откуда будешь доставать?
- добавлено включение информирования об ошибках
- добавлена поддержка LIMIT
- добавлено выставление кодировки, чтобы потом не было вопросов "ой у меня крокозябры!!"
- убрана бессмысленная функция execute
- функция query сделана осмысленной и универсальной
- параметр $data сделан опциональным
- добавлена функция для получения массива строк

И запомни - создавать его надо один раз на всё приложение.

$dbh = new \App\Db();
$about = $dbh->getAll('SELECT * FROM about');
var_dump($about);die;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы