【问题标题】:Updating SQL query from single column single value LIKE to multiple columns single value search将 SQL 查询从单列单值 LIKE 更新为多列单值搜索
【发布时间】:2019-08-06 21:55:39
【问题描述】:

我使用以下方法在一列中搜索一个值。

/**
     * @param array $searchArray
     * @return array
     */
    private static function returnPetSearchResults(array $searchArray): array
    {
        global $wpdb;
        $qry = "SELECT ID 
               FROM {$wpdb->pets} 
               WHERE softDelete = 0 
               AND isAdopted = 0";
        $parameters = [];

        if ($searchArray['status'] !== '') {
            $qry .= " AND status = %d";
            $parameters[] = $searchArray['status'];
        }
        if ($searchArray['type']) {
            $qry .= " AND type = %d";
            $parameters[] = $searchArray['type'];
        }
        if ($searchArray['size']) {
            $qry .= " AND size = %d";
            $parameters[] = $searchArray['size'];
        }
        if ($searchArray['keyword']) {
            $qry .= " AND name LIKE %s";
            $parameters[] = '%'.$searchArray['keyword'].'%';
        }
        if ($searchArray['startDate']) {
            $date = date('Y-m-d', strtotime($searchArray['startDate']));
            $qry .= " AND dateEntered > %s";
            $parameters[] = $date;
        }
        if ($searchArray['quarantineStatus'] != '') {
            $qry .= " AND quarantineStatus = %d";
            $parameters[] = $searchArray['quarantineStatus'];
        }
        if ($searchArray['kennel'] != '') {
            $qry .= " AND kennel = %s";
            $parameters[] = $searchArray['kennel'];
        }
        if ($searchArray['domain']) {
            $qry .= " AND domain = %s";
            $parameters[] = $searchArray['domain'];
        }

        $qry .= " ORDER BY ID DESC";

        $sql = $wpdb->prepare($qry, $parameters);
        return $wpdb->get_results($sql,OBJECT);
    }

现在我想扩展为跨多个列搜索单个值。我在网上搜索过,您可以看到我尝试过的几个注释掉的示例。

/**
     * @param array $searchArray
     * @return array
     */
    private static function returnPetSearchResults(array $searchArray): array
    {
        global $wpdb;
        $qry = "SELECT ID 
               FROM {$wpdb->pets} 
               WHERE softDelete = 0 
               AND isAdopted = 0";
        $parameters = [];

        if ($searchArray['status'] !== '') {
            $qry .= " AND status = %d";
            $parameters[] = $searchArray['status'];
        }
        if ($searchArray['type']) {
            $qry .= " AND type = %d";
            $parameters[] = $searchArray['type'];
        }
        if ($searchArray['size']) {
            $qry .= " AND size = %d";
            $parameters[] = $searchArray['size'];
        }
        if ($searchArray['keyword']) {
            $qry .= " AND name LIKE %s";
            $parameters[] = '%'.$searchArray['keyword'].'%';
        }
//        if ($searchArray['keyword']) {
//            $qry .= " WHERE name LIKE %s AND previousOwner LIKE %s";
//            $parameters[] = '%'.$searchArray['keyword'].'%';
//        }
//        if ($searchArray['keyword']) {
//            $qry .= " WHERE name = %s OR previousOwner = %s";
//            $parameters[] = '%'.$searchArray['keyword'].'%';
//        }
        if ($searchArray['startDate']) {
            $date = date('Y-m-d', strtotime($searchArray['startDate']));
            $qry .= " AND dateEntered > %s";
            $parameters[] = $date;
        }
        if ($searchArray['quarantineStatus'] != '') {
            $qry .= " AND quarantineStatus = %d";
            $parameters[] = $searchArray['quarantineStatus'];
        }
        if ($searchArray['kennel'] != '') {
            $qry .= " AND kennel = %s";
            $parameters[] = $searchArray['kennel'];
        }
        if ($searchArray['domain']) {
            $qry .= " AND domain = %s";
            $parameters[] = $searchArray['domain'];
        }

        $qry .= " ORDER BY ID DESC";

        $sql = $wpdb->prepare($qry, $parameters);
        return $wpdb->get_results($sql,OBJECT);
    }

在多列中有效地搜索单个字符串值时我缺少什么?

【问题讨论】:

  • 不知道为什么,但是当我使用你的建议时,sql 查询没有返回任何结果
  • 我不需要将多个变量绑定到parameters 数组吗?
  • 你能提供一个带有多个参数的官方答案吗?我没有在这里连接点,希望您的帮助。

标签: php sql wordpress


【解决方案1】:

你会的 - 绑定参数值 - 转义变量 - 传入逻辑以搜索字符串中的任何文本 - 更新您的查询以使用LIKE 而不是=

...

    if ($searchArray['keyword']) {
        $qry .= " AND 
                (name LIKE %s 
                OR previousOwner LIKE %s 
                OR intakeNotes LIKE %s 
                OR previousOwnerStreetAddress LIKE %s
                OR previousOwnerCity LIKE %s
                OR previousOwnerPhone LIKE %s
                OR previousOwnerEmail LIKE %s
                OR traits LIKE %s
                OR dogBreed LIKE %s
                OR catBreed LIKE %s)";
        $parameters[] =  '%'.$wpdb->esc_like($searchArray['keyword']).'%';
        $parameters[] =  '%'.$wpdb->esc_like($searchArray['keyword']).'%';
        $parameters[] =  '%'.$wpdb->esc_like($searchArray['keyword']).'%';
        $parameters[] =  '%'.$wpdb->esc_like($searchArray['keyword']).'%';
        $parameters[] =  '%'.$wpdb->esc_like($searchArray['keyword']).'%';
        $parameters[] =  '%'.$wpdb->esc_like($searchArray['keyword']).'%';
        $parameters[] =  '%'.$wpdb->esc_like($searchArray['keyword']).'%';
        $parameters[] =  '%'.$wpdb->esc_like($searchArray['keyword']).'%';
        $parameters[] =  '%'.$wpdb->esc_like($searchArray['keyword']).'%';
        $parameters[] =  '%'.$wpdb->esc_like($searchArray['keyword']).'%';
     }
...

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    相关资源
    最近更新 更多