Поддержка Проблемы и решения Добавление данных в 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, и брала бы данные для таблицы из заполненной пользователем формы на сайте?

Просмотр 15 ответов — с 1 по 15 (всего 19)
  • Немного разобрался, но есть проблема.

    Написал функцию в главном файле плагина, которая будет генерировать форму на сайте. Вставляю в сайт — отображается нормально.

    //Генерация формы для данных студентов
     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
    */

    • Ответ изменён 6 лет, 11 месяцев назад пользователем 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')
        );
    

    И кстати, модераторы прикрыли ключ к админке.
    Это всего лишь тестовая среда на пробном периоде, я таких хоть тысячу могу запустить:

    • Ответ изменён 6 лет, 11 месяцев назад пользователем Yui.
    • Ответ изменён 6 лет, 11 месяцев назад пользователем Yui. Причина: да хоть миллион. Пароли тут не оставляйте

    Проблема, возможно не в 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
    Что за аномалия господа?
    подскажите в чём может быть дело

    • Ответ изменён 6 лет, 11 месяцев назад пользователем 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 { … ` выполнялось?

    • Ответ изменён 6 лет, 11 месяцев назад пользователем miostat.

    А в чем проблема?

     $redirect = $_SERVER['HTTP_REFERER'].'?check=1';
    header("Location: $redirect");

    например форма отправлена со страницы saytfgfgdf/gggg/
    обратно у же с saytfgfgdf/gggg/?check=1

    Ну и проверку еще до этого всего сделать.

    @qwert555, работает, спасибо.
    Буду думать дальше =)

Просмотр 15 ответов — с 1 по 15 (всего 19)
  • Тема «Добавление данных в SQL-таблицу» закрыта для новых ответов.