JaxAdam
@JaxAdam
Junior Full-Stack Developer

Как исправить ошибку Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064?

Доброго времени форумчане! Пишу пагинацию для тестового задания в одну компанию. В задаче было вывести "задачи" с возможностью сортировки по имени пользователя, email по убыванию и возрастанию с пагинацией. Так же нужно отсеивать задачи по статусу "выполнено/невыполнено/все". Написал такую функцию для вывода. Ниже прикреплю функцию getAll() в которой и есть ошибка и сам класс. Буду благодарен, если сможете помочь!
public function getTasks($page, $sortBy, $sortDirection, $status, $perPage = 3){
        $from = ($page - 1) * 3;
        $to = $page * 3;
        $totalCount = $this->db->getValue("SELECT COUNT(*) FROM `tasks`");
        $totalPages = ceil($totalCount / 3);
        $query = 'SELECT * FROM `tasks` ';
        $queryArguments = [
            'sortBy' => $sortBy,
            'sortDirection' => $sortDirection,
            'from' => $from,
            'to' => $to,
        ];
        if($status !== null){
            $query .= 'WHERE `status` = :status ';
            $queryArguments['status'] = $status;
        }
        $query .= 'ORDER BY :sortBy :sortDirection LIMIT :from, :to';
        $tasks = $this->db->getAll($query, $queryArguments);
        $tasksCount = count($tasks);
        return [
            'tasks' => $tasks,
            'pagesCount' => $totalPages,
            'totalTasksCount' => $totalCount,
            'shownTasksCount' => $tasksCount,
        ];
    }

Обертка для PDO:
<?php


namespace application\core\lib;

use PDO;

class Db
{
    protected $db;

    public function __construct()
    {
        $config = require '../application/configs/db.php';
        if (!$this->db) {
            try {
                $this->db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['name'] . '', $config['user'], $config['password']);
                $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
            } catch (\PDOException $e) {
                exit('Database connecting error: ' . $e->getMessage());
            }
        }
    }

   ........

    public function getAll($query, $parameters = array())
    {
        $statementHandle = $this->db->prepare($query);
        $statementHandle->execute((array) $parameters);
        return $statementHandle->fetchAll(PDO::FETCH_ASSOC);
    }

    .........

}

Выдает ошибку:
Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''0', '3'' at line 1 in /var/www/vhosts/jaxadam.kz/bjtst.jaxadam.kz/application/core/lib/Db.php on line 49

dump $query из первой функции:
string(70) "SELECT * FROM `tasks` ORDER BY :sortBy :sortDirection LIMIT :from, :to"
  • Вопрос задан
  • 1260 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
В общем, чтобы избавиться от этой ошибки, просто надо в пдо отключить режим эмуляции
а вот сделать сортировку будет сложнее.
по-хорошему надо вбить в функцию массив возможных вариантов и проверять по нему
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы