2011-12-22 2 views
5

Возможно ли использовать динамическое значение внутри команды SELECT FROM sql?Выберите таблицу (ОТ) по строке

Database->prepare("SELECT bomb FROM ? WHERE id=?") 
    ->execute($strTable,$strID); 

Результат:

Fatal error: Uncaught exception Exception with message Query error: 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...

+0

Я не уверен, что это связано с PHP ... – BoltClock

+0

Почему? Может ли любая команда sql напрямую обращаться к mysql без слоев между ними? – mate64

+0

Кстати, какую библиотеку вы используете? – RageZ

ответ

3

Предполагая $strTable из безопасного источника просто использовать

Database->prepare("SELECT bomb FROM $strTable WHERE id=?") 
    ->execute($strID); 
6

Номер Название таблицы не может быть параметром запроса. Вы должны были бы построить вашу строку запроса первой, сцеплению имени таблицы.

+0

это плохо. знаете ли вы обходное понятие, возможно, что вы можете поделиться? – mate64

+0

Любая подсказка, где это документировано? – Alex

+1

@msec Я дал вам обходной путь. Создайте запрос в строку и объедините имя таблицы в эту строку. –

1

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

Вы должны использовать функцию спуска вашей библиотеки и включить имя таблицы в запрос.

пример:

$tablename = escapement_function($strTable); 
Database->prepare("SELECT bomb FROM {$tablename} WHERE id=?") 
     ->execute($strID); 
2

Ваших недостающие заявления того bindParam. Я не думаю, что вы можете использовать имя таблицы, отличное от PHP-переменной, например @Alex. Вот код подготовленное заявление:

<?php 
$stmt = $dbh->prepare("SELECT bomb FROM $tablename WHERE id=:strID"); 
$stmt->bindParam(':strID', $id); 
$stmt->execute(); 
?> 

PHP Manaual Другой крупный: http://php.net/manual/en/pdo.prepared-statements.php

+0

больше sql инъекционных парней ;-) – RageZ

+0

Как? Использование параметров для sql-инъекции практически невозможно. то есть, если он не разрешает пользователю вводить имя своей таблицы, которое в этом случае должно быть взломано. «Если приложение использует исключительно подготовленные инструкции, разработчик может быть уверен, что SQL-инъекция не произойдет». – Robert

+0

как насчет $ tablename = 'foobar WHERE 1 = 1 -', так как мы не знаем, где $ tablename происходит от своего рода опасного – RageZ

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