Inserting data into a table in WordPress database

2019-03-12 16:52发布

问题:

I am starting out plugin development and have followed the tutorials on the WordPress Codex sites. I am now stuck - I have a database called "wp_imlisteningto", where the wp_ was inserted using:

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

When the plugin is activated.

The database itself has three columns, set up when the plugin is activated:

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

I am trying to insert data (by creating a new row) into this database from a php form.

Within the WordPress admin, I create a new page which has the very simple form:

<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>

Which as you can see calls formhtml.php, which is:

<?php
global $wpdb;

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

When I submit the form, I get an Error 500.0 when running the plugin in Worpdress on IIS7.0, and a "Page Not Found" when running on another web server which runs apache.

If I change formhtml.php to:

<?php

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

?>

Works fine - I get the album and artist that I put in the form. Obviously something I'm doing wrong when inserting the data (in a new row) into the database.

Any thoughts as to what that might be?

UPDATE

Ok, so if I update formhtml.php with this:

<?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' ) );
?>

I no longer get an error message, but data still doesn't get put into the database.

UPDATE 2

This worked for me:

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

as did this:

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

So, for some reason $wpdb was not working unless I required either wp-config or wp-load.php. If include wp-load.php, $wpdb gets values and all is well.

回答1:

including

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

worked for me



回答2:

Try this..

<?php
global $wpdb;

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

Ex :

<?php
global $wpdb;

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

?>


回答3:

You've probably figured this out by now, but no one addressed it here. Your sample code has '$s' in the 3rd parameter (2nd array), but that should be '%s' because it's for value-formatting. The WP Codex says [http://codex.wordpress.org/Class_Reference/wpdb] that this format parameter for $wpdb->insert() is optional.



回答4:

I think there are 2 mistakes in you sql string.

Think it should be the $table_name variable should be concatenated

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

and remove ; on the last line.