Создание двух таблиц базы данных через плагин
-
16-10-2019 - |
Вопрос
Я работаю над плагином для голосования для своего сайта, и я хочу создать 2 таблицы: один, который хранит голоса, а другой - хранит IPS избирателей.
В Codex он предлагает использовать оператор IF, чтобы увидеть, была ли таблица уже создана при установке плагина, но как я могу изменить код, если я создаю 2 таблицы?
Это мой оператор IF в функции установки плагина, в настоящее время установленная для проверки, существует ли 1 таблица.
...
$table_name1 = $wpdb->prefix . "voters_ip";
$table_name2 = $wpdb->prefix . "vote_posts";
$installed_ver = get_option( "postvote_version" );
if($wpdb->get_var("show tables like '$table_name'") != $table_name1) { //unsure how to add both tables
$sql = "CREATE TABLE " . $table_name1 . " (
id bigint(20) NOT NULL AUTO_INCREMENT,
vote_post_id bigint(20) NOT NULL,
voter_ip varchar(100) NOT NULL,
UNIQUE KEY id (id)
);";
$sql = "CREATE TABLE " . $table_name2 . " (
id bigint(20) NOT NULL AUTO_INCREMENT,
vote_post_id bigint(20) NOT NULL,
up int(11) NOT NULL,
ddown int(11) NOT NULL,
UNIQUE KEY id (id)
);";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
add_option("postvote_version", $postvote_version);
}
....
Как правильный способ проверить, существуют ли обе таблицы?
Решение
Основные методы программирования, которые вы должны были выучить перед созданием плагина:
- Вы можете объединить проверки с && (и) и || (или же).
- Вы можете (и должны) охранять каждого
CREATE
запрос с собственной чеком
Синтаксис SQL, который вы должны были рассмотреть, прежде чем писать запросы самостоятельно:
На соответствующем примечании, пожалуйста, убедитесь, что вы удалите эти таблицы, когда плагин удален/удален.
PS: без обид. делает Похоже, вы копируете вставленные, не зная, что делает код. Пожалуйста, имейте в виду, что, делая это в плагине, вы рискуете инсталляциями других людей!
Другие советы
Я только бегнул на ваш код, но вы по крайней мере три выпуска.
Первый связан с безопасностью:
CREATE TABLE " . $table_name1 . "
Вы никогда не знаете, какую мусор может получить ваша функция, так что лучше напишите так:
CREATE TABLE `" . str_replace('`', '', $table_name1) . "`
Второе связано с SQL и уже выделено:
CREATE TABLE
Должно быть:
CREATE TABLE IF NOT EXISTS
Последнее и самое важное связано с синтаксисом PHP. Второй звонок:
$sql =
Должно быть:
$sql .=
Иначе вы никогда не создадите первую таблицу. Всегда.
Наконец, как указывалось в предыдущем сообщении, это хорошая практика, чтобы хранить версию вашего плагина или его таблиц, в какой -то степени. Это позволяет обновлять его легче, когда его собственные варианты и схема изменяются.
Если вы используете уникальные имена таблиц, вы можете с достаточной уверенностью предположить, что таблица 2 существует, если таблица 1 существует. Поэтому я бы проверил существование 1 и, если оно там, пропустите сценарии ... если это не так, запустите сценарии.
Вы также можете вывести опцию, которую вы установили для своего плагина:
- Если вариант существует (т.е.
get_option('my-voting-version')
) затем установлен ваш плагин, и вам не нужно запускать сценарии базы данных. - Если опция нет, запустите свои сценарии и установите опцию, чтобы вы не запускали их дважды.
Даже если плагин будет удален, опция останется таким, когда он будет реактивирован, вы не будете переписывать таблицы. Хранение версии базы данных и запуск сценариев на основе этого также дает вам возможность управления обновлениями. Затем вы можете выборочно запустить сценарии обновления на основе того, какая табличная версия ранее существовала для сайта.