Переменная связывания для дроп таблицы php - PullRequest
0 голосов
/ 14 апреля 2011

Я пишу сценарии PHP для использования с моей базой данных MySQL. Единственная проблема, которую я имею, - это привязка переменных для удаления таблицы / создания таблицы и т. Д.

    $stmt = $link->prepare("DROP TABLE ?");
    $stmt->bind_param('s','testing'); 
    $stmt->execute();

не работает. Я пробовал также:

SELECT * FROM (SELECT MAX(name) from profiles where name='testing') <- is working
DROP TABLE (SELECT MAX(name) from profiles where name='testing') <- dont work

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Привязка параметра - это не то же самое, что просто замена части строки: вы не можете просто связать все, что хотите.

В этом случае: вы не можете использовать связанный параметр для имени таблицы - вам придется использовать конкатенации строк для построения запроса вместо использования подготовленного оператора.


В качестве ссылки цитируем PREPARE Синтаксис :

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

1 голос
/ 14 апреля 2011

Насколько я знаю, вы можете связать только с параметром, а не с любой частью запроса, который вы хотите.По сути, вы говорите базе данных: «Эй, я собираюсь передать вам значение здесь, и я хочу, чтобы вы использовали свою магию, чтобы убедиться, что она не выходит за пределы».Такие вещи, как имена таблиц или имен полей, не являются значениями, они являются частью самой структуры таблицы.

В этом случае вам просто нужно использовать простое $query = "DROP TABLE " . $table;.Должно быть достаточно легко проверить список известных таблиц, чтобы убедиться, что вы не вводите ничего вредного.Насколько я понимаю, все, что вносит изменения в DDL, не должно принимать от пользователя.Эти виды изменений могут быть на основе на основе пользовательского ввода, но фактическая конструкция запроса должна быть действительно хорошо известна и не должна требовать внешних данных для построения.

Кроме того, яне совсем уверен, что вы пытаетесь сделать с этим запросом:

DROP TABLE (SELECT MAX(name) from profiles where name='testing');

Похоже, вы пытаетесь удалить запись, но это совершенно неверный синтаксис для этого.Если вы пытаетесь удалить таблицу, имя которой получено в результате другого запроса, я действительно не думаю, что вы тоже можете это сделать.Я на 99% уверен, что DROP TABLE ожидает только буквальное значение имени таблицы.

0 голосов
/ 14 апреля 2011

Вы уверены, что хотите динамически удалять таблицы?
Это чрезвычайно необычно.

Кажется, у вас неправильный дизайн базы данных.
И теперь вы столкнулись со следствием.

Похоже, вам нужно иметь одну таблицу users и удалить из нее строк , а не таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...