无法将表传递到$wpdb->准备

时间:2011-08-12 作者:Nick Budden

我在将表变量传递到$wpdb->prepare()时遇到问题;以下是功能代码:

$table = $wpdb->get_blog_prefix( $blog_id ) . \'my_table\';

$voters = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table WHERE user_id= %d AND post_id = %d;", $user_ID, $post->ID  ));
这很有效。然而,我认为我也应该在prepare声明中包括我的表。但是,当我将其更改为以下内容时,它会断开:

$table = $wpdb->get_blog_prefix( $blog_id ) . \'my_table\';

$voters = $wpdb->get_row($wpdb->prepare("SELECT * FROM %s WHERE user_id= %d AND post_id = %d;", $table, $user_ID, $post->ID  ));
你知道为什么会破裂吗?

2 个回复
最合适的回答,由SO网友:rexposadas 整理而成

prepare()方法转义%s。您列出的第二段代码中断,因为表名中添加了引号,因此它与数据库中的内容不匹配。

第一段代码之所以有效,是因为它是一个直字符串替换,因此与数据库中表的名称相匹配。

您收到的错误消息是什么?

HTH公司

SO网友:Daithí

您需要向$wpdb类注册该表,以便可以使用如下内容:

$table = $_POST[\'table\'];
$res = $wpdb->get_results($wpdb->prepare("
SELECT * FROM {$wpdb->my_custom_table}
WHERE user_id= %d AND post_id = %d;",
array($user_ID, $post->ID  )
);
这里有一个指向nice函数的链接,当在init中调用该函数时,如果该函数不存在,将创建您的表,但将始终以您喜欢的名称注册它:

http://snipplr.com/view/52178/

这是您在该函数中需要的重要代码,(编辑了一点my me),供那些对以下内容感兴趣的人使用:

//include the wordpress db functions
require_once(ABSPATH . \'wp-admin/upgrade-functions.php\');
dbDelta($sql);

    if (!isset($wpdb->custom)) $wpdb->custom = new stdClass();
    //add the shortcut so you can use $wpdb->custom->my_table
    $wpdb->custom->$search_table = $search_table;
    $wpdb->tables[] = str_replace($wpdb->prefix, \'\', $search_table);

结束