Вы можете вызвать $wpdb->prepare
частичных запросов:
$user_query = $wpdb->prepare('AND query1 LIKE %s', $query1);
Вы также можете позвонить esc_sql
непосредственно на входе пользователя в дезинфицировать его.
Кроме того, LIKE выражение должно быть экранировано отдельно:
https://codex.wordpress.org/Class_Reference/wpdb/esc_like
$wpdb->esc_like
ускользает характер конкретного нравится выражение (%, \, _), но не делает никакого дополнительного вытекания. Вам все равно нужно позвонить prepare
или esc_sql
после выхода из аналогичного выражения.
Update: Используя этот пример из комментариев:
$user_query = $_GET['query1'];
$user_query2 = $_GET['query2'];
$user = $wpdb->prepare('AND query1 = %s ', $user_query);
$user2 = $wpdb->prepare('AND query2 = %s ', $user_query2);
$results = $wpdb->get_results($wpdb->prepare('SELECT * FROM test WHERE price != 0' . $user . $user2 . 'LIMIT 20'));
Здесь нет никакой точки для построения запроса в части, вы можете просто создать свой запрос, как это:
$query = 'SELECT * FROM test
WHERE price != 0
AND query1 = %s
AND query1 = %s
LIMIT 20';
$results = $wpdb->get_results($wpdb->prepare($query, $user_query, $user_query2));
Например, я предполагаю, что пользовательские запросы являются необязательными. Если это так, то вам нужно подготовить, где условия по отдельности, только если параметр предусмотрен:
$query = 'SELECT * FROM test
WHERE price != 0';
if($user_query) {
$cond = $wpdb->prepare(' AND query1 = %s', $user_query);
$query .= $cond;
}
if($user_query2) {
$cond = $wpdb->prepare(' AND query2 = %s', $user_query2);
$query .= $cond;
}
$query .= ' LIMIT 20';
$results = $wpdb->get_results($query);
Обратите внимание, что нет никакой необходимости позвонить подготовить по запросу при прохождении его get_results
, как все вводимые пользователем имеет уже подверглись санитарной обработке.
Hi mtinsley, спасибо за ответ. Таким образом, вы бы просто построили такой запрос, как (с использованием значений пользовательской формы и т. Д.): $ user = $ wpdb-> prepare ('field1 =% s', '123'); \t \t $ Результаты = $ wpdb-> get_results ( \t \t \t $ wpdb-> подготовить ('SELECT * FROM тест, где' $ пользователя) \t \t.); Означает ли это, верно? – user2391468
В этом конкретном случае это не похоже на то, что есть смысл строить ваш запрос по частям, но это должно сработать. Если вы разместите больше своего кода, я могу дать вам более полный ответ относительно правильного подхода к дезинфекции ваших параметров. –
Спасибо mtinsley, вы сожалеете, что это был немного дрянной пример. Код, над которым я работал, находится на моем рабочем компьютере. Идея состоит в том, что мне просто нужно добавить частичные запросы к основному запросу, если присутствуют значения $ _GET. Например: \t $ user_query = isset ($ _ GET ['query1']); \t \t $ user_query2 = isset ($ _ GET ['query2']); $ user = $ wpdb-> prepare ('AND query1 =% s', $ user_query); \t \t $ user2 = $ wpdb-> prepare ('AND query2 =% s', $ user_query2); \t \t $ Результаты = $ wpdb-> get_results ( \t \t \t $ wpdb-> подготовить ('SELECT * FROM тест, где цена! = 0'. $ Пользователя. $ User2. LIMIT 20 ') \t \t); Это то, как вы его построили? – user2391468