2013-09-23 2 views
0

Пустой результат запроса в PHP (wordpress), но когда я запускаю SQL-запрос из PHPMyAdmin, он работает! А вот часть кода, которая возвращает пустой массивПустой результат запроса в PHP, но когда я запускаю SQL-запрос из PHPMyAdmin, он работает

<?php 
global $wpdb; 
$from = $_POST['amount']; 
$to = $_POST['amount1']; 

$query = "SELECT post_content 
FROM `wp_postmeta` 
INNER JOIN `wp_posts` ON wp_posts.ID = wp_postmeta.post_id 
WHERE meta_key = 'product_price' 
AND meta_value > '$from' 
AND meta_value < '$to'"; 

$results = $wpdb->get_results($query);; 
var_dump($results); // empty array 
?> 

Любой человек может объяснить мою проблему? Благодаря !

+1

Вы проверили, содержат ли ваши поля сообщения допустимые значения? Я бы предложил повторить этот точный запрос и посмотреть, что произойдет, если вы вставьте его в mysql. – schoash

+0

В каком файле вы используете этот код? –

+0

echo 'mysql_error' для вашего запроса? Если я не ошибаюсь в wordpress, вы можете сделать что-то вроде '$ wpdb-> print_error();' – Maz

ответ

-1

Убедитесь $from и $to имеют числовые значения.

А затем просто удалите одинарные кавычки из SQL-запроса.

+0

Это неправильно, хорошее решение - с подготовленными инструкциями или по крайней мере $ wpdb-> prepare(). Вы не можете НИКОГДА, НИКОГДА не доверяете своим входам. Всегда проверяйте данные. –

+0

Несомненно, сначала вы должны проверить их. Мое предположение заключалось в сравнении со строкой (вместо числа). –

1

Я считаю, что причиной этого является то, что ввод в предложения относительно столбца meta_value обрабатывается как строки. Вы должны рассматривать их как численные.

Посмотрите на функцию query_posts в Wordpress.

$args = array(
    'meta_query'=> array(
    array(
     'key' => 'product_price', 
     'compare' => '>', 
     'value' => $from, 
     'type' => 'numeric' 
    ), 
    array(
     'key' => 'product_price', 
     'compare' => '<', 
     'value' => $to, 
     'type' => 'numeric' 
    ) 
) 
    'posts_per_page' => 100 
)); 

query_posts($args); 

В качестве альтернативы, ваши входы считаются числами, а не строками. Удалите одинарные кавычки вокруг них в исходном запросе.

global $wpdb; 
$from = $_POST['amount']; 
$to = $_POST['amount1']; 

$query = "SELECT post_content 
FROM `wp_postmeta` 
INNER JOIN `wp_posts` ON wp_posts.ID = wp_postmeta.post_id 
WHERE meta_key = 'product_price' 
AND meta_value > $from 
AND meta_value < $to"; 

$results = $wpdb->get_results($query); 
var_dump($results); 

Я по-прежнему настоятельно рекомендую вам привыкнуть к дезинфекции вашего входа.

Дополнительным преимуществом первого решения является то, что функция query_posts автоматически дезинфицирует ваш вход на основе введенного типа ввода.

Ссылки:

+0

Зачем вам нужно вводить числа в виде поплавков? –

+0

Я делаю предположение, что поле meta_value является строкой, а не числовой. Я не на 100% разбираюсь со структурой таблиц Wordpress. Разумеется, при использовании числового оператора со строкой строка должна быть отлита в виде числа? – Seidr

+0

Но зачем вам это делать ВНУТРИ строки SQL?Это неудобно (и небезопасно) –

0

Я действительно забочусь о безопасности и всех ответах никто не беспокоился об этом, поэтому я добавляю лучшее решение для этого, потому что вы НИКОГДА не доверяете своим входам, которые вам всегда нужны, чтобы их проверить.

Ниже должно быть хорошее рабочее решение.

Также вы должны прочитать this и this.

<?php 
global $wpdb; 
$from = $_POST['amount']; 
$to = $_POST['amount1']; 

$query = "SELECT post_content 
FROM `wp_postmeta` 
INNER JOIN `wp_posts` ON wp_posts.ID = wp_postmeta.post_id 
WHERE meta_key = 'product_price' 
AND meta_value > %d 
AND meta_value < %d"; 

$results = $wpdb->get_results($wpdb->query($wpdb->prepare($query, $from, $to)); 
var_dump($results); 
?> 
Смежные вопросы