Задать вопрос
Inkognitoss
@Inkognitoss
Full-stack разработчик.

Что за полтергейст с MySql и PDO происходит, не работает prepare statment?

Создаю подключение, выполняю запрос:
$dsn = "mysql:host=$host; dbname=$db; charset=$charset";
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$PDO = new PDO($dsn, $user, $pass, $opt);
$st = $PDO->prepare("SELECT * FROM todolist");
$st->execute();
$res = $st->fetchAll();

#обретаю счастье, возвращается то, что и ожидал (печатаю массив со строками)

Но если я пытаюсь воспользоваться prepare statment
...
$name = 'todolist';
$st = $PDO->prepare("SELECT * FROM :name");
$st->execute([':name'=>$name]);
$res = $st->fetchAll();

вылетает с ошибкой
Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''todolist'' at line 1' in /var/www/site/index.php:22\nStack trace:\n#0 /var/www/site/index.php(22): PDO->prepare('SELECT * FROM '...')\n#1 {main}\n thrown in /var/www/site/index.php on line 22

я не могу понять, что происходит и куда копать. Вроде как с версией MySql всё в порядке,
Server version: 5.1.73 Source distribution
PHP 5.5.38
  • Вопрос задан
  • 256 просмотров
Подписаться 1 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 2
DevMan
@DevMan
pdo тут вообще не при делах, это нормальное поведение субд: плейсхолдерами/переменными могут быть только аргументы, названия таблиц/колонок/etc - не могут.
чтоб это понять достаточно немного почитать как вообще работает механизм подготовленных выражений.
Ответ написан
Комментировать
abler98
@abler98
Software Engineer
Зачем понадобилось выносить имя таблицы в переменную?

PDO добавляет кавычки при подстановке значений, так что для имени таблиц это не подходит.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽