x_Romax
@x_Romax
Говнокодер

Почему не получается сделать запрос в базу данных PDO PHP?

Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: mode must be an integer in C:\OSPanel\domains\WorkLeader\app\models\Admin.php on line 55
( ! ) PDOException: SQLSTATE[HY000]: General error: mode must be an integer in C:\OSPanel\domains\WorkLeader\app\models\Admin.php on line 55

Выдаёт вот такую ошибку. Пытаюсь делать сайт с использованием ООП и MVC, всё было ок, но появился затык ввиде PDO. При том что в отдельном файле index.php где таким же способом всё сделано, запрос срабатывает.
Вот моя модель Model.php

<?php

namespace app\core;

use PDO;

class Model {

    public $db;

    public function __construct() {
        $option = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];
        $config = require 'app/config/db.php';
        extract($config);
        try {
            $this->db = new PDO("mysql:host=$host;dbname=$name;charset=$charset", $user, $password, $option);
        } catch (PDOException $e) {
            die("Ошибка");
        }
    }

    public function query($sql, $params = []) {
        $stmt = $this->db->prepare($sql);
        if (!empty($params)) {
            foreach ($params as $key => $val) {
                $stmt->bindValue(':'.$key, $val);
            }
        }
        $stmt->execute();
        // return $stmt;
    }
}

Файл Admin.php который наследует модель Model.php

<?php

namespace app\models;

use app\core\Model;

class Admin extends Model {

    public function jobAdd($post) {
        $params = [
            'id' => '',
            'name' => $post["name"],
            'url' => $post["url"],
            'country' => $post["country"],
            'sex' => $post["sex"],
            'salary' => $post["salary"],
        ];
        $sql = "INSERT INTO `jobs1` (`id`, `name`, `url`, `country`, `sex`, `salary`) VALUES (:id, :name, :url, :country, :sex, :salary)";
        $this->db->query($sql,$params);
    }
}

И контроллер, который вызывает модель AdminController.php

<?php

namespace app\controllers;

use app\core\Controller;

class AdminController extends Controller {
public function jobsAddAction() {
        if (!empty($_POST)) {
            if (!$this->model->jobsValidate($_POST,'add')) {
                $this->view->message('error', $this->model->error, 'Ошибка!');
            }
            $this->model->jobAdd($_POST);
            $this->view->message('success','Вакансия добавлена','Успешно!');
        }
        $this->view->render();
    }
}
  • Вопрос задан
  • 1145 просмотров
Решения вопроса 2
@DanKud
Метод ->query() не поддерживает подготовленные запросы. То есть у вас просто при этом запросе вместо замены данных все они передаются как строки. Вам сначала надо подготовить запрос с помощью ->prepare() и затем выполнить его ->execute():

$sql = "INSERT INTO `jobs1` (`id`, `name`, `url`, `country`, `sex`, `salary`) VALUES (:id, :name, :url, :country, :sex, :salary)";
$prp = $this->db->prepare($sql);
$prp->execute($params);
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
Чтобы было понятно.

Проблема в том, что админ наследует модели, а не использует её как сервис.
И в итоге обращение идет не к Model:query(), а к PDO::query().

Плюс в этом "ООП и MVC" еще примерно 100500 косяков.
Например, этот сайт ляжет, как только выйдет в продакшен, и ты перестанешь быть его единственным посетителем.

Класс Model надо переименовать в DB и сделать нормальный код соединения. Наследников у него быть не должно.
после этого создать единственный экземпляр класса, и передавать его в конструктор всем классам, которым нужна работа с БД.

Для общего развития: Детские болезни моего первого класса для работы с БД (англ.)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
VladimirAndreev
@VladimirAndreev
php web dev
C:\OSPanel\domains\WorkLeader\app\models\Admin.php on line 55
в этой строке он ждёт интеджер, а ты какую-то фигню передаешь.
Ответ написан
Ваш ответ на вопрос

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

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