Wordpress准备了LIKE查询

时间:2015-08-04 13:07:16

标签: php mysql wordpress wpdb

我正在尝试在Wordpress中使用准备好的LIKE查询,但它似乎不起作用。我已经遵循了codex的语法。

public function userByJobId($id){        
    global $wpdb;
    $result = $wpdb->get_row($wpdb->prepare( "SELECT * FROM use_users WHERE use_job_id LIKE = d%;", '%' . $wpdb->esc_like((int)$id)) . '%');

    if(!empty($result)){
       return $result;
    }
    return false;
}

调用方法如下:

$userid = 1
$user = new Users();
$user_id = $user->userByJobId($userid);

看不出问题出在哪里..

2 个答案:

答案 0 :(得分:2)

已经提出了几点:

  • prepare()的语法与sprintf的语法相同;小数占位符为%d,而非d%
  • LIKE关键字不应该跟一个等号,只是要测试的表达式

其他一些事情:

  • LIKE的右括号之后连接% prepare()通配符,它​​应该在之前连接在一起
  • get_row()默认返回一个对象,而不仅仅是ID,这是返回对象的属性
public function userByJobId($id){        
    global $wpdb;
    $result = $wpdb->get_row(
        $wpdb->prepare(
            "SELECT * FROM {$wpdb->prefix}users WHERE {$wpdb->prefix}job_id LIKE %d;",
            '%' . $wpdb->esc_like((int)$id)  . '%'
        )
    );

    if($result){
       return $result->ID;
    }
    return false;
}

答案 1 :(得分:1)

wordpress class reference告诉我:

  

可能的格式值:%s为字符串; %d为整数(整数);   和%f为浮动。

如果您想使用相似的比较准备查询,则应double escape percentages

所以改变

$result = $wpdb->get_row($wpdb->prepare( "SELECT * FROM use_users WHERE use_job_id LIKE = d%;", '%' . $wpdb->esc_like((int)$id)) . '%');

$result = $wpdb->get_row($wpdb->prepare( "SELECT * FROM use_users WHERE use_job_id LIKE %%%d%%;",(int)$id));

您也不必转义值(prepare方法会为您执行此操作)。

警告:未经测试的代码