如何用wpdb返回类似PDO::FETCH_ASSOC格式的查询结果?
用wpdb实现类似PDO::FETCH_ASSOC的查询结果
wpdb提供了明确的参数来控制返回结果的格式,对应PDO::FETCH_ASSOC的场景分两种情况处理:
1. 获取单条记录(对应PDO的fetch(PDO::FETCH_ASSOC))
使用$wpdb->get_row()方法,第二个参数传入ARRAY_A,直接返回单条关联数组:
function find_user_by_username(string $email) { global $wpdb; // 用%s占位符做安全转义,避免SQL注入 $user = $wpdb->get_row( $wpdb->prepare("SELECT user_email, password, active, email FROM wp_users WHERE user_email = %s", $email), ARRAY_A ); return $user; // 返回关联数组,和PDO::FETCH_ASSOC结果格式一致 }
2. 获取多条记录(对应PDO的fetchAll(PDO::FETCH_ASSOC))
使用$wpdb->get_results()方法,第二个参数传入ARRAY_A,返回关联数组的集合:
function get_inactive_users() { global $wpdb; $users = $wpdb->get_results( "SELECT ID, user_email FROM wp_users WHERE active = 0", ARRAY_A ); return $users; // 每个元素都是关联数组的数组 }
修正你原有的expired_code函数
你的问题在于用get_results()默认返回对象数组,却用数组索引$user['expired']访问,导致错误。改成get_row(..., ARRAY_A)即可:
function expired_code($ID, $email){ global $wpdb; // 用prepare安全处理参数,指定ARRAY_A返回关联数组 $user = $wpdb->get_row( $wpdb->prepare("SELECT ID, activation_code, activation_expiry < now() as expired FROM wp_users_infor WHERE active = 0 AND ID = %d", $ID), ARRAY_A ); if ($user) { if ((int)$user['expired'] === 1) { // 过期逻辑处理 } } }
关于你用foreach的示例
如果是查询单条记录(比如按唯一的user_email查询),直接用get_row(ARRAY_A)更高效,没必要用foreach。如果是多条记录需要遍历,用get_results(ARRAY_A)得到关联数组集合后,再遍历是可行的:
function get_multiple_users(string $role) { global $wpdb; $users = $wpdb->get_results( $wpdb->prepare("SELECT user_email, display_name FROM wp_users WHERE user_role = %s", $role), ARRAY_A ); foreach ($users as $user) { // 处理每个关联数组形式的用户数据 echo $user['user_email']; } return $users; }
关键说明
ARRAY_A:wpdb内置常量,指定返回关联数组,键为数据库字段名$wpdb->prepare():必须用来处理用户输入参数,防止SQL注入,你的原代码直接把$ID传入get_results是不安全的,一定要用prepare转义get_row():适合查询唯一记录(比如按ID、唯一邮箱),返回单条数据;get_results()适合查询多条记录,返回数组集合
内容的提问来源于stack exchange,提问作者ryuunosuke.7003a
相关产品推荐
相关产品推荐

