ОБНОВЛЕНИЕ
Изучив, как именно эта проблема реплицировалась, я обнаружил, что включил сценарий обработчика формы в оператор require_once
в своем основном сценарии обработчика зависимостей. Класс $wpdb
срабатывает только с жестко закодированным массивом значений, когда скрипт загружается на страницу администратора или общедоступную страницу веб-сайта. После того как я удалил файл из сценария зависимостей, проблема $wpdb
стала соответствовать жестко закодированным значениям или без них. Тогда я заключаю, что проблема связана с подключением этого файла (?) К остальной части WordPress, поскольку он даже не отвечает на основные функции, такие как get_header();
или get_footer();
, он действует как отдельный PHP-файл.
Я перезапустил Apache и MySQL, чтобы убедиться, что сервер обновлен.
Мой основной файл плагина содержится в /wp-content/plugins/myplugin
Содержит функцию шорткода, которая отображает форму. in /wp-content/plugins/myplugin/shortcodes/
Сценарий, вызываемый для обработки формы, находится в /wp-content/plugins/myplugin/processes/
ОРИГИНАЛЬНЫЙ ВОПРОС: wpdb INSERT работает с образцом массива, но не с идентичным $ _POSTмассив
Я создаю настраиваемую форму, которая предназначена для использования только администратором в интерфейсе. Цель этого - записать расходы в таблицу базы данных в MySQL. Я пробовал несколько способов создания запроса, используя wpdb->insert
и wpdb->prepare
, но он не работает с $_POST
superglobal.
Я создал идентичный жестко закодированный массив с именем $ sample_data, иповторение этого точно таким же образом работает. После использования различных операторов echo
и var_dump
я обнаружил, что глобальная переменная $wpdb
не запускается, если я использую $_POST
, но работает нормально, если $_POST
не включен в мой код.
Я новичок в этом, поэтому я хотел бы понять, что я делаю неправильно и почему это не работает. Любая помощь будет принята с благодарностью.
Вот настройки, с которыми я работаю:
Ubuntu 18.04.01 localhost, WordPress 5.2.4, PHP 7.2, MySQL 5.7.27, Apache 2.4.29
Единственный активный плагин, установленный в моей установке WordPress, - это тот, над которым я работаю, и я запускаю тему Underscores с применением простых стилей CSS.
Вот мой код для справки:
$table_name = $wpdb->prefix.'expenses';
if(isset($_POST['submit'])){
foreach($_POST as $post_object => $post_value){
if($post_value != NULL && $post_value !== 'submit'){
$post_object_array[] = $post_object;
$post_placeholder_array[] = '%s';
$post_value_array[] = $post_value;
}
}
$table_columns = "(".implode(', ', $post_object_array).")";
$table_placeholders = "(".implode(', ', $post_placeholder_array).")";
$query_builder = "INSERT INTO bsynfs_expenses $table_columns VALUES $table_placeholders";
$prepare_query = $wpdb->prepare($query_builder, $post_value_array);
$result = $wpdb->query($prepare_query);
}
Вот как кодируется form
на внешнем интерфейсе. Это часть шорткода .php файла в моем плагине:
<form id="add_expense" action="<?php echo($plugin_directory_url.'processes/expense-process.php'); ?>" method="post">
<input type="text" name="expense_type" value="" placeholder="expense_type">
<input type="text" name="grocery_vendor" value="" placeholder="grocery_vendor">
<input type="text" name="laundry_vendor" value="" placeholder="laundry_vendor">
<input type="text" name="product_skus" value="" placeholder="product_skus">
<input type="text" name="expense_reference" value="" placeholder="expense_reference">
<input type="text" name="expense_description" value="" placeholder="expense_description">
<input type="submit" name="submit" value="submit" id="add_expense_submit">