WordPress 数据库操作

wpdb 类

wpdb类封装了所有的数据库操作函数,它是基于开源的数据库操作类ezSQL进行修改的,使其更适合于WordPress,也使其仅适用于mySQL数据库。

同时,WordPress还提供了一个全局变量$wpdb,并将其实例化为wpdb类的对象。

这样我们就可以直接使用$wpdb来调用所有的数据库操作函数。

注意 使用前 一定要 global $wpdb;

query 函数

最常用的函数,$query为SQL语句,提交给数据库执行,结果分两种情况:

如果是insert、delete、update、replace, 返回受影响行数,在insert、replace这种情况下,该函数会用$this->insert_id记 录下新插入的ID。 如果是“select”,该会用$this->last_result记录下查询到结果集,返回查询到的记录行数。 如果出错,则返回FALSE。

实例:

global $wpdb;
$wpdb->query(
  "
  UPDATE $wpdb->posts
  SET post_parent = 7
  WHERE ID = 15 AND post_status = 'static'
  "
);

prepare 函数

这是一个可变参数函数。在 SQL 语句中,可以包含像%s、%d和%f这样的占位符,其它所有非占位符里面的%都要使用%%来代替。由于SQL语句中可能含有像单引号、双引号这样的特殊字符,如果不进行处理就直接提交给数据库,可能会导致错误或者出现安全问题。为此,我们可以通过prepare函数来对SQL语句进行。

用法:

$sql = $wpdb->prepare( 'query' [, value_parameter, value_parameter ...] );

实例:

$metakey = 'Funny Phrases';
$metavalue = "WordPress' database interface is like Sunday Morning: Easy.";

$wpdb->query($wpdb->prepare(
    "
        INSERT INTO {$wpdb->prefix}postmeta
        ( post_id, meta_key, meta_value )
        VALUES ( %d, %s, %s )
    ",
    array(
        10,
        $metakey,
        $metavalue,
    )
));

insert 函数

insert( $table, $data, $format );

插入一行到表中,第一个参数是表名,第二个是数据数组,第三个用于规定$data中每个值的数据类型。 该函数返回影响的数据条数(成功的话,会是1) 如果有一个名为ID的自增主键,插入成功之后,使用 $wpdb->insert_id 可以获取插入成功的ID。

示例:

$wpdb->insert(
  'table',
  array(
    'column1' => 'value1',
    'column2' => 123
  ),
  array(
    '%s',
    '%d'
  )
);

update函数

更新记录,第一个参数是表的字段数组,第二个是数据数组,第三个是条件数组,第四个和第五个分别用于规定$和$where中每个值的数据类型。 更新失败的话返回 false,更新成功的话,返回受影响的记录数。

实例:

$wpdb->update( 
    'table', 
    array( 
        'column1' => 'value1',   // string
        'column2' => 'value2'    // integer (number) 
    ), 
    array( 'ID' => 1 ), 
    array( 
        '%s',   // value1
        '%d'    // value2
    ), 
    array( '%d' ) 
);

delete 函数

这个函数用来删除表中的记录,执行失败的话返回 false,更新成功的话,返回受影响的记录数。

// Default usage.
$wpdb->delete( 'table', array( 'ID' => 1 ) );
// Using where formatting.
$wpdb->delete( 'table', array( 'ID' => 1 ), array( '%d' ) );

get_var函数

这个只返回一个值,默认是第0行第0列。如果$query不为空,首先执行查询,如果$query为空的话,则表示从cache中选出;然后返回第X列第Y行的值。

实例:

$user_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->users;") );
echo "<p>User count is {$user_count}</p>";

get_row函数

返回一行,$output指定返回的类型,可以是ARRAY_A(关联数组)、ARRAY_N(数字数组)或者OBJECT(对象)。$y指定第几行。

实例:

默认情况下,$output的值为OBJECT,那么用法如下:

$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10");
echo $mylink->link_id; // prints "10"

如果$output的值为ARRAY_A,那么用法如下:

 

$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10",ARRAY_A);
echo $mylink['link_id']; // prints "10"

如果$output的值为ARRAY_N,那么用法如下:

$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10",ARRAY_N);
echo $mylink[1]; // prints "10"

get_results函数

返回查询的结果集,允许以ARRAY_A、ARRAY_N或者OBJECT三种方式返回。

$fivesdrafts = $wpdb->get_results(
  "
  SELECT ID, post_title
  FROM $wpdb->posts
  WHERE post_status = 'draft'
    AND post_author = 5
  "
);
 
foreach ( $fivesdrafts as $fivesdraft )
{
  echo $fivesdraft->post_title;
}

使用事务

// 事务 - 开始
$wpdb->query("START TRANSACTION");


// 事务 - 提交
$wpdb->query("COMMIT");


// 事务 - 回滚
$wpdb->query("ROLLBACK");

例子:

try {
    $wpdb->query("START TRANSACTION");

    $order = [];
    $wpdb->insert( $wpdb->prefix.'rt_order', $order, ['%d']);
    if(!$wpdb->insert_id){
        throw new Exception("插入订单失败");
    }
    
    foreach($order_items_arr as $k=>$v){
        $v['order_id'] = $order_id;
        $wpdb->insert( $wpdb->prefix.'rt_order_item', $v, ['%d','%s','%d','%s','%d','%d'] );
    }
    
    $wpdb->query("COMMIT");
    return $response;
} catch (Exception $e) {
    echo 'Error message: ' .$e->getMessage();
    $wpdb->query("ROLLBACK");
}

其他

另外还有两个常量:SAVEQUERIES和WP_DEBUG。设置SAVEQUERIES常量为TRUE,可以把在里执行的所有查询及其停止时间保存到$this->queries这个数组中,以后调试的时候可以使用;而设置WP_DEBUG常量为TRUE,则可以输出错误。不过,这两个常量开关默认都没有打开,我们在测试的时候,可以在wp_config.php文件中将其开启。

官方文档:https://developer.wordpress.org/reference/classes/wpdb

收藏
评论
打赏
文档教程
WordPress 简介
2024-05-03
WordPress 主题开发
WordPress 语言文件
2024-05-04
飞翔的鱼丸
39406 阅读
82 发布
2 收藏
动态
FishV 主题 v1.21.0 发布
LandV 企业主题 v2.8.0 发布
MirageV 主题 v2.6.4 发布
FishV 主题 v1.14 发布
MirageV 主题 v2.5 正式发布
BotV 插件 v1.7.0 发布
LandV 企业主题 v2.6.0 发布
MirageV 主题 v2.6.0 发布
生成中...
真诚赞赏,手留余香
登录
注册
重置密码