2015-04-07 2 views
1

В настоящее время я использую пользовательскую таблицу wordpress для хранения внешнего корня xml, и эта информация должна быть отфильтрована базовой формой html с несколькими параметрами.Wordpress wpdb-> подготовить sql-строку из формы

Каков наилучший способ сделать это и построить строку, используя wpdb->prepare? Я использую ниже мою пагинацию и $ USER_QUERY в настоящее время устанавливается в $user_query .= "AND QUERY1 LIKE $query1 "; и т.д.

Однако я чувствую, что это может привести к проблемам, как я не буду делать это через второй параметр, такие как %d, $variable и т.д.

//Get Results 
$results = $wpdb->get_results(
    $wpdb->prepare("SELECT * FROM `feed` WHERE `price` != 0 $user_query LIMIT %d, 
     %d", $offset, $items_per_page, OBJECT) 
); 

Я надеюсь, что выше имеет смысл. Я просто пытаюсь построить SQL-запрос из значений формы $_GET без проблем SQL-инъекций.

Большое спасибо

ответ

2

Вы можете вызвать $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, как все вводимые пользователем имеет уже подверглись санитарной обработке.

+0

Hi mtinsley, спасибо за ответ. Таким образом, вы бы просто построили такой запрос, как (с использованием значений пользовательской формы и т. Д.): $ user = $ wpdb-> prepare ('field1 =% s', '123'); \t \t $ Результаты = $ wpdb-> get_results ( \t \t \t $ wpdb-> подготовить ('SELECT * FROM тест, где' $ пользователя) \t \t.); Означает ли это, верно? – user2391468

+0

В этом конкретном случае это не похоже на то, что есть смысл строить ваш запрос по частям, но это должно сработать. Если вы разместите больше своего кода, я могу дать вам более полный ответ относительно правильного подхода к дезинфекции ваших параметров. –

+0

Спасибо 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