Вот мой код при выполнении запроса.Я показываю 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 после подготовки.
Может кто-нибудь помочь мне?Спасибо!