$wpdb->替换/替换或更新主键

时间:2015-02-25 作者:Mortzea

我编写代码将数据保存到数据库表中。

如果表中存在行,我想替换该行;如果该行不存在,我想在表中插入新行。

http://codex.wordpress.org/Class_Reference/wpdb

我使用$wpdb->replace 函数,然后添加$wpdb->insert_id到代码末尾。

对于更新所有字段,我使用主键替换“id”。

我将id字段添加到数组中

   $wpdb->replace( $wpdb->prefix . \'fafa\', 
   array( 
   \'id\',
   \'title\' =>  trim($row->item(0)->nodeValue) ,
   \'liveprice\' =>  trim($row->item(2)->nodeValue)  ,
   \'changing\' =>   trim($row->item(4)->nodeValue)  ,
   \'lowest\' =>   trim($row->item(6)->nodeValue)  ,
   \'topest\' =>   trim($row->item(8)->nodeValue)  ,
   \'time\' =>   trim($row->item(10)->nodeValue)   ), 
   array( 
   \'%d\',
   \'%s\',
   \'%s\',
   \'%s\',
   \'%s\',
   \'%s\',
   \'%s\'
) );
 $wpdb->insert_Id;

3 个回复
最合适的回答,由SO网友:amir rasabeh 整理而成

您可以使用此解决方案。。

How to delete all records from or empty a custom database table?

在此解决方案中,首先删除所有记录,然后插入新记录

(您的表在删除查询之前应该有记录,因为如果运行$delete,则会出现错误“No find row”),无需使用replace 我和我们insert

在函数之前添加以下查询。(此查询删除所有记录)

$delete = $wpdb->query("TRUNCATE TABLE `wp_table_name`");




$delete = $wpdb->query("TRUNCATE TABLE `wp_table_name`"); /// delete all records

   $wpdb->insert( $wpdb->prefix . \'fafa\', 
   array( 
   \'title\' =>  trim($row->item(0)->nodeValue) ,
   \'liveprice\' =>  trim($row->item(2)->nodeValue)  ,
   \'changing\' =>   trim($row->item(4)->nodeValue)  ,
   \'lowest\' =>   trim($row->item(6)->nodeValue)  ,
   \'topest\' =>   trim($row->item(8)->nodeValue)  ,
   \'time\' =>   trim($row->item(10)->nodeValue)   ), 
   array( 
   \'%s\',
   \'%s\',
   \'%s\',
   \'%s\',
   \'%s\',
   \'%s\'
) );
运行foreach

Note: 如果代码处于循环中,则应在循环之前插入此查询。

     $delete = $wpdb->query("TRUNCATE TABLE `wp_table_name`");
    foreach (){

// code

    }

SO网友:Milo

replace 仅当您提供的列值之一为primary keyunique 索引,并且该值与现有行相同。如果您的桌子既没有primary keyunique 索引时,它将始终仅插入新行。您必须首先查询现有数据,以决定是否应删除某些内容并插入新行。

看见REPLACE 有关详细信息,请参阅MySQL文档。

SO网友:Clinton

对这个问题的回答没有给出明确的答案,我看不出所选答案是正确的,因为这个问题没有提到删除表中的所有行,也没有必要截断表以替换行中的值。因此,这里有一个答案,尽管有点晚:

如果使用replace()函数,其中replace中有一个id,则表示记录may exist 首先,否则您总是直接转到insert()函数来添加新记录。因此,必须有主键(id)以外的字段来定义记录是否存在。在上面的示例中,让我们假设标题是定义是否需要新记录或记录中的字段是否需要更新的重要字段。

我总是将get\\u var()函数与replace()函数一起使用,如下所示:

首先检查记录是否存在(对于重要字段),以便将id传递给replace函数,如下所示:

$recID = $wpdb->get_var( "SELECT id FROM ".($wpdb->prefix . \'fafa\')." WHERE title LIKE ".$title."\'");
现在使用replace函数创建新记录或更新找到的$recID的字段:

$wpdb->replace( $wpdb->prefix . \'fafa\', 
   array( 
    \'id\'        => $recID,
    \'title\'     => trim($row->item(0)->nodeValue) ,
    \'liveprice\' => trim($row->item(2)->nodeValue) ,
    \'changing\'  => trim($row->item(4)->nodeValue) ,
    \'lowest\'    => trim($row->item(6)->nodeValue) ,
    \'topest\'    => trim($row->item(8)->nodeValue) ,
    \'time\'      => trim($row->item(10)->nodeValue) ), 
   array(
    \'%d\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\' )
);
最后,在replace之后,可以使用以下方法访问从AUTO\\u INCREMENT列生成的ID:

$wpdb->insert_id;
我希望这能帮助那些有类似问题的人。

结束

相关推荐

Wpdb查询当前帖子的评论元

我有一个评论元字段,显示每个评论的评分,我想知道是否有任何方法可以查询数据库,以获得每个帖子的总评分。在我的single.php, 但它显然给出了所有评论的总数。无论如何,我可以修改它,只包含来自当前帖子的评论。// set the meta_key to the appropriate custom field meta key $meta_key = \'rating_total\'; $ratingtotals = $wpdb->get_var( $wpdb->prepa