有没有(更好的)方法访问$wpdb结果?

时间:2019-04-16 作者:TTT

我有这个:

    global $wpdb;
    $wpdbp = $wpdb->prepare(\'SELECT EXISTS ([some query] WHERE user_id =%d);\',$target_user_id);
    $result = $wpdb->get_results($wpdbp);
我想知道查询结果是1还是0。但是$result的var\\u dump()给出如下结果:

array (size=1)
  0 => 
    object(stdClass)[4592]
      public \'EXISTS ([some query] WHERE user_id =2)\' => string \'0\' (length=1)
这意味着我应该首先获取数组的元素0,然后,我需要访问一个属性,该属性的名称实际上就是整个查询。

我还需要测试这在php中是否可行(我想是的,但在这种语言中我记不清了),如果我有多行查询,会发生什么。。。不管怎样,我觉得那很难看。。。是否有一种干净的方法来获取查询结果?也许有一种方法可以为查询提供一个名称字符串,或者其他什么?

这就是我正在尝试的,但这根本不起作用。。。

$qeryAsPropertyName = substr($wpdbp,7, -strlen($wpdbp-1));
$result0 = $result[0]->$qeryAsPropertyName;

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

这个答案解释了OP对列名的看法以及如何使用列名,但真正的答案是使用get_var() 如中所示Howdy_McGee\'s answer.

您看到的字符串是MySQL用于结果的列名,因为它没有更好的想法。一种方法是给它一个显式的名称来代替AS, e、 g。

global $wpdb;
$wpdbp = $wpdb->prepare(\'SELECT EXISTS ([some query] WHERE user_id =%d) AS `exists`;\',
                        $target_user_id);
$result = $wpdb->get_results($wpdbp);
然后列名称将为exists, i、 e。

$result = $result[0][\'exists\'];
然而,我很惊讶在中没有“执行查询并返回标量”方法$wpdb 您可以使用它来获取这样的单个结果 有一种更好的方法,但我在搜索“标量”之类的术语时错过了它,呸。

SO网友:Howdy_McGee

The WPDB Class 有很多方法,这些方法会改变返回的内容。

使用WPDB::get_results() 返回一个对象数组,这些对象的属性最终是它期望返回的属性。在这种情况下,最好将子查询别名化。例如,如果我想检查用户ID 1是否存在,我可以说:

$results = $wpdb->get_results( "SELECT EXISTS( SELECT ID FROM {$wpdb->users} WHERE ID = 1 ) AS \'exists\'" );

if( ! empty( $results ) && $results[0]->exists ) {
    /* ... */
}
更好的解决方案是,如果您只想退回一件东西,您可以使用WPDB::get_var()

$exists = $wpdb->get_var( $wpdb->prepare( "
    SELECT EXISTS ( [some query] WHERE user_id = %d )
", $user_id ) );

if( $exists ) {
    /* ... */
}
或者,如果您想按ID输入用户名:

$username = $wpdb->get_var( $wpdb->prepare( "
    SELECT user_login FROM {$wpdb->users} WHERE ID = %d
", $user_id ) );

if( ! empty( $username ) ) {
    printf( \'User %d user name is: %s\', $user_id, $username );
}
也就是说,您最好阅读文档并查看可用的方法,以找出哪种方法最适合您的用户:

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

相关推荐

使用纯SQL查询按类别获取帖子

我有一个meeting post类型,其标题自动设置为表单的日期m/d/Y. 我有一个下面的查询,通过在最后一个之后选择不同的值,从帖子标题中获取所有唯一的年份/ 在帖子标题内。SELECT DISTINCT substr(post_title, - instr(reverse(post_title), \'/\') + 1) AS year FROM {$wpdb->posts} WHERE post_status = \'publish\' AND post_type =