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
  • Вопрос задан
  • 255 просмотров
Решения вопроса 2
DevMan
@DevMan
pdo тут вообще не при делах, это нормальное поведение субд: плейсхолдерами/переменными могут быть только аргументы, названия таблиц/колонок/etc - не могут.
чтоб это понять достаточно немного почитать как вообще работает механизм подготовленных выражений.
Ответ написан
Комментировать
abler98
@abler98
Software Engineer
Зачем понадобилось выносить имя таблицы в переменную?

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

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

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