wpdb->使用prepare()插入自定义wp表

时间:2014-06-22 08:01:28

标签: mysql wordpress insert wpdb prepare

在Wordpress中使用时间系统,并在插入自定义表时遇到wp插入的奇怪问题。

我在functions.php中运行以下函数

function clock_in() {

if ( isset( $_POST['punch-in'] ) && '1' == $_POST['punch-in'] ) {

    $user_id = get_current_user_id();

    global $wpdb;
    $wpdb->query( $wpdb->prepare(
                    "
                        INSERT INTO $wpdb->wp_diss_users_sessions
                        (session_id,session_begin)
                        VALUES ( %d, %s )
                    ", 
                        $user_id,'test' 

) );

我已经使用对wp_users表的更新查询来测试该函数,以验证函数是否根据需要正确触发。

我收到的错误如下:

WordPress database error: [You have an error in your SQL syntax;
check the manual that     corresponds to your MySQL server version 
for the right syntax to use near 
'(session_id,session_begin) VALUES ( 2, 'test' )' at line 2]
INSERT INTO (session_id,session_begin) VALUES ( 2, 'test' )

我的表是这样设计的:

[session_id] - INT(11) PK NN
[session_begin] - VARCHAR(45)

我理解最佳做法是使用prepare,所以我正在尝试适当地构建所有查询。我相信$ wpdb-> wp_diss_users_sessions =正确的语法来引用我的自定义表进行研究。也许我忽略了一些简单的事情,但今晚我的头疼。

全部谢谢

1 个答案:

答案 0 :(得分:1)

您收到错误是因为您的查询中没有表名:

INSERT INTO (session_id,session_begin) VALUES ( 2, 'test' )
            ^ here should be a table name

只使用$wpdb->wp_diss_users_sessions将无效,您的表名将不会神奇地出现在wpdb对象中。你必须自己存放它。

this thread in the WordPress support forum中,建议在插件/主题的函数中添加它:

$wpdb->myplugintable = $table_prefix . 'myplugintable';

如果您将其放在一个函数中,请不要忘记使用$table_prefix关键字在其范围内提取global

之后,您可以按照预期的方式访问表名。