WordPress$wpdb只能工作一次

时间:2012-02-28 作者:Atif

我正在开发一个插件,它需要运行许多不同的查询。我创建了一个具有许多函数的类,所有这些函数都运行不同的查询。基本上是DAL。

现在,当我在程序中调用这些函数时,它们都可以正常工作,但只有一个运行其查询。所有其他函数调用中的所有其他查询都不会运行。

如果我只调用程序中的一个函数,所有函数都可以很好地运行查询。

我想不出是什么问题?

下面是一些代码

以下内容已在以后添加

这些才是真正给我带来麻烦的功能。

我给他们打电话,他们都在工作。但其中只有一个(最后一个)运行其查询。如果我只调用其中一个,它们都可以很好地运行查询。

class seoklaxxdataAccess{

function addKeyword_start($row_id, $row_keyword, $oldKeyword, $seo_pageContents){

    try
    {
        global $wpdb;

        $seo_tblPosts = $wpdb->prefix."posts";

        // COMMENT: gets the length of old keyword
        $org_keywordLength = strlen($oldKeyword);
        $keywordLength = $org_keywordLength+3;

        $seo_checkKeyword = substr($seo_pageContents, 0, $org_keywordLength);

        if($oldKeyword){
            if($seo_checkKeyword==$oldKeyword){

                $seo_pageContents = substr($seo_pageContents, $keywordLength);
            }
            $seo_pageContents = $row_keyword.\' - \'.$seo_pageContents;

        }else{
            $seo_pageContents = $row_keyword.\' - \'.$seo_pageContents;
        }
        //echo $seo_pageContents."<br>";
        $wpdb->update($seo_tblPosts, array(\'post_content\'=>$seo_pageContents), array(\'ID\'=>$row_id));
    }

    catch(Exception $e)
    {
        return "not working:".$e->getMessage();
    }

}

function addKeyword_end($row_id, $row_keyword, $oldKeyword, $seo_pageContents){

    global $wpdb;

    $seo_tblPosts = $wpdb->prefix."posts";

    // COMMENT: gets the length of old keyword
    $org_keywordLength = strlen($oldKeyword);
    $keywordLength = $org_keywordLength+3;

    $seo_checkKeyword_end = substr($seo_pageContents, -$org_keywordLength);

    if($oldKeyword){
        if($seo_checkKeyword_end==$oldKeyword){
            $seo_pageContents = substr($seo_pageContents,0 , -$keywordLength);
        }
        $seo_pageContents = $seo_pageContents.\' - \'.$row_keyword;

    }else{
        $seo_pageContents = $seo_pageContents.\' - \'.$row_keyword;
    }
    $seo_sqlcommand = "UPDATE ".$seo_tblPosts." SET post_content = \'".$seo_pageContents."\' WHERE ID = \'".$row_id."\' ;";
    //SELECT * FROM wp_seo_keywords WHERE id = ".$row_id.";";
    //echo "done".$seo_pageContents."<br>";
    $wpdb->get_var($wpdb->prepare($seo_sqlcommand));
}
}

我就是这样实例化这个类的

$seo_dataAccess = new seoklaxxdataAccess();
这就是我调用函数的方式

$seo_dataAccess->addKeyword_start($row_id, $row_keyword, $oldKeyword, $seo_pageContents);

$seo_dataAccess->addKeyword_end($row_id, $row_keyword, $oldKeyword, $seo_pageContents);

$seo_dataAccess->addKeyword_middle_bold_linked($row_id, $row_keyword, $oldKeyword, $seo_pageContents);

2 个回复
SO网友:Tom J Nowell

Don\'t bother using wpdb to update post content, use wp_update_post instead!

http://codex.wordpress.org/Function_Reference/wp_update_post

而不是

$wpdb->update($seo_tblPosts, array(\'post_content\'=>$seo_pageContents), array(\'ID\'=>$row_id));
做:

// Update post 37
$my_post = array();
$my_post[\'ID\'] = $row_id;
$my_post[\'post_content\'] = $seo_pageContents;

// Update the post into the database
wp_update_post( $my_post );
作为一个附带的好处,它激发了所有挂钩,因此缓存可以正常工作,RSS提要可以刷新,等等

使用wpdb操纵post表的原因非常少。使用WP核心后期编辑功能有很多很好的理由和优势。

像往常一样,通过验证清理和转义数据来练习安全的数据处理,否则自动化程序可能会测试您的站点,发现可怕的安全漏洞,并可怕地破坏一切。

SO网友:kaiser

为什么你真的要小心&在做有趣的DB东西时要全力以赴Portability - DB代码可以并且应该在任何地方都可以使用。这个wp_ 前缀只是默认值,可以在wp-config.php 由每个初学者归档。另外:建议您这样做。添加前缀将动态修改查询,并允许在具有自定义设置的环境中继续查询。

// If you\'re writing plugins, then you have to consider different installations
// as well as edge cases, customization and other funky things, your users might do
// So use the following:
echo $wpdb->posts; // Posts table
echo $wpdb->options; // Options table
echo $wpdb->users; // Users table
echo "{$wpdb->prefix}YOUR_CUSTOM_TABLE_NAME_HERE"; // Custom table
  • Security Nr. 1 - 您不希望有人误用您的查询。仅供参考:$wpdb->prepare().

    # Basically it\'s like a "safe" sprintf/printf
    // You can use %d for int and %s for strings
    $wpdb->prepare( "SELECT * FROM $wpdb->posts as p WHERE %d = p.ID", 5 );
    
  • Security Nr. 2 - 使用esc_* 获取保存输入的函数。

    // Normal queries
    $add_query_data = esc_attr( $input );
    // LIKE queries
    $add_query_data = like_escape( $input );
    
  • Security Nr. 3 - 显示错误意味着显示表名、前缀等。这是一种罕见的情况,“通过默默无闻实现安全”是一个好主意。

    // Don\'t show SQL errors to anyone except admin users (manage_options capability)
    $wpdb->hide_errors();
    if ( current_user_can( \'manage_options\' ) 
        $wpdb->show_errors();
    
    进一步阅读
  • 你好;关于$wpdb 类可以在Codex中找到。

    结束

    相关推荐

    引导WordPress多站点外站-无$wpdb

    我正在为一个系统开发一个插件,将Wordpress用作身份验证后端,这样我就可以在另一个应用程序中使用我现有的Wordpress用户。该插件在单网站模式下运行时效果很好:include /path/to/wordpress/wp-config.php global $wpdb; // SQL and code to select user and compare entered passwords 我需要这对Wordpress多站点安装以及工作。当我拉入wp配置时。对于MS站点,