Добавление данных в SQL-таблицу
-
Народ, нужна помощь, делаю плагин, не могу разобраться с одной штукой!
Недавно подготовил функцию для добавления данных в таблицу:
//Функция добавления строки в таблицу function doc_order_insert_item($name, $second_name, $middle_name, $dob, $doc, $quantity, $group) { global $wpdb; // подготавливаем данные (Защита от SQL-инъекций) $name = esc_sql($name); $second_name = esc_sql($second_name); $middle_name = esc_sql($middle_name); $dob = esc_sql($dob); $doc = esc_sql($doc); $quantity = esc_sql($quantity); $group = esc_sql($group); $table_name = $wpdb->get_blog_prefix() . 'table_doc_order'; // вставляем строку в таблицу $wpdb->insert( $table_name, array( 'data' => date("Y-m-d"), 'name' => $name, 'second_name' => $second_name, 'middle_name' => $middle_name, 'dob' => $dob, 'doc' => $doc, 'quantity' => $quantity, 'group' => $group, ), array('%s', '%s', '%s', '%s', '%s', '%s', '%d', '%s') ); }; // Пример вызова функции: doc_order_insert_item(Иван, Иванов, Иванович, 19-04-1989, Справка об обучении, 3, Группа-12);
Не могу понять вот что: Как сделать так, чтобы функция вызывалась с помощью кнопки html, и брала бы данные для таблицы из заполненной пользователем формы на сайте?
-
вот тут как сделать https://webformyself.com/wordpress-post-zaprosy-obrabotka/
Немного разобрался, но есть проблема.
Написал функцию в главном файле плагина, которая будет генерировать форму на сайте. Вставляю в сайт — отображается нормально.
//Генерация формы для данных студентов function doc_order_form() { echo '<form action="' . esc_url('http://devplagin.nichost.ru/wp-content/plugins/document-order/scripts/orderform.php') . '" method="post">'; echo '<label for="doc">Что заказываем:</label><br/><input type="text" name="doc" size="30"><br/>'; echo '<label for="name">Имя:</label><br/><input type="text" name="name" size="30"><br/>'; echo '<label for="second_name">Фамилия:</label><br/><input type="text" name="second_name" size="30"><br/>'; echo '<label for="middle_name">Отчество:</label><br/><input type="text" name="middle_name" size="30"><br/>'; echo '<label for="dob">Дата рождения:</label><br/><input type="text" name="dob" size="30"><br/>'; echo '<label for="quantity">Количество:</label><br/><input type="text" name="quantity" size="10"><br/>'; echo '<label for="group">Группа:</label><br/><input type="text" name="group" size="20"><br/>'; echo '<input id="ordersubmit" type="submit" value="Заказать справку"><br/></form>'; };
Также создал дополнительный файл для плагина /plugins/document-order/scripts/orderform.php
<?php //Функция добавления строки в таблицу global $wpdb; // подготавливаем данные (Защита от SQL-инъекций) $name = $_REQUEST['name']; $second_name = $_REQUEST['second_name']; $middle_name = $_REQUEST['middle_name']; $dob = $_REQUEST['dob']; $doc = $_REQUEST['doc']; $quantity = $_REQUEST['quantity']; $group = $_REQUEST['group']; $table_name = $wpdb->get_blog_prefix() . 'table_doc_order'; // вставляем строку в таблицу $wpdb->insert( $table_name, array( 'data' => date("Y-m-d"), 'name' => $name, 'second_name' => $second_name, 'middle_name' => $middle_name, 'dob' => $dob, 'doc' => $doc, 'quantity' => $quantity, 'group' => $group, ), array('%s', '%s', '%s', '%s', '%s', '%s', '%d', '%s') ); echo '<html><head><title>Форма оформления справки</title></head><body>'; echo '<p>Ваши данные отправлены!</p>'; echo '</body></html>'; ?>
Но когда нажимаю на кнопку формы «Заказать справку», перебрасывает на orderform.php и выдаёт ошибку:
Fatal error: Uncaught Error: Call to a member function get_blog_prefix() on null in /home/devplagin/devplagin.nichost.ru/docs/wp-content/plugins/document-order/scripts/orderform.php:13 Stack trace: #0 {main} thrown in /home/devplagin/devplagin.nichost.ru/docs/wp-content/plugins/document-order/scripts/orderform.php on line 13
Помогите пожалуйста, что я не так делаю?
Кстати зайдите посмотрите, если есть желание на мою тестовую среду:
http://devplagin.nichost.ru/
/*
пароли не оставляйте, это публичный форум.
В разделе «специалисты» можете найти кого-то кому в приватном общении можете все свои пароли и что угодно давать
~ Yui
*/- Ответ изменён 7 лет, 5 месяцев назад пользователем Yui. Причина: см ремарку курсивом
Добавить в начало
require_once($_SERVER['DOCUMENT_ROOT']. '/wp-load.php');
иначе функции wp работать не будут.
Да и
echo '<p>Ваши данные отправлены!</p>';
Думаю это лучше сделать на странице формы, вместо формы.
После отправки формы, нужно сделать редирект обратно на страницу и добавить get параметр к ссылке. Т.е. если гет параметр есть. то вместо формы выводим инфу «данные отправлены». Плюс это защитит от повторной отправки формы если страницу просто обновить.
@qwert555, интересно…
если гет параметр есть. то вместо формы выводим инфу «данные отправлены».
Форму я затолкал в функцию, и буду выводить в виджете.
Значит мне надо добавить ещё одну функцию с «Ваши данные отправлены». И сделать условие для вывода той или иной функции.
Я правильно мыслю?Зачем еще одну.
тут же проверкаfunction doc_order_form() { if ($_GET['check'] ==1) { echo '<p>Ваши данные отправлены!</p>'; } else { echo '<form action="' . esc_url('http://devplagin.nichost.ru/wp-content/plugins/document-order/scripts/orderform.php') . '" method="post">'; echo '<label for="doc">Что заказываем:</label><br/><input type="text" name="doc" size="30"><br/>'; echo '<label for="name">Имя:</label><br/><input type="text" name="name" size="30"><br/>'; echo '<label for="second_name">Фамилия:</label><br/><input type="text" name="second_name" size="30"><br/>'; echo '<label for="middle_name">Отчество:</label><br/><input type="text" name="middle_name" size="30"><br/>'; echo '<label for="dob">Дата рождения:</label><br/><input type="text" name="dob" size="30"><br/>'; echo '<label for="quantity">Количество:</label><br/><input type="text" name="quantity" size="10"><br/>'; echo '<label for="group">Группа:</label><br/><input type="text" name="group" size="20"><br/>'; echo '<input id="ordersubmit" type="submit" value="Заказать справку"><br/></form>'; } };
Зачем еще одну
Хорошо, попробую обновить.@qwert555, посмотрите пожалуйста, есть ещё загвоздка, не отображаются данные в html-таблице в админке плагина:
За вывод отвечает функция в главном файле плагина:
//Генерация страницы в админке function doc_order_page() { global $wpdb; if ( !current_user_can( 'manage_options' ) ) { wp_die( __( 'You do not have sufficient permissions to access this page.' ) ); }; echo '<div class="doc_order_admin">'; echo 'Here is where the form would go if I actually had options.'; echo '<table border=1>'; echo '<tr>'; echo '<th>ДАТА</th> <th>ИМЯ</th> <th>ФАМИЛИЯ</th> <th>ОТЧЕСТВО</th> <th>ДАТА РОЖДЕНИЯ</th> <th>ЧТО ЗАКАЗЫВАЕМ</th> <th>КОЛИЧЕСТВО</th> <th>ГРУППА</th>'; echo '</tr>'; $table_content = $wpdb->get_results("SELECT data, name, second_name, middle_name, dob, doc, quantity, group FROM $wpdb->prefix . 'table_doc_order'"); foreach ($table_content as $table_content) { echo '<tr>'; echo '<td>' . $table_content->data . '</td><td>' . $table_content->name . '</td><td>' . $table_content->second_name . '</td><td>' . $table_content->middle_name . '</td><td>' . $table_content->dob . '</td><td>' . $table_content->doc . '</td><td>' . $table_content->quantity . '</td><td>' . $table_content->group . '</td><td>'; echo '</tr>'; }; echo '</table>'; echo '</div>'; };
Может я неправильно понимаю значение foreach
Или может проблема возникает при добавлении данных в таблицу. Вот алгоритм добавления данных в таблицу. Находится в дополнительном файле плагина. На неё и ссылается форма:
require_once($_SERVER['DOCUMENT_ROOT']. '/wp-load.php'); // Добавление строки в таблицу global $wpdb; // подготавливаем данные (Защита от SQL-инъекций) $name = esc_sql($_REQUEST['name']); $second_name = esc_sql($_REQUEST['second_name']); $middle_name = esc_sql($_REQUEST['middle_name']); $dob = esc_sql($_REQUEST['dob']); $doc = esc_sql($_REQUEST['doc']); $quantity = esc_sql($_REQUEST['quantity']); $group = esc_sql($_REQUEST['group']); $table_name = $wpdb->get_blog_prefix() . 'table_doc_order'; // вставляем строку в таблицу $wpdb->insert( $table_name, array( 'data' => date("Y-m-d"), 'name' => $name, 'second_name' => $second_name, 'middle_name' => $middle_name, 'dob' => $dob, 'doc' => $doc, 'quantity' => $quantity, 'group' => $group, ), array('%s', '%s', '%s', '%s', '%s', '%s', '%d', '%s') );
И кстати, модераторы прикрыли ключ к админке.
Это всего лишь тестовая среда на пробном периоде, я таких хоть тысячу могу запустить:Проблема, возможно не в foreach
Я проверил базу данных, но таблицы плагина там не оказалось =/
Функция плагина прикреплённая к хуку активации не создаёт таблицу в базе данных:add_option("doc_order_version", "1.0"); // версия плагина register_activation_hook(__FILE__, 'doc_order_install'); register_deactivation_hook(__FILE__, 'doc_order_uninstall'); function doc_order_install() { global $wpdb; $table_name = $wpdb->prefix . 'table_doc_order'; // Генерация таблицы с данными для справок if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) { $sql = "CREATE TABLE " . $table_name . " ( id mediumint(9) NOT NULL AUTO_INCREMENT, data DATE NOT NULL, name TINYTEXT NOT NULL, second_name TINYTEXT NOT NULL, middle_name TINYTEXT NOT NULL, dob DATE NOT NULL, doc TINYTEXT NOT NULL, quantity TINYINT(2) NOT NULL, group TINYTEXT NOT NULL, UNIQUE KEY id (id) );"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); }; }; //Удаление данных плагина function doc_order_uninstall () { global $wpdb, $table_doc_order; delete_option('doc_order_version'); $sql = "DROP TABLE $table_doc_order"; $wpdb->query($sql); };
Теперь надо смотреть что здесь не так)
Создал таблицу через phpmyadmin
Но foreach всё равно не сработал, чуть чуть видоизменил алгоритм функции://Генерация страницы в админке function doc_order_page() { global $wpdb; if ( !current_user_can( 'manage_options' ) ) { wp_die( __( 'You do not have sufficient permissions to access this page.' ) ); }; echo '<div class="doc_order_admin">'; echo 'Here is where the form would go if I actually had options.'; echo '<table border=1>'; echo '<tr>'; echo '<th>ДАТА</th> <th>ИМЯ</th> <th>ФАМИЛИЯ</th> <th>ОТЧЕСТВО</th> <th>ДАТА РОЖДЕНИЯ</th> <th>ЧТО ЗАКАЗЫВАЕМ</th> <th>КОЛИЧЕСТВО</th> <th>ГРУППА</th>'; echo '</tr>'; echo 'Есть результат?'; $sql= 'SELECT * FROM' .$wpdb->base_prefix. 'table_doc_order'; $table_content = $wpdb->get_results($sql, ARRAY_A); foreach ($table_content as $content) { echo '<tr>'; echo '<td>' . $content['data'] . '</td><td>' . $content['name'] . '</td><td>' . $content['second_name'] . '</td><td>' . $content['middle_name'] . '</td><td>' . $content['dob'] . '</td><td>' . $content['doc'] . '</td><td>' . $content['quantity'] . '</td><td>' . $content['group'] . '</td>'; echo '</tr>'; }; echo '</table>'; echo '</div>'; unset($table_content); };
Заметил такую штуку. Алгоритм работает когда я вручную прописываю название таблицы (cms_wp_doc_order) вместо .$wpdb->base_prefix / $wpdb->prefix
Что за аномалия господа?
подскажите в чём может быть дело- Ответ изменён 7 лет, 5 месяцев назад пользователем miostat.
$wpdb->base_prefix. 'table_doc_order'
иcms_wp_doc_order
совсем не похожи.Оказалось был пропущен пробел после FROM:
$sql= 'SELECT * FROM'
Теперь foreach работает.
Но я всё же не смог разобраться, почему сама таблица не создаётся:function doc_order_install() { require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); global $wpdb; $table_name = $wpdb->prefix . 'table_doc_order'; // Генерация таблицы с данными для справок $sql = 'CREATE TABLE ' . $table_name . ' ( id mediumint(9) NOT NULL AUTO_INCREMENT, data DATE NOT NULL, name TEXT NOT NULL, second_name TEXT NOT NULL, middle_name TEXT NOT NULL, dob DATE NOT NULL, doc TEXT NOT NULL, quantity TINYINT(2) NOT NULL, group TEXT NOT NULL, UNIQUE KEY id (id) );'; dbDelta($sql); };
https://wp-kama.ru/function/wpdb
спасибо за ссылку, немного разобрался с этим методом.Дело оказалось мелочным:
Вместо group нужно было вставить другое название столбца.
С этим названием, почему то, функция не хочет работать.
Ну да ладно, я двигаюсь дальше…
Теперь нужно разобраться, как устроить так, чтобы введённые данные ещё и отправлялись на почту администратора@qwert555, расскажите пожалуйста об этом методе подробнее.
нужно сделать редирект обратно на страницу и добавить get параметр к ссылке.
Для редиректа я добавлю вот это:
$redirect = isset($_SERVER['HTTP_REFERER'])? $_SERVER['HTTP_REFERER']:'redirect-form.html'; header("Location: $redirect"); exit();
Но как сделать это:
добавить get параметр к ссылке.
чтобы условие `… if ($_GET[‘check’] ==1) {
echo ‘<p>Ваши данные отправлены!</p>’;} else { … ` выполнялось?
- Ответ изменён 7 лет, 5 месяцев назад пользователем miostat.
А в чем проблема?
$redirect = $_SERVER['HTTP_REFERER'].'?check=1'; header("Location: $redirect");
например форма отправлена со страницы saytfgfgdf/gggg/
обратно у же с saytfgfgdf/gggg/?check=1Ну и проверку еще до этого всего сделать.
@qwert555, работает, спасибо.
Буду думать дальше =)
- Тема «Добавление данных в SQL-таблицу» закрыта для новых ответов.