2014-02-01 2 views
-2

Как я могу выбрать между двумя или двумя из них? Я пытаюсь использовать этот скрипт, но он возвращает ошибку.MySQL выберите один, два или любой

if ($company == "ANY") { 
    $query_company = '*'; 
} 
elseif ($company == "AMD") { 
    $query_company = 'AMD'; 
} 
elseif ($company == "Intel") { 
    $query_company = 'Intel'; 
} 

$card_data = mysqli_query($con, 
    "SELECT * FROM builds 
    WHERE 
     approved = 'yes' 
     AND manufacturer = $query_company 
     AND build_price BETWEEN $price_min 
    AND $price_max 
    "); 

(я получаю $ компании из URL с GET) Любой способ заставить его работать? Благодарю.

+0

Используйте 'like' ключевое слово – George

+1

Вы пропускаете один' AND' в вашем 'WHERE' статье – kero

+0

Какая ошибка? Вместо прямого выполнения вашего SQL, эхо его на экран. Что он говорит? – user1032531

ответ

4

Это то, что вы хотите?

SELECT * 
FROM builds 
WHERE approved = 'yes' and 
     (manufacturer = $query_company or $query_company = '*') and 
     build_price BETWEEN $price_min AND $price_max; 

Я просто размещаю это как пример для вашей логики (чтобы избежать таких проблем, как SQL-инъекция). Тем не менее, я хотел бы предложить вам сделать два различных запросов в приложении:

SELECT * 
FROM builds 
WHERE approved = 'yes' and 
     manufacturer = $query_company and 
     build_price BETWEEN $price_min AND $price_max; 

и

SELECT * 
FROM builds 
WHERE approved = 'yes' and 
     build_price BETWEEN $price_min AND $price_max; 

Преимущество этого подхода состоит в том, что эти запросы могут воспользоваться индексами. Первый builds(manufacturer, approved, build_price) и второй builds(approved, build_price). Единственный запрос с or (или like) также не может быть оптимизирован.

EDIT:

Позвольте мне понятнее о втором варианте:

if ($company == "ANY") { 
    $sql = "SELECT * 
      FROM builds 
      WHERE approved = 'yes' and 
        build_price BETWEEN $price_min AND $price_max" 
} 
else { 
    $sql = "SELECT * 
      FROM builds 
      WHERE approved = 'yes' and 
        manufacturer LIKE '$query_company' and 
        build_price BETWEEN $price_min AND $price_max" 
} 

$card_data = mysqli_query($con, $sql); 

Это просто пример. Вы можете переназначить $ sql для большей части запроса, а затем просто добавить дополнительное предложение в оператор if. У этого подхода есть еще одно преимущество. Вы можете распечатать $sql после подстановки переменных, чтобы увидеть, как он выглядит.

При этом вы должны узнать, как переключиться на параметризованные запросы, чтобы предотвратить атаки SQL-инъекций.

1

Один из способов будет использовать оператор LIKE (Заметьте, что я заменил ваш * двухкомпонентной %):

if ($company == "ANY") { 
    $query_company = '*'; 
} 
elseif ($company == "AMD") { 
    $query_company = 'AMD'; 
} 
elseif ($company == "Intel") { 
    $query_company = 'Intel'; 
} 

$card_data = mysqli_query($con, 
"SELECT * FROM builds 
WHERE approved = 'yes' 
manufacturer LIKE '$query_company' 
and build_price BETWEEN $price_min 
AND $price_max"); 
Смежные вопросы