Wordpress wpdp-> getResults не выполняет мой sql, когда строка SQL имеет значение «% f» - PullRequest
0 голосов
/ 17 ноября 2018

Вот мой код при выполнении запроса.Я показываю SQL-запрос перед выполнением, и последний был выполнен.

public static function getProductByUser($user_id, $page, $containName, $sort, $filterOptions)
{
    global $wpdb;
    $limit = 40;
    $offset = ($page - 1) * $limit;
    $querySort = self::buildSortQuery($sort);
    $pidi_db = new DatabaseApi();
    $filterQuery = "";
    if ($filterOptions) {
        $filterQuery = self::buildFilterQuery($filterOptions);
    }
    $sql = "SELECT hp.*, CASE WHEN pf.product_id IS NULL THEN false ELSE true  END as favorite
    FROM {$pidi_db->{UserDomain::$table_name}} ud JOIN {$pidi_db->{self::$table_name}} hp ON ud.domain_name = hp.domain
    LEFT JOIN {$pidi_db->{HotProductFavorite::$table_name}} pf ON pf.product_id = hp.product_id 
    WHERE ud.user_id = %d AND hp.title LIKE %s" . $filterQuery . " GROUP BY hp.product_id " . $querySort . " LIMIT %d OFFSET %d ";


    $query = $wpdb->prepare($sql, $user_id, "%" . $containName . "%", $limit, $offset);

     print_r($sql);
     print_r("\n");

     $wpdb->get_results($query);
     print_r($wpdb->last_query);
     die;

}

Когда окончательная строка sql возвращается таким образом.Запрос был выполнен:

=== Sql after prepare ====
SELECT hp.*, CASE WHEN pf.product_id IS NULL THEN false ELSE true  END as favorite
    FROM wp_pidi_user_domain ud JOIN wp_pidi_hot_product_tracking hp ON ud.domain_name = hp.domain
    LEFT JOIN wp_pidi_hot_product_favorite pf ON pf.product_id = hp.product_id 
    WHERE ud.user_id = %d AND hp.title LIKE %s AND hp.domain LIKE '%asadas%' GROUP BY hp.product_id ORDER BY hp.published_at DESC LIMIT %d OFFSET %d 
 === SQL was executed ===
SELECT hp.*, CASE WHEN pf.product_id IS NULL THEN false ELSE true  END as favorite
    FROM wp_pidi_user_domain ud JOIN wp_pidi_hot_product_tracking hp ON ud.domain_name = hp.domain
    LEFT JOIN wp_pidi_hot_product_favorite pf ON pf.product_id = hp.product_id 
    WHERE ud.user_id = 1 AND hp.title LIKE '%%' AND hp.domain LIKE '%asadas%' GROUP BY hp.product_id ORDER BY hp.published_at DESC LIMIT 40 OFFSET 0 

Похоже, wpdp выполнил мой запрос.Но когда итоговая строка SQL возвращается, как это, wpdp не выполнил мой запрос и не показывает никакой ошибки в файле журнала.Я думаю, что для предотвращения инъекции функция отклонила мой запрос.

=== sql after prepare ===
SELECT hp.*, CASE WHEN pf.product_id IS NULL THEN false ELSE true  END as favorite
    FROM wp_pidi_user_domain ud JOIN wp_pidi_hot_product_tracking hp ON ud.domain_name = hp.domain
    LEFT JOIN wp_pidi_hot_product_favorite pf ON pf.product_id = hp.product_id 
    WHERE ud.user_id = %d AND hp.title LIKE %s AND hp.title LIKE '%fairy%' GROUP BY hp.product_id ORDER BY hp.published_at DESC LIMIT %d OFFSET %d 
=== lastest sql was executed ===
SELECT * FROM wp_pidi_filter_options WHERE `user_id`=1 AND `screen_id`=1

Это предыдущий sql, выполненный не sql после подготовки.

Может кто-нибудь помочь мне?Спасибо!

1 Ответ

0 голосов
/ 17 ноября 2018

Мое решение: Функция buildFilterQuery () всегда будет возвращать такую ​​строку, улучшая мой ответ, если у вас есть лучшее решение!:

"AND hp.title LIKE '¥REGEX¥Fairy¥REGEX¥' "

И после подготовки: $query = $wpdb->prepare($sql,$arg); Я заменяю заполнитель REGEX:

   $newFilterQuery = str_replace(self::$REGEX, '%', $query);
   return $wpdb->get_results($newFilterQuery);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...