Вставка данных в базу данных с использованием формы

14 мар. 2013 г., 15:16:20
Просмотры: 94K
Голосов: 6

Я пишу простой плагин, который создает таблицу с именем "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) ); 
}
?> 

Но это не работает. Что мне нужно сделать, чтобы получить данные из формы и вставить их в таблицу?

7
Комментарии

Вы добавляли какой-либо префикс к таблице рассылки?

Vinod Dalvi Vinod Dalvi
14 мар. 2013 г. 15:20:48

где именно добавлять префикс? таблица в базе данных уже имеет префикс

pixelweb pixelweb
14 мар. 2013 г. 15:22:13

перед именем таблицы, потому что вы использовали $table_name = $wpdb->prefix . "newsletter"; в своём коде, что добавляет wordpress префикс перед именем таблицы newsletter. Поэтому если вы не добавляли никакого префикса к имени таблицы, используйте просто имя таблицы вот так: $table_name = "newsletter";

Vinod Dalvi Vinod Dalvi
14 мар. 2013 г. 15:35:29

Переменные name и email являются неизвестными внутри функции. Вам нужно либо определить их внутри функции, либо, если они нужны в другом месте, объявить их как globalснаружи, и внутри функции).

tfrommen tfrommen
14 мар. 2013 г. 15:37:56

@VinodDalvi : я добавил префикс для таблицы в базе данных.

pixelweb pixelweb
14 мар. 2013 г. 15:46:58

Я определил name и email внутри функции, но ничего не произошло.

pixelweb pixelweb
14 мар. 2013 г. 15:49:22

Какой префикс вы добавили к таблице? Назовите полное имя таблицы с префиксом.

Vinod Dalvi Vinod Dalvi
15 мар. 2013 г. 06:09:50
Показать остальные 2 комментариев
Все ответы на вопрос 1
12

Две переменные $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
) );
14 мар. 2013 г. 15:38:28
Комментарии

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

tfrommen tfrommen
14 мар. 2013 г. 15:40:52

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

Mike Madern Mike Madern
14 мар. 2013 г. 15:44:03

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

tfrommen tfrommen
14 мар. 2013 г. 15:55:42

Когда пользователь нажимает на кнопку отправки формы, действие формы ссылается на файл с именем: 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) ); } ?> `

Но это снова не работает. Что я делаю не так?

pixelweb pixelweb
14 мар. 2013 г. 16:00:01

Вы вызываете функцию insertuser() после её объявления?

Mike Madern Mike Madern
14 мар. 2013 г. 16:02:00

@MikeMadern мне нужно написать: 'insertuser()' после функции?

pixelweb pixelweb
14 мар. 2013 г. 16:30:32

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

Mike Madern Mike Madern
14 мар. 2013 г. 16:44:46

я использовал ваш код, но получил две ошибки: 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

pixelweb pixelweb
14 мар. 2013 г. 16:53:35

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

Mike Madern Mike Madern
14 мар. 2013 г. 17:16:01

я использовал этот код, и он отлично сработал: <?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

pixelweb pixelweb
14 мар. 2013 г. 17:23:04

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

pixelweb pixelweb
14 мар. 2013 г. 19:50:17

Я обновил ответ для вас ;)

Mike Madern Mike Madern
15 мар. 2013 г. 09:43:38
Показать остальные 7 комментариев