2013-07-18 3 views
1

Вот ошибка я получаю ...Попытка узнать подготовленные операторы 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», и т.д.).

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

Заранее благодарен!

+0

Возможный дубликат [PHP \ MYSQL подготовленных операторов] (http://stackoverflow.com/questions/16057356/php-mysql-prepared-statements) – BlitZ

ответ

3

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

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.

+0

Упоминать о «динамическом SQL»? –

Смежные вопросы