PDO с bindParam () возвращает синтаксическую ошибку - PullRequest
1 голос
/ 04 июля 2019

Я делаю запрос PDO UPDATE к базе данных MariaDB.

$query = "UPDATE :table 
                        SET `name`=:name, 
                            `title`=:title,
                            `description`=:description 
                        WHERE id=:id";

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

            $stmt->bindParam(':table',$this->table, PDO::PARAM_STR);
            $stmt->bindParam(':id',$this->id, PDO::PARAM_INT);
            $stmt->bindParam(':name',$this->name, PDO::PARAM_STR);
            $stmt->bindParam(':title',$this->title, PDO::PARAM_STR);
            $stmt->bindParam(':description',$this->description, PDO::PARAM_STR);

            $stmt->execute();

Мне кажется, что все выглядит хорошо, но я получаю ошибку:

Fatal error: Uncaught PDOException: 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 ''category' SET `name`='Snowboards', ' at line 1 in C:\xampp\htdocs\supershop\public\api\models\Category.php on line 109

Если я выполняю простой SQL-запрос в phpMyAdmin, все в порядке:

UPDATE
    `category`
SET
    `name` = 'Snowboards',
    `title` = 'Title',
    `description` = 'Description'
WHERE
    `id` = 9

Что я делаю не так с этими привязками?

Ответы [ 2 ]

3 голосов
/ 04 июля 2019

Вы не можете сопоставить имена таблиц с PDO.

Вам нужно будет санировать имя таблицы и вставить в строку SQL.

"UPDATE ".$this->table."
SET `name`=:name, 
`title`=:title,
`description`=:description 
WHERE id=:id";

Вы можете увидеть котировки его размещения около 'category'

0 голосов
/ 04 июля 2019

Ошибка вызвана тем, что имя таблицы нельзя использовать в качестве параметра.Если вы хотите очистить / отфильтровать имя таблицы, вы можете сделать это вручную.

Один из способов - сохранить белый список имен таблиц в виде массива.т. е. отображение допустимых имен таблиц в массиве с ключами, которые соответствуют возможному вводу пользователя.

например,

array('u'=>users', 't'=>'table', 'c'=>comments')

Таким образом, неанализованные данные не попадут непосредственно в запрос.

Предоставлено:

...