Использование плейсхолдеров для имен полей в PHP
Хочу сделать универсальный запрос на создание таблицы, чтобы указывалось, название таблицы, и массив вида:
array(
'ID' => array("ID", "INT", null, "NOT", null, 'AUTO_INCREMENT' , 'PRIMARY KEY (`id`)'),
'FIELD_NAME' => array("FIELD_NAME", "TEXT", 20, "NOT", null),
'FIELD_NAME2' => array("TEXT", 50, "NOT", NULL)
);
Где
ID - ключ поля
само поле состоит из массива:
array(
"ID", //назвaние поля
"INT", //тип поля
null, //ограничение по количеству символов, если есть
"NOT", //поле не может содержать пустое значение
null, //не автоинкремент
'AUTO_INCREMENT', //автоинкремент
'PRIMARY KEY (`id`)' //поле для автоинкремента
);
Но не понимаю как теперь в подобном запросе
$query = "CREATE TABLE `zvit`. `" . $name . "` ( `id` INT NOT NULL AUTO_INCREMENT , `test1` INT NOT NULL , `text` TEXT NOT NULL , `date` DATE NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;";
применить плейсхолдеры, и как они в целом должны применятся, с учетом реализации выше? И возможно ли вообще написать подобный универсальный запрос?
Я отлично знаю что есть ORM написанные людьми умнее чем я. Все это пилится ради повышения скиллов и понимания.
Ответы (1 шт):
Плейсхолдеры в базах данных может применяться только для строк и чисел.
Это связано с тем, что исходно подготовленные выражения планировалось использовать для оптимизации запросов, когда prepare() один раз готовит план запроса, а потом по этому плану будет выполнятся множество одинаковых запросов. Если же добавить в prepare() переменное имя поля, то план запроса построить будет нельзя, и смысл в подготовке потеряется.
Я согласен, чтосейчас, когда подготовленные выражения используются в основном для правильного форматирования запросов, было бы логично добавить плейсхолдер для имён полей, но пока это ещё никто не придумал.
Так что тебе остаётся только валидировать имена полей для генератора запросов вручную. Скажем, регулярка, которая проверяет ключи массива на включение символов, отличных от латинских букв и подчеркивания, [^a-z_].