Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php $wpdb是全局的,但为null_Php_Mysql_Database_Wordpress - Fatal编程技术网

Php $wpdb是全局的,但为null

Php $wpdb是全局的,但为null,php,mysql,database,wordpress,Php,Mysql,Database,Wordpress,我正在开发一个插件,需要创建一个数据库并向其中插入数据,我已经完成了表创建部分,但是每当我尝试使用$wpdb插入数据时,就会出现一个错误,说明无法对空对象调用insert() 以下是一个最低版本: <?php /* Plugin Name: Test */ function activation() { global $wpdb; $table_name = $wpdb->prefix . 'testing'; $charset_collate = $wpd

我正在开发一个插件,需要创建一个数据库并向其中插入数据,我已经完成了表创建部分,但是每当我尝试使用
$wpdb
插入数据时,就会出现一个错误,说明无法对空对象调用
insert()

以下是一个最低版本:

<?php
/*
Plugin Name: Test
*/

function activation() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'testing';
    $charset_collate = $wpdb->get_charset_collate();

    # create table
    if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
        $sql = "CREATE TABLE " . $table_name . " (
          id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
          name TEXT NOT NULL,
          PRIMARY KEY  (id)
        ) " . $charset_collate . ";";

        require_once(ABSPATH . "wp-admin/includes/upgrade.php");
        dbDelta($sql);
    }
}

function html($atts) {
    $out = "";
    return "<form action='wp-content/plugins/test/submit.php' method='post'><input type='text' name='name'><input type='submit' name='submit'></form>";
}

# setup and cleanup hooks
register_activation_hook(__FILE__, "activation");
add_shortcode('testing', 'html');
修复
如果您在不加载WordPress的情况下将表单直接发布到PHP文件,则除非您需要
wp load.PHP
,否则它的任何函数都将不可用。这就是为什么未定义
add_action
$wpdb
的原因

请参阅下面的评论和原始答案,了解详细信息以及在WordPress中发布表单的其他方式

原始答案 您似乎没有将
handle()
函数绑定到任何钩子,因此它在WordPress包含必要文件时加载并运行,但在它实际加载
$wpdb
之前。这就是为什么$wpdb没有被定义——它还不存在。试试这个:

<?php
function handle() {
  global $wpdb;

  if( isset( $_POST[ 'submit' ] ) ){
    $wpdb->insert( 'wp_testing', array( 'name' => 'test' ) );
  }
}

//handle();
add_action( 'init', 'handle' );


名称仅用于这个最小的示例,我在实际项目中有更多唯一的名称。这样做会导致调用未定义函数add\u action()
时出现此错误。只有在提交表单时才应该运行此文件,因此全局文件不会在该点加载吗?如果
add\u action
未定义,WordPress不会加载,这是其他地方的问题。是的,使用钩子意味着它在每个页面加载上都进行全局监听,但是当表单提交时,if语句会告诉它运行。不全局侦听的唯一方法是将其切换到ajax调用,并通过ajax发布表单。因此,通过添加
require('path/to/wp load.php')并切换回只运行
handle()`我让它开始工作。如果我用
add_action
尝试它,该函数从未执行过。这意味着WordPress没有正确加载。这是你正在创建的插件吗?如果是的话,你是通过WordPress测试它还是试图直接访问php文件?我已经安装了WampServer,正在运行WordPress
<?php
function handle() {
  global $wpdb;

  if( isset( $_POST[ 'submit' ] ) ){
    $wpdb->insert( 'wp_testing', array( 'name' => 'test' ) );
  }
}

//handle();
add_action( 'init', 'handle' );
<?php
function jacob_morris_handle() {
  global $wpdb;

  if( isset( $_POST[ 'submit' ] ) ){
    $wpdb->insert( 'wp_testing', array( 'name' => 'test' ) );
  }
}

//handle();
add_action( 'init', 'jacob_morris_handle' );
<?php
class JacobMorris {
  function handle() {
    global $wpdb;

    if( isset( $_POST[ 'submit' ] ) ){
      $wpdb->insert( 'wp_testing', array( 'name' => 'test' ) );
    }
  }

  function __construct(){
    add_action( 'init', array( $this, 'handle' ) );
  }
}
new JacobMorris();