Попытка изучить подготовленные заявления mysqli; Что я делаю не так?

Вот ошибка, которую я получаю …

Failed to prepare statement: (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 '?.Pages WHERE slug='?'' at line 1 

И вот мой код …

 require_once("../database/config.php"); $pageSlug = "home"; $db = new mysqli(_DB_HOST, _DB_USER, _DB_PASSWORD, _DB_NAME); if ( $db->connect_errno ) { echo "Failed to connect to MySQL: (" . $db->connect_errno . ") " . $db->connect_error; exit(); } if ( !$selectQuery = $db->prepare("SELECT * FROM ?.Pages WHERE slug='?'") ) { echo "Failed to prepare statement: (" . $db->errno . ") " . $db->error; exit(); } if ( !$selectQuery->bind_param("ss", _DB_NAME, $pageSlug) ) { echo "Binding parameters failed: (" . $selectQuery->errno . ") " . $selectQuery->error; exit(); } if ( !$selectQuery->execute() ) { echo "Exexute failed: (" . $selectQuery->errno . ") " . $selectQuery->error; exit(); } echo "<pre>I GOT HERE!</pre>"; exit(); 

../database/config.php просто содержит глобальные переменные, которые я упоминал выше («_DB_NAME» и т. Д.).

Наверное, я все еще просто обволакиваю эти подготовленные заявления и не знаю, что я делаю неправильно.

Заранее спасибо!

Подготовленные операторы не могут использовать параметры для предоставления идентификаторов (имена схем, имена таблиц, имена столбцов и т. Д.), Поскольку они передаются в СУБД для проверки синтаксиса перед подачей значений этих параметров.

http://php.net/mysqli-prepare

Маркеры легальны только в определенных местах в операторах SQL. Например, они разрешены в списке VALUES () оператора INSERT (для указания значений столбца для строки) или в сравнении с столбцом в предложении WHERE для указания значения сравнения. Тем не менее, они не допускаются для идентификаторов (например, имена таблиц или столбцов) в списке выбора, который именует столбцы, которые должны быть возвращены оператором SELECT, или указать оба операнда двоичного оператора, такие как знак равенства. Последнее ограничение необходимо, потому что невозможно определить тип параметра. Нельзя сравнивать маркер с NULL? IS NULL тоже. Как правило, параметры являются законными только в операторах языка манипулирования данными (DML), а не в инструкциях языка определения данных (DDL)

http://dev.mysql.com/doc/refman/5.0/en/prepare.html

Маркеры параметров могут использоваться только там, где должны отображаться значения данных, а не для ключевых слов SQL, идентификаторов и т. Д.


Тем не менее, вы можете использовать динамический SQL. Пример:

 $table = 'Example'; // Should be safe, avoid user input. $sql = "SELECT * FROM `{$table}` WHERE `id` = ?"; $stmt = $db->prepare($sql); // ... 

UPD:

Я заметил, что вы используете одиночные кавычки вокруг маркеров параметров строки. Их следует избегать, потому что dbms заботится о них сам по себе. slug='?' должен быть slug = ? ,

Читайте внимательно: http://php.net/mysqli-prepare .