Задать вопрос
@xormakor

Call to undefined function checkFields(), как исправить?

Знакомлюсь немного с PHP, делаю простенькую админку:

function add() {
    global $db;

    $errors = [];

    checkFields($data, $errors);

    if ($errors) {
        die(json_encode([
            'type' => 'error',
            'errors' => $errors
        ], JSON_UNESCAPED_UNICODE));
    }

    $category = $db->query("INSERT INTO city (name) VALUES ('{$data['name']}')");

    if ($category) {
        header("Location: adminpanel.php");
        exit();
    }
}


Fatal error: Uncaught Error: Call to undefined function checkFields() in C:\OSPanel\domains\site\category.php
Объясните проблему и пути ее решения, пожалуйста
  • Вопрос задан
  • 70 просмотров
Подписаться 1 Простой 4 комментария
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Возможно, речь идет о коде, который я как-то на ходу сочинял здесь для кого-то.
Только понятное дело, весь смысл давно улетучился, и остался голимый, эталонный карго-культ, самолеты из соломы.

Там шла речь о примитивном ORM по паттерну Table Gateway, чтобы упростить и обезопасить базовые CRUD операции.

abstract class BasicTableGateway
{
    protected $db;
    protected $table;
    protected $fields;
    protected $primary = 'id';

    public function __construct(\PDO $db)
    {
        $this->db = $db;
    }
    public function read($id): ?array
    {
        $stmt = $this->db->prepare("SELECT * FROM `$this->table` WHERE `$this->primary`=?");
        $stmt->execute([$id]);
        return $stmt->fetcn();
    }
    public function insert($data): int
    {
        $this->checkFields($data);

        $fields = '`'.implode("`,`", array_keys($data)).'`';
        $placeholders = str_repeat('?,', count($data) - 1) . '?';

        $sql = "INSERT INTO `$this->table` ($fields) VALUES ($placeholders)";
        $this->db->prepare($sql)->execute(array_values($data));

        return $this->db->lastInsertId();

    }
    // и так далее
    protected function checkFields($data)
    {
        $diff = array_diff(array_keys($data), $this->fields);
        if ($diff) {
            throw new \InvalidArgumentException("Unknown field(s): ". implode($diff));
        }
    }
}


То есть идея в том, чтобы определить все имена колонок при создании класса, так чтобы код мог проверять, что нам в ключи массива не насували лишнего

class UserGateway extends BasicTableGateway {
    protected $table = 'gw_users';
    protected $fields = ['email', 'password', 'name', 'birthday'];
}
$userGateway = new UserGateway($pdo);

$data = [
    'email' => 'foo@bar.com',
    'password' => 123,
    'name' => 'Fooster',
];
$id = $userGateway->insert($data);


Получается быстро удобно и безопасно.

Но в текущем варианте удобство, осмысленность и безопасность улетучились, остались только какие-то невнятные идеи.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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