Вставка данных в базу данных с использованием формы
Я пишу простой плагин, который создает таблицу с именем "newsletter" в базе данных и предоставляет шорткод для размещения формы регистрации на страницах. Форма содержит поля "name" и "email". У меня проблема с вставкой данных формы (имя+email) в базу данных. Я написал это:
<?php
$name = $_POST['name'];
$email = $_POST['email'];
function insertuser(){
global $wpdb;
$table_name = $wpdb->prefix . "newsletter";
$wpdb->insert($table_name, array('name' => $name, 'email' => $email) );
}
?>
Но это не работает. Что мне нужно сделать, чтобы получить данные из формы и вставить их в таблицу?

Две переменные $name
и $email
неизвестны внутри функции. Необходимо сделать их глобально доступными внутри неё, изменив global $wpdb
на global $wpdb, $name, $email
:
require_once('../../../wp-load.php');
/**
* После комментария t f о необходимости объявления global перед переменной.
* Не обязательно (http://php.net/manual/en/language.variables.scope.php)
*/
global $name = $_POST['name'];
global $email = $_POST['email'];
function insertuser(){
global $wpdb, $name, $email;
$table_name = $wpdb->prefix . "newsletter";
$wpdb->insert($table_name, array('name' => $name, 'email' => $email) );
}
insertuser();
Либо можно передать переменные в аргументы функции:
require_once('../../../wp-load.php');
$name = $_POST['name'];
$email = $_POST['email']
function insertuser( $name, $email ) {
global $wpdb;
$table_name = $wpdb->prefix . 'newsletter';
$wpdb->insert( $table_name, array(
'name' => $name,
'email' => $email
) );
}
insertuser( $name, $email );
Или вообще без функции:
require_once('../../../wp-load.php');
global $wpdb;
$name = $_POST['name'];
$email = $_POST['email'];
$table_name = $wpdb->prefix . "newsletter";
$wpdb->insert( $table_name, array(
'name' => $name,
'email' => $email
) );

Именно это я и написал. ;) Я всё ещё не до конца разобрался, когда писать комментарий, а когда достаточно ответа. ;) Однако переменные всё равно нужно объявлять global
за пределами функции.

Ха-ха, да, я увидел твой комментарий уже после того, как опубликовал ответ :-) Моё правило комментирования/ответов: если автору вопроса нужно изменить больше одного правила в коде, всегда отвечай ;-) Я добавлю global
к переменным $name
и $email

А, окей, кажется, ты прав насчёт области видимости (потому что в данном случае за пределами функции и есть глобальная область видимости, а не класс). Однако, если ты объявляешь переменные глобальными (что ты сейчас и решил сделать), сначала нужно их объявить, а затем (в следующей строке или после точки с запятой) присвоить значение.

Когда пользователь нажимает на кнопку отправки формы, действие формы ссылается на файл с именем: regiostration-form.php. В этом файле у меня сейчас такой код:
`<?php $name = $_POST['name']; $email = $_POST['email'];
function insertuser(){ global $wpdb, $name, $email; $table_name = $wpdb->prefix . "newsletter"; $wpdb->insert($table_name, array('name' => $name, 'email' => $email) ); } ?> `
Но это снова не работает. Что я делаю не так?

определение функции не вызывает её автоматического выполнения. Чтобы выполнить функцию, её необходимо вызвать. Посмотрите код в моём ответе ;-)

я использовал ваш код, но получил две ошибки: Notice: Trying to get property of non-object in line 8
и Fatal error: Call to a member function insert() on a non-object in line 9

Это не файл, загружаемый WordPress, верно? Добавьте require
для файла wp-load.php
в начало вашего скрипта, чтобы загрузить библиотеку WordPress.

я использовал этот код, и он отлично сработал: <?php
require_once('../../../wp-load.php');
global $wpdb;
$name = $_POST['name'];
$email = $_POST['email'];
$table_name = $wpdb->prefix . "newsletter";
$wpdb->insert( $table_name, array( 'name' => $name, 'email' => $email ) );
?>
Спасибо всем, особенно Mike Madern

да, пожалуйста, обновите ответ полным ответом, тогда я приму его. Искренне
