2013-04-17 4 views
0

У меня есть код PHP с запросом:Как выбрать все, где условие равно null?

$query = "SELECT * FROM TDdb WHERE status = $status AND occupation =$occupation"; 

Я посылаю статус ценности и занятия с клиентским приложением к этому PHP код. Это работает, когда я отправляю статус и должность. Но я хочу, чтобы он возвращал строки, если я просто отправляю статус, но не занятие (я имею в виду, независимо от того, что такое занятие).

есть ли у кого-нибудь предложения? Буду признателен за любую помощь.

PS: Я хочу сделать это без, если заявление и просто, но изменив запрос

+0

Это кажется достаточно слишком легко перепутать человек – samayo

+0

что вы имеете в виду «без если заявления» и как вы предполагаете изменить запрос без него? – cernunnos

+1

обязательное предупреждение о внедрении SQL: http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php – Alkini

ответ

1

Лично я хотел бы создать базовый запрос и добавить условия, где у вас есть, например, так:

$sql = 'SELECT * FROM TDdb'; 
$conditions = array(); 
$args = array(); 

if ($action) { 
    $conditions[] = 'status = :status'; 
    $args[':status'] = $status; 
} 

if ($occupation) { 
    $conditions[] = 'occupation = :occupation'; 
    $args[':occupation'] = $occupation; 
} 

if ($conditions) { 
    $sql .= ' WHERE ' . join(' AND ', $conditions); 
} 

$stmt = $db->prepare($sql); 
$stmt->execute($args); 
+0

thanks jack. твоя идея очень помогла. наконец, я создал что-то вроде этого: – Alex

+0

$ query = 'SELECT * FROM TDdb'; if ($ status) { $ query = $ query. "WHERE status = '". $ Status. "'"; } if ($ оккупация) { $ query = $ query. "И занятие = '". $ Occupation. "'"; } – Alex

+0

@ user2108800 Это не сработает, если определено '$ occupation', но не' $ status'. –

0

Это будет работать, если вы передадите профессию или значение NULL.

SELECT * 
FROM TDdb 
WHERE status = $status 
     AND ($occupation IS NULL OR occupation = $occupation) 
+0

, который не будет работать, если $ -зависимость равна NULL, тогда ваш запрос будет выглядеть так: '... WHERE status = X AND (IS NULL OR occupation =)', вам нужно добавить котировки –

+0

Если значение передано как NULL это будет работать. Если значение передается как пустая строка, вам понадобятся кавычки. – Tom

+0

как '$ occupation = NULL;', так и '$ occupation =" "' не будут работать, '$ occupation =" NULL ";' будет работать, но не будет ожидаемого поведения. –

0
"SELECT * FROM TDdb WHERE status = '$status' AND (occupation = '$occupation' OR occupation IS NULL)"; 
0

Помимо решения представленной @tom и @Damien Легро, вы можете создайте две строки запроса с оккупацией и одну без занятия. Что-то вроде:

$query = "SELECT * FROM TDdb WHERE status = $status"; 
if ($occupation != "") { 
    /*When you have value for occupation*/ 
    $query .= " AND occupation =$occupation"; 
} 

Так что в этом случае данные будут возвращены, если у вас есть только поле статуса. Во-вторых, проверьте, являются ли поля статуса и поля в таблице varchar, тогда вы должны заключить их в одинарные кавычки (').

1

Похоже, у вас есть несколько хороших вариантов того, как это сделать в SQL, или как сделать строковую переменную SQL в PHP.

Одна из причин рассмотреть возможность использования «if» в PHP-коде для производительности доступа к базе данных.

Когда вы вводите условие «или», подобное этому в SQL, вы не получите доступ к индексу. База данных намного сложнее определить, какой путь она должна принять, чем для PHP-кода, потому что SQL-движок оптимизирует запрос, не зная, что переменная будет разрешена при выполнении.

Вы уже знаете в PHP, какую версию запроса вы действительно хотите. Это будет лучше, если вы сделаете такой выбор.

0

Спасибо всем за помощь. специально гнездо. наконец я создал свой запрос следующим образом:

$query = 'SELECT * FROM TDdb'; 

if ($status) { 
    $query = $query." WHERE status = '".$status."'"; 
} 

if ($occupation) { 
    $query = $query." AND occupation = '".$occupation."'"; 
} 
Смежные вопросы