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

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

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

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