Подтвердить что ты не робот

Вставка данных в таблицу в базе данных WordPress с использованием WordPress $ wpdb

Я начинаю разработку плагинов и слежу за учебниками на сайтах WordPress Codex. Я сейчас застрял - у меня есть база данных под названием "wp_imlisteningto", где wp_ был вставлен с использованием:

$table_name = $wpdb->prefix . "imlisteningto";

Когда плагин активирован.

Сама база данных имеет три столбца, которые настраиваются при активации плагина:

$sql = "CREATE TABLE $table_name (
id mediumint(9) AUTO_INCREMENT,
album VARCHAR(50),
artist VARCHAR(50),
PRIMARY  KEY (id)
);";

Я пытаюсь вставить данные (путем создания новой строки) в эту базу данных из php-формы.

Внутри администратора WordPress я создаю новую страницу, которая имеет очень простую форму:

<form action="/wp-content/plugins/listeningto/formhtml.php" method="post">
Album: <input type="text" name="album" />
Artist: <input type="text" name="artist" />
<input type="submit">
</form>

Который, как вы можете видеть, вызывает formhtml.php, который:

<?php
global $wpdb;

$wpdb->insert( $table_name, array( 'album' => $_POST['album'], 'artist' => $_POST['artist'] ), array( '$s', '$s' ) );
?>

Когда я отправляю форму, я получаю Error 500.0 при запуске плагина в Worpdress на IIS7.0 и "Page Not Found" при запуске на другом веб-сервере, который запускает apache.

Если я изменил formhtml.php на:

<?php

echo $_POST['album'];
echo $_POST['artist'];

?>

Хорошо работает. Я получаю альбом и исполнителя, которые я вложил в форму. Очевидно, что я ошибаюсь при вставке данных (в новую строку) в базу данных.

Какие-нибудь мысли о том, что это может быть?

ОБНОВИТЬ

Итак, если я обновляю formhtml.php следующим образом:

<?php
require_once('../../../wp-config.php');
$table_name = $wpdb->prefix . "imlisteningto";
$wpdb->insert( $table_name, array( 'album' => $_POST['album'], 'artist' => $_POST['artist'] ), array( '$s', '$s' ) );
?>

Я больше не получаю сообщение об ошибке, но данные по-прежнему не попадают в базу данных.

ОБНОВЛЕНИЕ 2

Это сработало для меня:

<?php
require_once('../../../wp-config.php');
global $wpdb;
$table_name = $wpdb->prefix . "imlisteningto";
$wpdb->insert( $table_name, array( 'album' => $_POST['album'], 'artist' => $_POST['artist'] ) );
?>

как это сделано:

<?php
require_once('../../../wp-load.php');
global $wpdb;
$table_name = $wpdb->prefix . "imlisteningto";
$wpdb->insert( $table_name, array( 'album' => $_POST['album'], 'artist' => $_POST['artist'] ) );
?>

Итак, по какой-то причине $wpdb не работал, если мне не требовалось wp-config или wp-load.php. Если включить wp-load.php, $wpdb получает значения, и все хорошо.

4b9b3361

Ответ 1

в том числе

require_once('../../../wp-config.php');

работал на меня

Ответ 2

Попробуйте это.

<?php
global $wpdb;

$wpdb->insert( $table_name, array( 'album' => "$_POST['album']", 'artist' => "$_POST['artist']" ) );
?>

Пример:

<?php
global $wpdb;

$wpdb->insert($table_name , array('chart_name' => "Line Chart" ,'chart_type' => "trends",'status' => 0));

?>

Ответ 3

Вы, наверное, догадались об этом, но никто не обратился к нему здесь. Ваш пример кода имеет "$ s" в третьем параметре (2-й массив), но это должно быть "% s", потому что оно предназначено для форматирования значений. WP Codex говорит [http://codex.wordpress.org/Class_Reference/wpdb], что этот параметр формата для $wpdb- > insert() не является обязательным.

Ответ 4

Я думаю, что в вашей sql-строке есть две ошибки.

Думаю, что должна быть конкатенирована переменная $table_name

$sql = "CREATE TABLE" . $table_name . "(
id mediumint(9) AUTO_INCREMENT,
album VARCHAR(50),
artist VARCHAR(50),
PRIMARY  KEY (id)
)";

и удалите ; в последней строке.