Вопрос или проблема
Можно ли создать таблицу с помощью функции wpdb::prepare
?
Я прочитал документацию и пытался найти примеры, но ни один из них не помог мне.
Даже создание таблицы с помощью prepare не дало мне полезных примеров в Google.
В настоящее время я создаю свою таблицу вот так:
public function createTableFromFields( $tablename, $fields ) {
//
$wpdb = $this->db;
$tablename = $wpdb->prefix . $tablename;
$sql="CREATE TABLE IF NOT EXISTS " . $tablename . ' (id INT(6) UNSIGNED
AUTO_INCREMENT PRIMARY KEY';
foreach ( $fields as $field ) {
$sql .= ", $field TEXT";
}
$sql .= ')';
$result = $wpdb->query( $sql );
return $result;
}
Но я узнал, что просто используя
$wpdb->query($sql)
небезопасно, и вместо этого следует делать это с помощью
$wpdb->query(prepare($sql, $args).
Итак, что я должен положить в $args
здесь и каков будет SQL код, используя строковые форматы запроса?
Я попробовал это локально, и, думаю, у вас несколько полей внутри $fields
, поэтому я добавил их в массив.
Просто посмотрите на код ниже; он работает хорошо, как было протестировано:
add_action('your_hook', 'createTableFromFields');
function createTableFromFields($tablename)
{
$wpdb = $this->db;
$tablename = $wpdb->prefix . $tablename;
$fields = array('PersonID','LastName');
$sql="CREATE TABLE IF NOT EXISTS %s (id INT(6) UNSIGNED
AUTO_INCREMENT PRIMARY KEY";
$test = array();
foreach ($fields as $field) {
$test[] = $field." TEXT";
}
$t = implode(",", $test);
$sql .= ",%s)";
$result = $wpdb->query($wpdb->prepare(sprintf($sql, $tablename, $t)));
return $result;
}
Ответ или решение
Создание таблицы в базе данных WordPress с использованием функции wpdb::prepare
может быть немного запутанным, так как эта функция предназначена для подготовки SQL-запросов, а не для структурирования DDL-команд, таких как CREATE TABLE
. Однако, мы можем использовать её вместе с sprintf()
для безопасного формирования запросов.
Ваш предложенный код уже правильно иллюстрирует использование функции prepare
. Давайте рассмотрим его более подробно и немного адаптируем для лучшего понимания.
Оптимизированный код для создания таблицы
add_action('your_hook', 'createTableFromFields');
function createTableFromFields($tablename)
{
global $wpdb; // Используем глобальную переменную $wpdb
$tablename = $wpdb->prefix . $tablename; // Добавляем префикс таблицы
$fields = array('PersonID', 'LastName'); // Определяем поля таблицы
$sql = "CREATE TABLE IF NOT EXISTS %s (id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY"; // Начало SQL-запроса
// Массив для хранения определений полей
$field_definitions = array();
foreach ($fields as $field) {
$field_definitions[] = $field . " TEXT"; // Добавляем каждый элемент, приводя к нужному формату
}
// Объединяем все определения полей в строку, разделяем запятыми
$field_string = implode(", ", $field_definitions);
$sql .= ", " . $field_string . ")"; // Добавляем определения полей к запросу
// Используем prepare с sprintf для безопасности
$result = $wpdb->query($wpdb->prepare(sprintf($sql, $tablename)));
return $result; // Возвращаем результат выполнения запроса
}
Объяснение кода
-
Глобальная переменная
$wpdb
: Мы используемglobal $wpdb;
для доступа к объекту базы данных WordPress. Это позволяет нам выполнять запросы к базе данных. -
Формирование имени таблицы:
tablename = $wpdb->prefix . $tablename;
добавляет стандартный префикс, к которому мы добавляем название таблицы, тем самым обеспечивая уникальность идентификатора таблицы и соответствие стандартам WordPress. -
Определение структуры таблицы: Основной момент здесь — мы создаем SQL-строку для создания таблицы, используя индикатор
%s
в строке SQL, чтобы безопасно вставить имя таблицы. -
Формирование полей таблицы: Мы используем массив
$field_definitions
, чтобы собрать все поля, которые мы хотим добавить в таблицу, а затем объединяем их с помощьюimplode(", ", $field_definitions)
. -
Безопасное выполнение запроса: Мы используем
sprintf()
вместе с$wpdb->prepare()
для безопасной вставки данных в SQL-запрос. Таким образом, если в имени таблицы присутствуют потенциально опасные символы, они будут обработаны корректно.
Заключение
Таким образом, ваш код правильно демонстрирует создание таблицы с использованием функции wpdb::prepare
, что делает код более безопасным. Будьте уверены, что при создании элементов таблицы учитываются возможные SQL инъекции. Кроме того, важно понимать, что wpdb::prepare
не всегда нужен для DDL (Data Definition Language) языков, таких как CREATE TABLE
, но использование его делает код более безопасным.